SpringMVC学习四(@ModelMap @RequestBody等等的说明)

参考如下

http://www.cnblogs.com/HD/p/4107674.html

http://www.cnblogs.com/qiankun-site/p/5774325.html

 

 

@responseBody注解的使用

 

1、

  @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML

  数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

2、  

  @RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

  效果等同于如下代码:
  @RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

1、直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交。

复制代码
    /**
     * 1.直接把表单的参数写在Controller相应的方法的形参中
      * @param username
     * @param password
     * @return
     */
    @RequestMapping("/addUser1")
    public String addUser1(String username,String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }
复制代码

url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的参数需要和Controller方法中的入参名称一致。

2、通过HttpServletRequest接收,post方式和get方式都可以。

复制代码
    /**
     * 2、通过HttpServletRequest接收
      * @param request
     * @return
     */
    @RequestMapping("/addUser2")
    public String addUser2(HttpServletRequest request) {
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }
复制代码

3、通过一个bean来接收,post方式和get方式都可以。
(1)建立一个和表单中参数对应的bean

复制代码
package demo.model;

public class UserModel {
    
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}
复制代码

(2)用这个bean来封装接收的参数

复制代码
    /**
     * 3、通过一个bean来接收
      * @param user
     * @return
     */
    @RequestMapping("/addUser3")
    public String addUser3(UserModel user) {
        System.out.println("username is:"+user.getUsername());
        System.out.println("password is:"+user.getPassword());
        return "demo/index";
    }
复制代码

4、通过@PathVariable获取路径中的参数

复制代码
    /**
     * 4、通过@PathVariable获取路径中的参数
      * @param username
     * @param password
     * @return
     */
    @RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) { System.out.println("username is:"+username); System.out.println("password is:"+password); return "demo/index"; }
复制代码

例如,访问http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路径时,则自动将URL中模板变量{username}和{password}绑定到通过@PathVariable注解的同名参数上,即入参后username=lixiaoxi、password=111111。
5、使用@ModelAttribute注解获取POST请求的FORM表单数据
Jsp表单如下:

复制代码
<form action ="<%=request.getContextPath()%>/demo/addUser5" method="post"> 
     用户名:&nbsp;<input type="text" name="username"/><br/>
     密&nbsp;&nbsp;码:&nbsp;<input type="password" name="password"/><br/>
     <input type="submit" value="提交"/> 
     <input type="reset" value="重置"/> 
</form> 
复制代码

Java Controller如下:

复制代码
    /**
     * 5、使用@ModelAttribute注解获取POST请求的FORM表单数据
      * @param user
     * @return
     */
    @RequestMapping(value="/addUser5",method=RequestMethod.POST)
    public String addUser5(@ModelAttribute("user") UserModel user) {
        System.out.println("username is:"+user.getUsername());
        System.out.println("password is:"+user.getPassword());
        return "demo/index";
    }
复制代码

6、用注解@RequestParam绑定请求参数到方法入参

当请求参数username不存在时会有异常发生,可以通过设置属性required=false解决,例如: @RequestParam(value="username", required=false)

复制代码
    /**
     * 6、用注解@RequestParam绑定请求参数到方法入参
      * @param username
     * @param password
     * @return
     */
    @RequestMapping(value="/addUser6",method=RequestMethod.GET)
    public String addUser6(@RequestParam("username") String username,@RequestParam("password") String password) {
        System.out.println("username is:"+username);
        System.out.println("password is:"+password);
        return "demo/index";
    }
复制代码
 
 
@ModelAttribute 的一些说明
  1. 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;
  2. 运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
  3. model和mdelmap则是返回时的操作,不一样不要搞混了诶。

1.@ModelAttribute注释void返回值的方法

 

 

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class HelloModelController {  
  3.       
  4.     @ModelAttribute   
  5.     public void populateModel(@RequestParam String abc, Model model) {    
  6.        model.addAttribute("attributeName", abc);    
  7.     }    
  8.   
  9.     @RequestMapping(value = "/helloWorld")    
  10.     public String helloWorld() {    
  11.        return "helloWorld.jsp";    
  12.     }    
  13.   
  14. }  

 

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

 

jsp页面页面如下:

[html]  view plain  copy
 
 
 
 
 
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <html>  
  5. <head>  
  6. </head>  
  7. <body>  
  8. <c:out value="${attributeName}"></c:out>  
  9. </body>  
  10. </html>  


2.@ModelAttribute注释返回具体类的方法

 

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute   
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.     @RequestMapping(value = "/helloWorld2")    
  11.     public String helloWorld() {    
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  


 

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

 

jsp 中如下访问:

[html]  view plain  copy
 
 
 
 
 
  1. <c:out value="${user.account}"></c:out>  


也可以指定属性名称

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute(value="myUser")  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.     @RequestMapping(value = "/helloWorld2")    
  11.     public String helloWorld(Model map) {    
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  


jsp中如下访问:

[html]  view plain  copy
 
 
 
 
 
  1. <c:out value="${myUser.account}"></c:out>  

 

 

对象合并:

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.       
  11.     @RequestMapping(value = "/helloWorld2")    
  12.     public String helloWorld(User user) {  
  13.         user.setName("老王");  
  14.        return "helloWorld.jsp";    
  15.     }    
  16. }  

 

 

对象合并指定对象名称:

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute("myUser")  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.       
  11.     @RequestMapping(value = "/helloWorld2")    
  12.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  13.         user.setName("老王");  
  14.        return "helloWorld.jsp";    
  15.     }    
  16. }  

 

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

 

[html]  view plain  copy
 
 
 
 
 
  1. <c:out value="${myUser.name}"></c:out>  
  2. <c:out value="${myUser.account}"></c:out>  


 

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

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

 

[java]  view plain  copy
 
 
 
 
 
  1. public class BaseController {  
  2.       
  3.     @ModelAttribute  
  4.     public void populateModel() throws Exception {    
  5.        SysUser user=ContextUtil.getCurrentUser();  
  6.        if(user.getAccount().equals("admin")){  
  7.            throw new Exception("没有权限");  
  8.        }  
  9.     }    
  10. }  


需要控制权限的类继承BaseController

 

 

[java]  view plain  copy
 
 
 
 
 
  1. @Controller  
  2. public class Hello2ModelController extends BaseController {  
  3.       
  4.     @RequestMapping(value = "/helloWorld2")    
  5.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  6.         user.setName("老王");  
  7.        return "helloWorld.jsp";    
  8.     }    
  9. }  


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

 

 

总结:

 

 

@ModelAttribute具有如下三个作用:

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

 

[java]  view plain  copy
 
 
 
 
 
  1. public String test(@ModelAttribute("user") UserModel user)   


 

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

 

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

 

[java]  view plain  copy
 
 
 
 
 
  1. public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)  

 

 

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

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



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

 

 
 
 
 
 
四个很重要的概念
  1. HttpServletRequest对象
  2. HttpServletResponse对象
  3. HttpSession对象
  4. Model/ModelMap对象

 

 

转载于:https://www.cnblogs.com/s1127736971/p/7606160.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值