Spring MVC 常用注解 Day7 2018-11-25

2. @Controller、@RequestMapping注解应用

2.5 Model 和ModelAndView

2.5.3 ModelAndView

既包含模型数据信息又包含视图信息

//将User对象添加到ModelAndView中
modelAndView.addObject(String attributeName, Object attributeValues);

//设置返回视图名称
modelAndView.setViewName(String viewName);
@Controller
public class UserModelAndViewTestController {
        //@ModelAttribute修饰的方法会优先login调用
        @ModelAttribute
        public void userModel(String loginName,String password
                              ,ModelAndView modelAndView) {
            //创建User对象存储jsp页面传入的参数
            User user = new User();
            user.setLoginName(loginName);
            user.setPassword(password);
            
            //将User对象添加到ModelAndView中
            modelAndView.addObject("user", user);
        }
        @RequestMapping(value="/login_modelAndView")
        public ModelAndView login(ModelAndView modelAndView) {
            //从ModelAndView的Model中取出之前存入的名为user的对象
            User user = (User) modelAndView.getModel().get("user");
            
            //设置user对象的userName属性
            user.setUserName("测试输出模型ModelAndView");
            //设置返回视图名称
            modelAndView.setViewName("requestMappingTest/loginResult");
            return modelAndView;
        }
}

3. 参数绑定注解

常用类型根据处理的request的不同内容部分可以分为四类:

  • 处理request body部分的注解:@RequestParam@RequestBody
  • 处理request uri部分的注解:@pathVariable
  • 处理request header部分的注解:@RequestHeader@CookieValue
  • 处理attribute类型的注解:@SessionAttributes@ModelAttribute

3.1 @RequestParam

  • @RequestParam支持的属性
属性 类型 说明
name String 指定请求头绑定的名称
value String name属性的别名
required boolean 指示参数是否必须绑定
defaultValue String 如果没有传递参数而使用的默认值
@Controller
@RequestMapping(value="/requestParamTest")//所有方法都映射为相对于类级别的请求
public class RequestParamTestController {
    //静态集合,代替数据库用来保存注册的用户信息
    private static List<User> userList;
    //初始化集合
    public RequestParamTestController() {
        super();
        userList = new ArrayList<User>();
    }
    
    //方法映射请求路径:http://localhost:8080/maven-springMVC/requestParamTest/register
    //本方法支持GET请求
    @RequestMapping(value="/register",method=RequestMethod.GET)
    public String registerForm() {
        //跳转到注册页面
        return "paramTest/registerForm";
    }
    //方法映射请求路径:http://localhost:8080/maven-springMVC/requestParamTest/register
    //本方法支持POST请求
    @RequestMapping(value="/register",method=RequestMethod.POST)
    public String register(@RequestParam("loginName") String loginName,//将请求参数loginName的值赋值给loginName
            @RequestParam("password") String password,
            @RequestParam("userName") String userName){
        User user = new User();
        user.setLoginName(loginName);
        user.setPassword(password);
        user.setUserName(userName);
        userList.add(user);
        //跳转到登录页面
        return "paramTest/loginForm";
    }
    //方法映射请求路径:http://localhost:8080/maven-springMVC/requestParamTest/login
    @RequestMapping(value="/login")
    public String login(@RequestParam("loginName") String loginName,//将请求参数loginName的值赋值给loginName
            @RequestParam("password") String password,Model model) {
        //从集合中查找用户是否存在,用来模拟数据库验证
        for(User user :userList) {
            if(user.getLoginName().equals(loginName)&&
                    user.getPassword().equals(password)) {
                model.addAttribute("user", user);
                return "paramTest/welcome";
            }   
        }
        return "paramTest/loginForm";
    }

3.2 @pathVariable

@pathVariable只支持一个属性value,类型为String,表示绑定的名称,省略则默认绑定同名参数

@RequestMapping(value="/pathVariableTest/{userId}")
public String pathVariableTest(@RequestParam("userId") String userId) 
//请求url:http://localhost:8080/maven-springMVC/pathVariableTest/user01
//userId=user01

3.3 @RequestHeader

用于将请求头信息区书记映射到功能处理方法的参数上。

  • @RequestHeader注解支持的属性
属性 类型 说明
name String 指定请求头绑定的名称
value String name属性的别名
required boolean 指示参数是否必须绑定
defaultValue String 如果没有传递参数而使用的默认值
@RequestMapping(value="/requestHeaderTest")
public String requestHeaderTest(@RequestHeader("User-Agent") String userAgent,
                @RequestHeader(value="Accept") String[] accepts) 
//以上配置自动将请求头"User-Agent"的值赋值到userAgent变量上,将"Accept"请求头的值赋到accepts上

3.4 @CookieValue

