美文网首页
springmvc 06 Handler方法传参

springmvc 06 Handler方法传参

作者: 小小机器人 | 来源:发表于2016-10-20 16:39 被阅读33次

    使用POJO作为参数
    springmvc会自动把参数注入到POJO对象的属性中,且包括级联注入

    <body>
    
        <form action="springmvc/testPojo" method="post"><!-- 提交路径不要以/开关 -->
             用户名:<input type="text" name="name"><br>
             密码:<input type="password" name="password"><br>
             年龄:<input type="text" name="age"><br>
             省份:<input type="text" name="address.province"><br>
             城市:<input type="text" name="address.city"><br>
            <button type="submit">登录</button>
        </form>
        
    </body>
    
        @RequestMapping("/testPojo")
        public String testPojo(User user){
            System.out.println(user);
            return SUCCESS;
        }
    
    @Data
    @AllArgsConstructor
    public class User {
        private String name;
        private String password;
        private int age;
        private Address address;
    }
    

    使用原生servlet作为参数
    支持的其他类型有

    HttpServletRequest
    HttpServletResponse
    HttpSession
    java.security.Principal
    Locale
    InputStream
    OutputStream
    Reader
    Writer

    <a href="springmvc/testServletApi?username='George'">testServletApi</a>
    
        @RequestMapping("/testServletApi")
        public void testServletApi(
                HttpServletRequest request
                ,HttpServletResponse response) throws IOException{
            String name = request.getParameter("username");
            response.getOutputStream().write(name.getBytes());
        }
    

    传参 @ModelAttribute修改数据

        <form action="springmvc/modifyEmp" method="post">
             编号:<input type="text" name="id" value="1"><br>
             姓名:<input type="text" name="name" value="Bruce"><br>
    <!--         性别:<input type="text" name="sex" ><br>
        注意:该性别组件不能写,因为我们不希望修改Emp的性别属性
     -->
            <button type="submit">修改</button>
        </form>
    
        @ModelAttribute
        public void getEmp(
                @RequestParam(value="id",required=false) Integer id
                ,Map<String,Object>map){
            
            //0.先从表单提交的数据中取出id,存在则继续
            if (id!=null){
                //1.模拟到数据库中查询是否具有该id的Emp
                //2.假设已经查到了,emp是从数据库中取回来的数据
                Emp emp = new Emp(2,"Smith","man");//数据库中的原始数据
                map.put("emp", emp);
            }
        }
        
        @RequestMapping("/modifyEmp")
        public String testModelAttribute(Emp emp){
            System.out.println("修改后:"+emp);
            return SUCCESS;
        }
    
    修改的后的数据:${requestScope.emp}
    //修改的后的数据:Emp(id=1, name=Bruce, sex=man)
    

    SpringMVC 确定目标方法 POJO 类型入参的过程
    1. 确定一个 key:
    * 目标方法的 POJO 类型的参数有没有使用 @ModelAttribute 作为修饰, 有则 key 为 POJO 类名首字母小写的字符串
    * 若@ModelAttribute设置了value值, 则 key 为 @ModelAttribute 注解的 value 属性值.

    2. 在 implicitModel(@ModelAttribute修饰方法的model对象) 中查找 key 对应的对象, 若存在, 则作为入参传入
    * 若在 @ModelAttribute 标记的方法中用 Map或Model 保存过与1中key同名的对象,那么将会获取到该对象并传入
    3. 若 implicitModel 中不存在 key 对应的对象, 则检查当前的Controller是否使用 @SessionAttributes 注解修饰
    * 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了该key, 则会从 HttpSession 中来获取 key 所对应的数据。若包含了该key但没有对应的数据则将抛出异常.
    4. 若 Controller 没有@SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含该key
    * 会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数
    *5. SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中. *

    相关文章

      网友评论

          本文标题:springmvc 06 Handler方法传参

          本文链接:https://www.haomeiwen.com/subject/ohnfuttx.html