Spring MVC @ModelAttribute 详解_静静~嗯嗯的博客-程序员ITS203

技术标签: JAVA  ssh  

[email protected]注释void返回值的方法


@Controller
public class HelloModelController {
    
    @ModelAttribute 
    public void populateModel(@RequestParam String abc, Model model) {  
       model.addAttribute("attributeName", abc);  
    }  

    @RequestMapping(value = "/helloWorld")  
    public String helloWorld() {  
       return "helloWorld.jsp";  
    }  

}

在这个代码中,访问控制器方法helloWorld时,会首先调用populateModel方法,将页面参数abc(/helloWorld.ht?abc=text)放到model的attributeName属性中,在视图中可以直接访问。


jsp页面页面如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
</head>
<body>
<c:out value="${attributeName}"></c:out>
</body>
</html>


[email protected]注释返回具体类的方法


@Controller
public class Hello2ModelController {
    
    @ModelAttribute 
    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");
       return user;
    }  
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld() {  
       return "helloWorld.jsp";  
    }  
}


当用户请求 http://localhost:8080/test/helloWorld2.html时,首先访问populateModel方法,返回User对象,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。
这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。


jsp 中如下访问:

<c:out value="${user.account}"></c:out>


也可以指定属性名称
@Controller
public class Hello2ModelController {
    
    @ModelAttribute(value="myUser")
    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");
       return user;
    }  
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(Model map) {  
       return "helloWorld.jsp";  
    }  
}


jsp中如下访问:
<c:out value="${myUser.account}"></c:out>


对象合并:

@Controller
public class Hello2ModelController {
    
    @ModelAttribute
    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");
       return user;
    }  
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(User user) {
        user.setName("老王");
       return "helloWorld.jsp";  
    }  
}

 

对象合并指定对象名称:

@Controller
public class Hello2ModelController {
    
    @ModelAttribute("myUser")
    public User populateModel() {  
       User user=new User();
       user.setAccount("ray");
       return user;
    }  
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(@ModelAttribute("myUser") User user) {
        user.setName("老王");
       return "helloWorld.jsp";  
    }  
}

这样在jsp中可以使用如下方式访问


<c:out value="${myUser.name}"></c:out>
<c:out value="${myUser.account}"></c:out>


3.通过此特性控制权限.

我们可以在基类方法中控制写此注解,需要控制权限的控制器,继承控制器就可以了。


public class BaseController {
    
    @ModelAttribute
    public void populateModel() throws Exception {  
       SysUser user=ContextUtil.getCurrentUser();
       if(user.getAccount().equals("admin")){
           throw new Exception("没有权限");
       }
    }  
}


需要控制权限的类继承BaseController

@Controller
public class Hello2ModelController extends BaseController {
    
    @RequestMapping(value = "/helloWorld2")  
    public String helloWorld(@ModelAttribute("myUser") User user) {
        user.setName("老王");
       return "helloWorld.jsp";  
    }  
}


这样就可以控制权限了,当然控制权限的方法有很多,比如通过过滤器等。这里只是提供一种思路。


总结:


@ModelAttribute具有如下三个作用:

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用。其实@ModelAttribute此处对于供视图页面展示来说与model.addAttribute("attributeName", abc);功能类似。

public String test(@ModelAttribute("user") UserModel user) 

此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。


②暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)


大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,此时会暴露返回值到模型数据( 名字为user2 ) 中供视图展示使用

@ModelAttribute 注解的返回值会覆盖@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令对象



③暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hejingyuan6/article/details/49995987

智能推荐

旋转矩阵、欧拉角之间转换_小磊在路上的博客-程序员ITS203_旋转矩阵转欧拉角

MATLAB矩阵乘法从左到右依次相乘用R表示旋转矩阵。yaw pitch roll分别表示Z Y X轴的转角。q=[q0,q1,q2,q3]'表示单位四元数。

Why can't 32-bit Windows access 4GB of RAM_yxc135的博客-程序员ITS203

Reprint:http://www.pcworld.com/article/2013751/why-cant-32-bit-windows-access-4gb-of-ram.htmlEvery byte of RAM requires its own address, and the processor limits the length of those addresses. A

gauss100密码过期解决方法_长空~的博客-程序员ITS203_gauss100

解决方法:1.首先查看gauss100的端口1888的状态,是正常的。3.进入gauss100的bin目录下 cd /Gaudb/GaussDB100/app/bin/2.切换 db100 用户 su db1003.查看数据库状态 python zctl.py -t status4.停止:python zctl.py -t stop5.启动:python zctl.py -t start6.使用zsql连接数据库,默认用户及密码为sys/Changeme_1237.连接数据库