  • @CookieValue注解支持的属性
属性 类型 说明
name String 指定请求头绑定的名称
value String name属性的别名
required boolean 指示参数是否必须绑定
defaultValue String 如果没有传递参数而使用的默认值
@RequestMapping(value="/cookieValueTest")
public String cookieValueTest(
@CookieValue(value="JSESSIONID",defaultValue="") String sessionId)
//以上配置自动将JSESSIONID的值赋值到sessionId变量上,defaultValue表示Cookie中没有JSESSIONID时默认为空

3.5 @SessionAttributes

@SessionAttributes注解允许指定Model中的哪些对象属性需要转存到HttpSession对象中

  • @SessionAttributes注解只能声明在类上,不能声明在方法上

  • @SessionAttributes注解支持的属性

属性 类型 说明
names String[] Model中的属性名称,即存到HttpSession当中的属性名称
value String names属性的别名
types Class<?>[] 指示参数是否必须绑定
@Controller
@RequestMapping(value="/sessionAttributesTest")
@SessionAttributes("user")//将Model属性中user的属性放入HttpSession对象当中
public class SessionAttributesTest {
    
    //方法映射请求路径:http://localhost:8080/maven-springMVC/sessionAttributesTest/loginForm
    @RequestMapping(value="/{formName}")
    public String registerForm(@PathVariable String formName) {
        //跳转页面
        return "paramTest/"+formName;
    }
    //方法映射请求路径:http://localhost:8080/maven-springMVC/sessionAttributesTest/login
    @RequestMapping(value="/login")
    public String login(@RequestParam("loginName") String loginName,
            @RequestParam("password") String password,Model model) {
        User user = new User();
        user.setLoginName(loginName);
        user.setPassword(password);
        user.setUserName("测试sessionAttributesTest");
        model.addAttribute(user);
        return "paramTest/welcome";
    }
}
  • 其他写法
@SessionAttributes(types= {User.class},value="user")
@SessionAttributes(types= {User.class,Dept.class},value={"user","dept"})

3.5 @ModelAttribute

  • @ModelAttribute将参数绑定到Model对象

  • 只支持一个属性value,类型为String,表示绑定的名称。

  • @ModelAttribute注释的的方法会在Controller每个方法执行之前被执行,因此,一个Controller映射多个URL时,要谨慎。

3.5.1 @ModelAttribute(value="")注释返回具体类的方法
  • controller
@Controller
@RequestMapping(value="/modelAttr")
public class ModelAttribute1Controller {
    //使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性的值就是方法的返回值
    @ModelAttribute("loginName")
    public String UserModel1(@RequestParam("loginName") String loginName) {
        return loginName;
    }
    
    
    //该方法映射的请求为:http://localhost:8080/maven-springMVC/modelAttr/login1
    @RequestMapping(value="/login1")
    public String login1() {
        return "modelAttr/loginResult";
    }
}
  • loginForm
<h1>测试@ModelAttribute(value="")注释返回具体类的方法</h1>
    <br>
    <form action="login1" method="post">
        <table>
            <tr>
                <td><label>登录名:</label></td>
                <td><input type="text" id="loginName" name="loginName"></td>
            </tr>
            <tr>
                <td><input type="submit" id="submit" value="登录"></td>
            </tr>
        </table>
    </form>
  • loginResult
${requestScope.loginName}
3.5.2 ModelAttribute注释void返回值的方法
  • controller
@Controller
@RequestMapping(value="/modelAttr")
public class ModelAttribute2Controller {
    //使用Model属性名和值由model.addAttribute()来实现,前提是要在方法中加入一个Model类型的参数
    @ModelAttribute 
    public void UserModel2(@RequestParam("loginName") String loginName,@RequestParam("password") String password,Model model) {
        model.addAttribute("loginName",loginName);
        model.addAttribute("password",password);
    }
    
    
    //该方法映射的请求为:http://localhost:8080/maven-springMVC/modelAttr/login2
    @RequestMapping(value="/login2")
    public String login2() {
        return "modelAttr/loginResult";
    }
}
  • loginForm
<h1>测试@ModelAttribute注释void返回值的方法</h1>
    <br>
    <form action="login2" method="post">
        <table>
            <tr>
                <td><label>登录名:</label></td>
                <td><input type="text" id="loginName" name="loginName"></td>
            </tr>
            <tr>
                <td><label>密码:</label></td>
                <td><input type="text" id="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" id="submit" value="登录"></td>
            </tr>
        </table>
    </form>
  • loginResult
${requestScope.loginName}
${requestScope.password}
3.5.3 @ModelAttribute注释返回具体类的方法
  • controller
@Controller
@RequestMapping(value="/modelAttr")
public class ModelAttribute3Controller {
    //静态集合,代替数据库用来保存注册的用户信息
    private static List<User> userList;
    
