springMVC
ModelAndView 类
三种向 Request 域中存储数据的方式
- 使用 ModelAndView 对象,使用方法:
addObjetct(String attributeName, String attributeValue) 存储数据
setViewName(String viewName) 设置视图名称 - 向形参中传入 Map 对象,在方法内向 Map 对象内保存数据
- 向形参中传入 Model 对象,在方法内向使用 Model 对象的方法:
addAttribute(String attributeName, String attributeValue) 存储数据
使用 ModelAndView 对象
ModelAndView 类中提供方法:
方法 | 作用 |
---|---|
addObject(String attributeName,Object attributeValue) | 向 Request 域中存储数据 |
setViewName(String viewName) | 设置视图名称 |
注意:在方法内创建 ModelAndView 对象,并向域中保存数据以及设置视图名称等操作,ModelAndView 对象必须返回,执行的操作才会生效。
//方法1:使用 ModelAndView 对象
@RequestMapping("/testModelAndView01")
public ModelAndView testModelAndView01(){
ModelAndView modelAndView = new ModelAndView();
//向Request域中保存数据
modelAndView.addObject("username", "mcc");
//设置视图名称
modelAndView.setViewName("success");
return modelAndView;//ModelAndView对象必须返回,执行的操作才会生效
}
success.jsp 中,能够获取到 Request 域中的数据。
<body>
<h1>success</h1>
<h1>${ requestScope.username }</h1>
</body>
形参传入 Map 对象
//方法2:向形参中传入 Map 对象,在方法内向 Map 对象内保存数据
@RequestMapping("/testModelAndView02")
public String testModelAndView02(Map<String,String> map){
//向 map 中保存数据,就是在向 Request 域中保存数据
map.put("username", "mcc");
return "success";
}
形参传入 Model 对象
//方法3:向形参中传入 Model 对象,在方法内向使用 Model 对象的方法保存数据
@RequestMapping("/testModelAndView03")
public String testModelAndView03(Model model){
//向Request域中保存数据
model.addAttribute("username", "mcc");
return "success";
}
视图类型
springMVC 中提供三种类型的视图:
- InternalResourceView:转发视图,不能处理包含 JSTL 语法页面
- JstlView:转发视图,配合其他视图,处理包含 JSTL 语法的页面
- RedirectView:重定向视图
使用方法:在方法的 return 语句中,
return "success";
:请求转发视图return "redirect:/success.jsp"
:请求重定向视图
SpringMVC 会自动根据返回的视图名称,调用对应的视图类。
注意:重定向是浏览器解析的,浏览器将/
解析为http://localhost:8080
,因此正常情况下,重定向的地址要在斜杠后添加工程路径,但在 springMVC 的源码中,已经自动添加了工程路径,所以在 springMVC 中,/
被服务器和浏览器都解析为http://localhost:8080/工程路径
视图优先级
在配置视图时,通过属性 order,设置视图的优先级,从 1-n 优先级逐渐减小。
<property name="order" value="1"></property>
向 Session 域中存储数据
-
向 Session 域中保存数据。
方法:
在类上使用@SessionAttributes()
注解,当向 Request 域中保存的数据的 key 值满足注解内约束的条件时,会自动将该键值对保存到 Session 域中。参数:
String[] value:要保存到 Session 域中的键值对的 key 值。
Class<?>[] types:要保存到 Session 域中的键值对的 value 值的类型,要与注解内 value 参数的顺序一致。@Controller @SessionAttributes(value={"session"}, types={String.class}) //当向 Request 域中保存 key=session 的键值对,并且 session 的 value 值的类型为 String 时, //会自动将该键值对保存到 Session 域中 public class TestSession { //用于测试向 Session 域中保存数据 @RequestMapping(value="/testSession") public String testSession(Model model) { model.addAttribute("session","sessionValue"); return "success"; } }
-
清空 Session 域中的数据。
方法:在形参上传入SessionStatus
对象,在方法内调用该对象的setComplete()
方法即可。//清空 Session 域中的数据 @RequestMapping(value="/testClearSession") public String testClearSession(SessionStatus sessionStatus) { sessionStatus.setComplete(); return "success"; }
自定义配置文件位置
默认情况下,springMVC 的配置文件存放在 WEB-INF 文件夹下,名称为 DispatchServlet 的<servlet-name>标签值-servlet.xml。
可以在 web.xml 中配置 springMVC 配置文件的位置与名称,方法如下:
- 在 servlet 标签中配置初始化参数:
<param-name>contextConfigLocation</param-name>
- 该参数的值即为 springMVC 配置文件的位置与名称:
<param-value>classpath:springMVC.xml</param-value>
,其中,classpath 表示工程路径下(与 src 同一级目录),springMVC.xml 为设置的配置文件名称。 - 设置在项目加载时,就加载 DispatchServlet:
<load-on-startup>一个正整数</load-on-startup>
,其中,输入正整数表示在项目加载时就加载该 servlet 程序,若有多个 servlet 程序需要在项目加载时就被加载,数字的大小即为程序的优先级,1 的优先级最大。
注意:servlet 程序默认在第一次被访问时才被加载,这里设置在项目加载时就被加载。
web.xml
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- 指定 springMVC 配置文件的位置和名称 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
设置编码方式
可以在 web.xml 中配置CharacterEncodingFilter
过滤器,通过设置初始化参数encoding
的值,设置请求与响应的编码方式。
web.xml
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>