一 高级参数绑定
基本的springmvc配置,这里就不细说了。
(a)数组类型参数绑定
测试代码
public class AdvancedArgsController { @RequestMapping(value="/array",method=RequestMethod.GET) public String index() { return "array"; } @RequestMapping(value="/array",method=RequestMethod.POST) public String array(String[] hobby,Model model) { model.addAttribute("hobby", hobby); return "array"; } |
jsp页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>hobby</title> </head> <body> <h1>兴趣爱好调查</h1> <form action="${pageContext.request.contextPath}/array" method="post"> <h2><input type="checkbox" name="hobby" value="葡萄牙"/>葡萄牙</h2> <h2><input type="checkbox" name="hobby" value="西班牙"/>西班牙</h2> <h2><input type="checkbox" name="hobby" value="法国"/>法国</h2> <h2><input type="submit" value="确认"/></h2> </form> <h1>调查结果如下:</h1> <c:forEach items="${hobby}" var="h"> <h2>${h}</h2> </c:forEach> </body> </html> |
开启服务器测试
这里注意点:1 中文乱码问题:springmvc有自带的CharacterEncodingFilter,只需要在web.xml文件中配置一下即可,配置方法和servlet相似;2 @RequestMapping(Method=method=RequestMethod.GET),这个只接受get请求,同样postz只接受post请求。官方文档spring4.3之后还提供了@PostMapping和@GetMapping,我用过映射不上去,这里咱不研究,有老哥知道需要什么特殊配置吗
(b)list类型参数绑定
踩过的坑:(1)接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据;(2)list类型,参数名最好和提交的input选项名一直,可以直接映射上(具体见代码)
@Controller public class AdvancedArgsController { @RequestMapping(value="/list",method=RequestMethod.GET) public String index() { return "array"; } @RequestMapping(value="/array",method=RequestMethod.POST) public String array(String[] hobby,Model model) { model.addAttribute("hobby", hobby); return "array"; } @RequestMapping(value="/list",method=RequestMethod.POST) public String list(TestObject hobby,Model model) { model.addAttribute("hobby", hobby.getHobby()); return "array"; } } |
二 Controller方法的返回值问题
之前用的只是String类型,返回(普通)字符串,这是代表逻辑视图名,经过视图解析器解析为物理试图地址(特别好用)
再介绍几种返回值类型:返回void,redirect重定向,forword转发,下面尝试一下:
@Controller @RequestMapping("/args") public class MethodArgsController { @RequestMapping("/servlet") public void servlet(HttpServletResponse resq) { try { resq.getWriter().write("response!!!!!!"); resq.flushBuffer(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
/@Controller public class AdvancedArgsController { @RequestMapping(value = "/array", method = RequestMethod.GET) public String index() { return "array"; } // 重定向一个页面 @RequestMapping(value = "/redirect", method = RequestMethod.POST) public String redirect(TestObject hobby, Model model) { model.addAttribute("hobby", hobby.getHobby()); return "redirect:array"; } // 转发 @RequestMapping(value = "/forward", method = RequestMethod.POST) public String forward(TestObject hobby, Model model) { model.addAttribute("hobby", hobby.getHobby()); return "forward:hobby"; } |
直接返回ModelAndView,这样返回的内容就会被直接写死!!!
//返回 @RequestMapping("/mv") public ModelAndView mandv() { ModelAndView mv = new ModelAndView(); mv.setViewName("hobby"); mv.addObject("hobby", new String[] {"德国","法国"}); return mv; } |
三 异常处理器
正常我们在写代码的时候,出现异常要么是try catch,要么就是向上抛异常(最终还是要try catch),这样很多异常就有很多个try catch,会造成代码重复。springmvc提供了一个HandlerExceptionResolver,异常处理器解析器。之前学spring aop的时候,学过一个环绕增强,可以包裹异常,这里这个异常处理器解析器更牛逼!!!这里可以参考一下他的源代码。
我们先编写一个全局异常处理器解析器类,代码如下:
public class GlobleHandlerExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = new ModelAndView(); //正常这里是记录发生异常的日志,我是直接打印到控制台 ex.printStackTrace(); //自定义错误,这样界面就可以设计成我们想要的样子 mv.setViewName("error"); mv.addObject("error", ex.getMessage()); return mv; } } |
然后在springmvc.xml中配置全局异常处理器解析器
<!-- 全局异常处理器解析器 -->
<bean class="com.springmvc.controller.GlobleHandlerExceptionResolver"></bean>
配好过后自定义一个异常controller进行测试
四 图片上传(详情请见下一章)
之前学习Servlet的时候,图片文件上传使用fileupload,和io流,springmvc有上传解析器。