【SpringMVC】ModelAndView

来源:互联网 发布:网站域名分类 编辑:程序博客网 时间:2024/06/06 00:24


5.1ModelAndView

处理方法返回值类型为ModelAndView时,方法体即可通过对象添加模型数据

jsp:

<!-- 测试testModelAndView -->

    <ahref="springmvc/testModelAndView">Test ModelAndView</a>

控制器:

/**

     * 目标方法的返回值可以是ModelAndView,包含视图和模型信息

     * springmvc会把modelandviewmodel数据放入到request域对象中

     * @return

     */

@RequestMapping("/testModelAndView")

    publicModelAndView testModelAndView(){

       String viewName=SUCCESS;

       ModelAndView modelAndView=new ModelAndView(viewName);

//     添加模型数据到ModelAndView

       modelAndView.addObject("time",new Date());

       returnmodelAndView;

    }

success.jsp:

time:${requestScope.time}

结果:


 

5.2Map及Model

入参为org.springframework.ui.Model/org.springframework.ui.ModelMap或java.uti.Map时,处理方法返回时,Map中的数据会自动添加到模型中

jsp:

<!-- 测试testMap -->

    <ahref="springmvc/testMap">Test Map</a>

 

控制器:

@RequestMapping("/testMap")

    publicString testMap(Map<String, Object>map){

       map.put("names",Arrays.asList("Tom","Jerry","Mike"));

       returnSUCCESS;

    }

success.jsp:

names:${requestScope.names}

结果:


 

5.3@SessionAttributes

将模型中某个属性暂存到HttpSession中,以便多个请求间可以共享这个属性


jsp:

<!-- 测试testSessionAttributes -->

    <ahref="springmvc/testSessionAttributes">Test SessionAttributes</a>

控制器:

@SessionAttributes("user")   //在类上添加注解后,当向请求域中存放数据时,也在Session域中存放一份数据

@RequestMapping("/springmvc")

@Controller

publicclass SpringMVCTest {

 

    privatestaticfinal StringSUCCESS="success";

   

    @RequestMapping("/testSessionAttributes")

    public String testSessionAttributes(Map<String, Object>map){

       User user=new User("Tom","123","tom@163.com", 12);

       map.put("user",user);//向请求域中放入数据

       returnSUCCESS;

    }

}

 

success.jsp:

<!-- 匹配value指定对象 -->

request user:${requestScope.user}

    <br><br>

session user:${sessionScope.user}

结果:


 


jsp:

<!-- 测试testSessionAttributes -->

    <ahref="springmvc/testSessionAttributes">Test SessionAttributes</a>

 

控制器:

 

success.jsp

<!-- 匹配types指定对象 -->

    request school:${requestScope.school}

    <br><br>

    session school:${sessionScope.school}

运行结果:


SessionAttribute除了放置可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定那些模型属性放到会话中。

注意:该注解只能放在类上

5.4@ModelAttribute

方法入参标注该注解后,入参的对象就会放到数据模型中

5.4.1应用场景

数据库中数据更新问题


jsp:

<!--  

    模拟修改操作:

    1.原始数据为:1,tom,123456,tom@163.com,13

    2.密码不能被修改

    3.表单回显,模拟操作直接在表单填写对应的属性值

    -->

    <formaction="springmvc/testModelAttribute"method="post">

       <inputtype="hidden"name="id"value="1"/>

       username:<inputtype="text"name="username"value="Tom"/>

       <br>

       email:<inputtype="text"name="email"value="tom@163.com">

       <br>

       age:<inputtype="text"name="age"value="13">

       <br>

       <inputtype="submit" value="submit">

    </form>

控制器:

/**

     * @ModelAttribute修饰额方法,会在每个目标方法执行之前被SpringMVC调用

     * @param id

     * @param map

     */

    @ModelAttribute

    publicvoid getUser(@RequestParam(value="id",required=false) Integerid,Map<String, Object>map){

        if (id!=null) {

            //模拟从数据库中获取对象

            User user=new User(1, "Tom", "123456", "tom@163.com",13);

            System.out.println("从数据库中获取一个对象:"+user);

            map.put("user", user);

        }

    }

    @RequestMapping("/testModelAttribute")

    public String testModelAttribute(Useruser){

        System.out.println("修改:"+user);

        returnSUCCESS;

    }

 

5.4.2运行原理

/**

     * 运行流程:

     * 1.执行@ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放到了Map中,键为:user

     * 2.SpringMVCMap中取出User对象,并把表单的请求参数赋给该User对象的对应属性

     * 3.SpringMVC把上述对象传入目标方法的参数

     *

     * 注意:在@ModelAttribute修饰的方法中放入到Map时的键要和目标方法入参类型的第一个字母小写的字符串一致

     */

5.4.3源码分析

 省了。。。。

5.4.4确定目标方法POJO类型参数

/**

     * SpringMVC确定目标方法POJO类型参数入参过程

     * 1.确定一个key

     * 1)若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,则keypojo类名的第一个字母的小写

     * 2)若使用了@ModelAttribute来修饰,则key@ModelAttribute注释的value属性值

     * 2.implicitModel中查找key对应的对象,若存在,则作为参数传入

     * 1)若在@ModelAttribute标记的方法中在Map中保存过,且key1确定的key一致,则会获取到

     * 3.implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注释修饰,若使用了该注解,

     * @SessionAttribute注释的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标

     * 方法的入参中,若不存在将抛出异常

     * 4.Handler没有标识@SessionAttribute注释或@SessionAttribute注释的value值不包含key,则通过反射来创建Pojo类型的参数,

     * 传入为目标犯法的参数

     * 5.SpringMVC会把keyPojo类型的对象保存到implicitModel中,进而会保存到request

     */


原创粉丝点击