Python subprocess子进程模块生成新进程并获取其返回码_allway2的博客-程序员ITS203

Python subprocess子进程模块生成新进程并获取其返回码Python子进程模块提供了简单的功能,这些功能使我们可以生成新进程并获取其返回码。该模块是Python v2.4中引入的。在本课程中,我们将研究该subprocess模块可用的各种功能以及如何使用它们。Python子进程Python子进程模块是一个功能强大的工具,被引入以替换Python中存在的各种旧模块/函数,...

Elasticsearch【环境搭建 02】最新版 elasticsearch + kibana(7.15.0)安装、配置、启动(多个问题处理 + kibana仪表盘使用)_シ風的博客-程序员ITS203_kibana 7.15

本文的安装文件是 2021.09.23 最新发布的【elasticsearch-7.15.0-linux-x86_64.tar.gz】和【kibana-7.15.0-linux-x86_64.tar.gz】以下内容均以 7.15.0 版本进行说明。1 ElasticSearch1.1 环境elasticsearch 的运行依赖 JDK,支持的最低版本为 Java 8。Elasticsearch requires at least Java 8. Specifically as of this wr

常见的图像增强方法_咕里个咚的博客-程序员ITS203_图像增强

上一篇文章已经介绍了opencv和PIL怎么去读图和他们两者的区别,那它们两个还有啥别的能力吗,不能就只会读个图吧,当然不会,他们还可以对图像做一些处理。这些处理可以我统称为augmentation,高大上的一个单词吧,讲这么多其实只是为了深度学习做准备,augmentation可以增加样本的数量和复杂程度,提高模型的鲁棒性,我是这么理解的,所谓见多识广,计算机视觉也是这样的,只是它看到的东西和我们人类有点差异,是图片的高维特征,扯多了,扯多了,进入今天的图像augmentation吧!同样的,今天还是

随便推点

Python 爬取必应翻译_编译中的博客-程序员ITS203_python 必应翻译

封装爬取必应翻译功能import requestsdef transation(text): tunsXml = requests.get('https://cn.bing.com/translator/') if tunsXml.status_code != 200: raise Exception('') pos = tunsXml.text.f...

机器学习中的数学(7)——PCA的数学原理_Lavi_qq_2910138025的博客-程序员ITS203

前言PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。网上关于PCA的文章有很多,但是大多数只描述了PCA的分析过程,而没有讲述其中的原理。这篇文章的目的是介绍PCA的基本数学原理,帮助读者了解PCA的工作机制是什么。 当然我并不打算把文章写成纯

虚拟机(linux)中安装与配置Apache服务器_要努力c的博客-程序员ITS203_linux虚拟机配置apache

关于Apache服务器在linux虚拟机中的配置操作之前先关闭防火墙和selinux``虚拟机中apache的安装采用rpm命令安装#setenforce 0 ——禁掉selinux#iptables -F;iptables -X;iptables -Z;iptables-save ——禁掉防火墙#service network start ...

javaweb学习总结--Servlet开发(一)_tom0915的博客-程序员ITS203_熟悉servlet的开发。

一、Servlet简介  Servlet是sun公司提供的一门用于开发动态web资源的技术。  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:  1、编写一个Java类,实现servlet接口。  2、把开发好的Java类部署到web服务器中。  按照一种约定俗成的称呼习惯,通

ubuntu14.04 建立ftp服务器_fly 100%的博客-程序员ITS203_secure_chroot_dir

介绍了基于最新版本Ubuntu14的ftp服务器的搭建方法 ,以及登陆命令和一些注意要点,整个过程比较简单清楚,适合于局域网内部进行数据交换。完成整个过程对于ftp也算有一个基础的认识。

TX-LCN分布式事务框架源码解析(服务端-2-TxLcnInitializer初始化之TMRpcServer)_jackson陈的博客-程序员ITS203_lcncmdtype

上篇文章我们通过注解@EnableTransactionManagerServer了解了服务端的启动初始化流程。最重要的TxLcnInitializer#init我们在本篇文章详细说明先看下服务端实现了TxLcnInitializer接口的类有哪些一共有五个实现类分别是EnsureIdGenEngine类,用于处理和生成全局唯一idMysqlLoggerHelper类,用于记录...

推荐文章

热门文章

相关标签