1. 在Controller类之中实现转发和重定向
要实现转发和重定向只要在RequestMapping的方法下面返回的字符串加上前缀就行了。
"forward:/"表示转发,"redirect:/"表示重定向
@RequestMapping("/redirect/test")
public String testRedirect() {
return "redirect:/index.jsp";
}
@RequestMapping("/forward/test")
public String testForward() {
return "forward:/index.jsp";
}
如果在spring mvc servlet的配置文件之中将resolver的bean类注释掉,转发和重定向依然可以生效。这说明加上了转发和重定向前缀的字符串不会经过resolver的解析,能够让dispatcherServlet直接使用。
2. 前端表单提交一个对象
假设前端表单提交了后端pojo类的多个字段的值,我们要把这些提交的结果重新封装为pojo类。
-
可以在处理请求的方法之中加上很多个参数,同时加上@RequestParam注解使得这些参数与传递过来的数据名称一一匹配,接着手动封装。但是这样比较麻烦。
-
直接将pojo类作为参数加入方法之中,只要前端传入的值的名称与pojo类的字段名称相同,Spring MVC框架就可以自动封装好
@RequestMapping("/form/test")
public String formSubmitTest(User user) {
System.out.println(user);
return "test";
}
<form action="${pageContext.request.contextPath}/form/test" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
结果为:User(username=1234, password=1234)
3. 后端数据回显到前端
将后端数据回显到前端有很多相似的方法。
- 在处理请求的方法的参数之中加上HttpServletResponse这个类型的参数,通过这个参数获取PrintWriter输出流,将数据直接输出给前端。能这样做是因为Controller本质也是一个Servlet,能够处理Request和Response。
@RequestMapping("/data/m1")
public String dataBack1(HttpServletRequest request, HttpServletResponse response) {
request.getSession().setAttribute("msg", "method1");
return "test";
}
- 使用Model。Model这个类能够将数据通过setAttribute这个方法封装为一个键值对,前端能够通过键直接获得值
@RequestMapping("/data/m2")
public String dataBack2(Model model) {
model.addAttribute("msg", "method2");
return "test";
}
- 使用ModelAndView。相比于Model类,这个主要多了设置要跳转的视图的名称这一个功能。
这种代码是不行的
// 错误的方法,实际上处理请求的是dataBack1
@RequestMapping("/data/m3")
public String dataBack3(ModelAndView mv) {
mv.addObject("msg", "method3");
return "test";
}
如果请求/data/m3,视图会显示和请求/data/m1一样的结果。如果ModelAndView使用setViewName方法设置了视图名称也不会出现预期的结果,前端并没有获取到msg。
// 正确的方法,mv设置数据以及跳转的视图
@RequestMapping("/data/m3")
public ModelAndView dataBack3() {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "method3");
mv.setViewName("test");
return mv;
}
- 使用ModelMap。相比于Model类,这个类继承自LinkedHashMap,除了Model有的方法之外还能够做到LinkedHashMap的一些操作
public class ModelMap extends LinkedHashMap<String, Object>
@RequestMapping("/data/m4")
public String dataBack4(ModelMap model) {
model.addAttribute("msg", "method4");
return "test";
}
4. 后端回显数据到前端显示乱码问题
后端数据回显到前端显示乱码问题可以通过设置过滤器解决。
-
自己设置一个过滤器类,并且通过注解或者在web.xml之中配置好Filter信息
-
使用Spring MVC提供的过滤器类,直接在web.xml之中使用这个类
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>