    //初始化List<User>集合
    public ModelAttribute3Controller() {
        super();
        userList = new ArrayList<User>();
        User user1 = new User("test", "123456", "测试用户");
        User user2 = new User("admin", "789012", "管理员");
        userList.add(user1);
        userList.add(user2);
    }
    
    public User find(String loginName,String password) {
        //从集合中查找用户是否存在,用来模拟数据库验证
        for(User user :userList) {
            if(user.getLoginName().equals(loginName)&&
                    user.getPassword().equals(password)) {
                return user;
            }   
        }
        return null;
    }

    //使用Model属性名的名称没有被指定,它由UserModel3返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称就是User
    @ModelAttribute 
    public User UserModel3(@RequestParam("loginName") String loginName,@RequestParam("password") String password) {
        return this.find(loginName, password);
    }
    
    
    //该方法映射的请求为:http://localhost:8080/maven-springMVC/modelAttr/login3
    @RequestMapping(value="/login3")
    public String login3() {
        return "modelAttr/loginResult";
    }
}
  • loginForm
<h1>测试@ModelAttribute注释具体类的方法</h1>
    <br>
    <form action="login3" method="post">
        <table>
            <tr>
                <td><label>登录名:</label></td>
                <td><input type="text" id="loginName" name="loginName"></td>
            </tr>
            <tr>
                <td><label>密码:</label></td>
                <td><input type="text" id="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" id="submit" value="登录"></td>
            </tr>
        </table>
    </form>
  • loginResult
${requestScope.user.userName}
${requestScope.user.loginName}
${requestScope.user.password}
3.5.4 @ModelAttribute@RequestMapping同时注释一个方法
  • controller
@Controller
@RequestMapping(value="/modelAttr")
public class ModelAttribute4Controller {
    
    //该方法映射的请求为:http://localhost:8080/maven-springMVC/modelAttr/login4
    //此时login4方法返回的值并不是一个视图名称,而是model属性的值,视图名称是@RequestMapping的value值"/login4"
    //使用Model属性名的名称由@ModelAttribute(value="userName")指定,相当于在request中封装了userName(key)= admin (value)
    @RequestMapping(value="/login4")
    @ModelAttribute(value="userName")
    public String login4() {
        return "modelAttr/loginResult";
    }
}
  • loginForm
<h1>测试@ModelAttribute和@RequestMapping同时注释一个方法</h1>
    <br>
    <form action="login4" method="post">
        <table>
            <tr>
                <td><label>登录名:</label></td>
                <td><input type="text" id="loginName" name="loginName"></td>
            </tr>
            <tr>
                <td><label>密码:</label></td>
                <td><input type="text" id="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" id="submit" value="登录"></td>
            </tr>
        </table>
    </form>
  • loginResult==>login4.jsp
${requestScope.user.userName}
3.5.5 @ModelAttribute注释一个方法的参数
  • controller
@Controller
@RequestMapping(value="/modelAttr")
public class ModelAttribute5Controller {
    
    //使用Model属性名就是value的值,即"user",model属性对象就是方法的返回值
    @ModelAttribute("user") 
    public User UserModel2(@RequestParam("loginName") String loginName,@RequestParam("password") String password) {
        User user = new User();
        user.setLoginName(loginName);
        user.setPassword(password);
        return user;
    }
    
    //该方法映射的请求为:http://localhost:8080/maven-springMVC/modelAttr/login5
    //@ModelAttribute("user")  User user 注释方法参数,参数user的值就是userModel5()方法中的model值
    @RequestMapping(value="/login5")
    public String login5( @ModelAttribute("user") User user) {
        user.setUserName("测试@ModelAttribute注释一个方法的参数");
        return "modelAttr/loginResult";
    }
}
  • loginForm
<h1>测试@ModelAttribute注释一个方法的参数</h1>
    <br>
    <form action="login5" method="post">
        <table>
            <tr>
                <td><label>登录名:</label></td>
                <td><input type="text" id="loginName" name="loginName"></td>
            </tr>
            <tr>
                <td><label>密码:</label></td>
                <td><input type="text" id="password" name="password"></td>
            </tr>
            <tr>
                <td><input type="submit" id="submit" value="登录"></td>
            </tr>
        </table>
    </form>
  • loginResult
${requestScope.user.userName}
${requestScope.user.loginName}
${requestScope.user.password}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容