springmvc ModelAttribute 注释的学习

@ModelAttribute 注解可被应用在方法或方法参数上

  • 对方法使用@ModelAttribute注解######

注解在方法上的 @ModelAttribute 说明了方法的作用是用于添加一个或多个属性到model上。
这样的方法能接受与 @RequestMapping 注解相同的参数类型,只不过不能直接被映射到具体的请求上。
在同一个控制器中,注解了 @ModelAttribute 的方法实际上会在 @RequestMapping 方法之前被调用
在方法使用@ModelAttribute 方法的两种风格,详情示例代码如下:

public class Account implements Serializable {
   private static final long serialVersionUID = -3075041060818483817L;

   private String name;
   private Integer age;
   //  getter and setter
}
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/modelAtt")
public class ModeAttributeTest {
    /**
     * 方法-:
     * 方法通过返回值的方式默认地将添加一个属性
     *
     * 属性名没有被显式指定的时:框架将根据属性的类型给予一个默认名称
     *                  例如:本例返回一个 Account 类型的对象,则默认的属性名为"account"
     *                  你可以通过设置 @ModelAttribute 注解的值来改变默认值  @ModelAttribute("myAccount")
     * @param name
     * @return
     */
    @ModelAttribute
    public Account addAccount(@RequestParam(value = "name",defaultValue = "test")String name) {
        Account ac = new Account();

        ac.setName(name);
        ac.setAge(12);

        return ac;
    }
    /**
     * 方法二:
     *  方法接收一个 Model 对象,然后可以向其中添加任意数量的属性
     * @param number
     * @param model
     */
    @ModelAttribute
    public void populateModel(@RequestParam(value = "number",defaultValue = "123") String number, Model model) {
        model.addAttribute("number", number);
        model.addAttribute("other", "other");
    }

    @RequestMapping("/hello")
    public ModelAndView hello(){
        ModelAndView modelAndView = new ModelAndView("hello");

        return modelAndView;
    }
}

相关页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
账户名称:${account.name}<br/>
年龄:${account.age}<br/>
number:${number}<br/>
other:${other}<br/>
</body>
</html>

请求:http://localhost:8085/modelAtt/hello?name=zhangsan&number=123
@ModelAttribute 方法通常被用来填充一些公共需要的属性或数据,比如一个下拉列表所预设的几种状态,或者宠物的几种类型,或者去取得一个HTML表单渲染所需要的命令对象,比如 Account 等

注意
@ModelAttribute 注解也可以被用在 @RequestMapping 方法上。这种情况下, @RequestMapping 方法的返回值将会被解释为model的一个属性,而非一个视图名。此时视图名将以视图命名约定来方式来决议,与返回值为void的方法所采用的处理方法类似

以我的配置为例

<!-- 视图解析 -->
<bean id="jspViewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="order" value="2" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>
@Controller
@RequestMapping("/modelAtt")
public class ModeAttributeTest {
    @ModelAttribute("key")
    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }
}

此时在浏览器中请求/hello 时,会去找/WEB-INF/jsp/modelAtt/hello.jsp此页面,并可在页面中获取附带的数据${key}

  • 在方法参数上使用@ModelAttribute注解######

注解在方法参数上的 @ModelAttribute 说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。这在Spring MVC中被称为数据绑定,一个非常有用的特性,节约了你每次都需要手动从表格数据中转换这些字段数据的时间。

@RequestMapping("/hello")
public ModelAndView hello(@ModelAttribute Account account){
    account.setAge(12);
    account.setName("456");
    return new ModelAndView("hello");
}

上面的代码只是一种简单的使用方法
其实account的来源可由以下几种方式获得

  • 它可能因为 @SessionAttributes 注解的使用已经存在于model中
  • 它可能因为在同个控制器中使用了 @ModelAttribute 方法已经存在于model中
  • 它可能是由URI模板变量和类型转换中取得的
  • 它可能是调用了自身的默认构造器被实例化出来的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容