Spring MVC学习总结(三):Spring MVC中的页面参数传递

1、使用HttpServletRequest

(1)在index.jsp中用超链接访问后台URL。

<a href="${pageContext.request.contextPath}/parameterOperation01">使用HttpServletRequest和Session</a>

(2)在Controller中定义处理请求的方法。

    @RequestMapping("/parameterOperation01")
    public String parameterOperation01(HttpServletRequest request){
        //获取session对象,并存入info信息
        HttpSession session = request.getSession();
        session.setAttribute("info","hello");
        //在request域中存入msg
        request.setAttribute("msg","你好");
        return "para";

    }

(3)在para.jsp中获取数据。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>Servlet方式:</h4>
使用HttpServletRequest得到的msg:${requestScope.msg}
使用Session得到的msg:${sessionScope.info}
</body>
</html>

执行结果如下:

2、在方法处使用Map、Model或者ModelMap

(1)在index.jsp中用超链接访问后台URL。

<a href="${pageContext.request.contextPath}/parameterMap">在方法上使用Map</a>
<a href="${pageContext.request.contextPath}/parameterModel">在方法上使用Model</a>
<a href="${pageContext.request.contextPath}/parameterModelMap">在方法上使用ModelMap</a>

(2)在Controller中定义处理请求的方法。

    /**
     * 方法入参为map
     * @param map
     * @return
     */
    @RequestMapping("/parameterMap")
    public String parameterMap(Map<String,Object> map){
        map.put("mapInfo", "我是map");
        return "para";
    }
    /**
     * 方法入参为Model
     * @param model
     * @return
     */
    @RequestMapping("/parameterModel")
    public String parameterModel(Model model){
        model.addAttribute("modelInfo", "我是Model");
        return "para";
    }
    /**
     * 方法入参为ModelMap
     * @param modelMap
     * @return
     */
    @RequestMapping("/parameterModelMap")
    public String parameterModelMap(ModelMap modelMap){
        modelMap.addAttribute("modelMapInfo", "我是ModelMap");
        return "para";
    }

(3)在para.jsp中获取数据。

<h4>Spring MVC方式:</h4>
方法入参为Map:${mapInfo}
方法入参为Model:${modelInfo}
方法入参为ModelMap:${modelMapInfo}

执行结果如下:

关于Map、Model和ModelMap说明:

(1)Map、Model和ModelMap不需要我们手动创建都可以用来存放数据,且只存放在request域中。如果在para.jsp中分别用四种域去获取值,则只有request域中能拿到mapInfo的值。

pageContext:${pageScope.mapInfo}<br>
request:${requestScope.mapInfo}<br>
session:${sessionScope.mapInfo}<br>
application:${applicationScope.mapInfo}<br>

执行结果如下: 

(2) Map、Model以及ModelMap底层都是使用BindingAwareModelMap。

这里我们可以简单看一下这几个类的源码:

a.BindingAwareModelMap继承ExtendedModelMap。

public class BindingAwareModelMap extends ExtendedModelMap {}

b. ExtendedModelMap继承ModelMap,实现Model接口。

public class ExtendedModelMap extends ModelMap implements Model {}

c.ModelMap继承LinkedHashMap。

public class ModelMap extends LinkedHashMap<String, Object> {}

 d.LinkedHashMap实现Map接口。

public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>
{}

所以,它们之间的类图如下:

 

3、方法返回值使用ModelAndView

ModelAndView的作用如下:

a.返回指定页面:ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面。

b.返回所需数值:使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。

使用案例如下:

(1)在index.jsp中用超链接访问后台URL。

<a href="${pageContext.request.contextPath}/parameterModelAndView">方法返回值为ModelAndView</a>

(2)在Controller中定义处理请求的方法。

    @RequestMapping("/parameterModelAndView")
    public ModelAndView parameterModelAndView(){
       // 创建对象
       ModelAndView mv = new ModelAndView();
       //设置返回的页面名称
       mv.setViewName("para");
       //设置传递给页面的数据
        mv.addObject("mvInfo", "我是ModelAndView");
        return mv;
    }

(3)在para.jsp中获取数据。

方法返回值为:${mvInfo}

执行结果如下:

4、使用@ModelAttribute注解

使用@ModelAttribute注解的方法会优先于@RequestMapping的方法运行,并且它们会在同一个request域中。

@ModelAttribute注解的用法:

a.@ModelAttribute在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,并自动加入ModelMap中。

创建表单:

<form method="post" action="${pageContext.request.contextPath}/modelAttribute01">
    书名: <input type="text" name="bName"><br>
    作者: <input type="text" name="bAuthor"><br>
    价格: <input type="text" name="bPrice"><br>
    <input type="submit" value="提交"><br>
</form>

处理请求的方法:

    @RequestMapping("/modelAttribute01")
    public String modelAttribute01(@ModelAttribute Book book,Model model){
        System.out.println(book);
        model.addAttribute("book",book);
        return "bookPage";
    }

接收参数的bookPage.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
书名:${book.bName}
作者:${book.bAuthor}
价钱:${book.bPrice}
</body>
</html>

表单输入值,执行结果如下:

b.@ModelAttribute用在Controller的方法上,此时会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。

    @RequestMapping("/modelAttribute02")
    public String modelAttribute02(Book book){
        System.out.println(book);
        return "success";
    }
    @ModelAttribute
    public void getUser(Model model){
        Book book = new Book("<<西游记>>","吴承恩",98.67);
        model.addAttribute("book", book);
    }

猜你喜欢

转载自blog.csdn.net/weixin_47382783/article/details/113386500