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);
}