前边的入门就不说了~~
如果有不懂的可以参考SpringMVC 4.2.4.RELEASE官方中文API (进入下载页直接下载)
1、矩阵变量
2、媒体类型 3、请求参数和请求头(params="myParam=myValue") 4、REST架构 (1)、HTTP协议4个操作动词(对应4中基本操作): GET(获取资源)、 POST(新建资源)、 PUT(更新资源)、 DELETE(删除资源) HiddenHttpMethodFilter (2)REST架构风格: 理解本真的REST架构风格--http://kb.cnblogs.com/page/186516 深入浅出REST--http://www.infoq.com/cn/articles/rest-introduction5、@SessionAttribute:将数据放到Session域中,该注解只能放到类上面
6、@ModelAttribute 标记的方法,在目标方法执行之前都会被SpringMvc调用 *注意:在@ModelAttribute 标记的方法中,放到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致 eg. @ModelAttribute public void getUser(@RequestParam(value="id") Integer id,Map<String,Object> map){ //从数据库中取出对象 User user=new User(); System.out.println("从数据库中获取一个对象:"+user); map.put("user",user); } @RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println("修改后:"+user); return "success"; } 以上代码执行流程: 1、执行@ModelAttribute 注解修饰的方法:从数据库中取出对象,把对象放入到Map中,键为:user 2、SpringMVC 从Map中去除User对象,并把表单的请求参数赋给该User对象的对应属性,
3、SpringMVC 把上述对象传入目标方法(testModelAttribute)的参数。
源代码分析流程: 1.调用@ModelAttribute 注解修饰的方法,实际上吧@ModelAttribute 方法中的Map中的数据放在了implicitModel中 2、解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性 1)、创建WebDataBinder对象 1、确定ObjectName属性:若传入attrName属性值为"",则objectName为类,类名第一个首字母小写, *注意:attrName.若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName值即为@ModelAttribute的value属性值 2、确定target属性 >在implicizModel中查找attrName对应的属性值,若存在,OK >若不存在,则验证当前Handler是否使用了@SessionAttribute进行修饰,若使用了,则尝试Session中获取attrName所对应的属性值.若session中没有对应的属性值,则抛出了异常。 >若Handler没有使用@SessionAttributes 进行修饰,或@SessionAttributes 没有使用value值指定的Key和attrName相匹配,则通过反射创建了POJO对象。 2)、SpringMVC把表单的请求参数赋给了 WebDataBinder 的target对应的属性, 3)、SpringMVC会把WebDataBinder 的 attrName 的target给到impliciModel,近而传到request域对象中。
4)、把WebDataBinder的target作为参数传递给目标方法的入参。
SpringMVC确定目标方法POJO类型入参的过程: 1、确定一个Key 1)、若目标方法的POJO类型的参数没有使用@ModelAttribute 作为修饰,则key为POJO类名第一个字母小写, 2)、若使用了@ModelAttribute 来修饰,则key为@ModelAttribute 注解value的值。 2、在implicitModel中查找key对应的对象,若存在,则作为入参传入。 1)、若在@ModelAttribute 标记的方法中在Map中保存过,且key和1确定的key一致,则会获取到。 3、若implicitModel中不存在key对应的对象,则检查当前的Handler是否使用了@SessionAttributes 注解修饰,若使用该注解,且@SessionAttributes 注解的value属性值中包含了key,则会从HttpSession中获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在将抛出异常。 4、若Handler没有标识@SessionAttributes 注解或@SessionAttributes注解的value 值中不包含key则会通过反射来创建POJO类型的参数,传入为目标方法的参数。
5、SpringMVC会把 key 和 POJO 类型的对象保存到implicitModel中,进而会保存到request中,
7、自定义视图 1、在Spring-servlet.xml中配置视图解析器, <!--配置 BeanNameViewResolver 视图解析器:使用视图的名字来解析视图--> <!-- 通过order属性来定义视图解析器的优先级,order值越小优先级越高--> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="100"></property> </bean> 8、 SpringMVC的<from:form> 1、使用SpringMVC的<from:form>标签时,在域对象中必须有一个与表单字段对应的bean,可以通过form的modelAttribute属性定义绑定的bean,若不设置默认为command, eg. 在Controller中: @RequestMapping(value="user", method=RequestMethod.GET) public String (Map<Strign,Object> map){ map.put("user",new User()); //将user放到域对象中, return "user_add"; } user_add.jsp: <form:form action="user" method="POST" modelAttribute="user"> ..... //字段 //字段 </form:form>
2、掌握<form:form>的常用字段
9、SpringMVC处理静态资源 1、问题出现: 一般REST风格的URL不会带.do或.html后缀,若将DispacherServlet请求映射配置为/,则SpringMVC会捕获WEB容器的所有请求,所以当我 们试图使用外部的js、css、images等静态资源时,SpringMVC 会将他们当成一个普通的请求处理,导致找不到对应的处理器而抛出异常。 2、解决方法: 在SpringMVC的配置文件中配置<mvc:default-servlet-handler/>,会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler, 他会对 DispatcherServlet 的请求进行筛选,如果是没有经过映射的请求,就将该请求交给Web服务器默认的Servlet处理,如果不是静态资源的 请求,才由DispatcherServlet继续处理。一般WEB应用服务器默认的Servlet名称都是default,若使用的Servlet名称不是default,则可以在default- servlet-handler中显示定义。
10、自定义类型转换器 在springmvc-servlet.xml中配置:
<!--配置 ConversionService --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="自定义类型转换器类名第一个字母小写"/> </set> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> 11、数据格式化 @NumberFormat 数字格式转换器 @DateFormat 日期格式转换器 如果转换出错,可以用BindingResult类查看 12、数据校验 1、使用JSR 303验证标准 2、加入hibernate validator 的支持(jar包或dependency) 3、在springmvc-servlet.xml在中添加<mvc:annotation-driven/> 4、在bean的属性上添加相应的注解
5、在目标方法bean类型的前面添加@valid注解
如果填写数据不符合要求,会出现如下警告
13、处理Json 1、加入jar包或Maven依赖 2、编写目标方法,使其返回Json对应的对象或集合 3、在目标方法上添加@RequestBody注解
14、异常处理 1、在@ExceptionHandler 标记方法的入参中可以加入Exception类型的参数,该参数即对应发生的异常对象 2、@ExceptionHandler 方法的入参中不能传入 Map. 若希望把异常信息传导页面上, 需要使用 ModelAndView 作为返回值 eg.
@ExceptionHandler({ArithmeticException.class}) public ModelAndView handleArithmeticException(Exception ex){ System.out.println("出异常了: " + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } 3、 @ExceptionHandler 方法标记的异常有优先级的问题. 4、@ControllerAdvice: 如果在当前 Handler 中找不到 @ExceptionHandler 方法来出来当前方法出现的异常, 则将去 @ControllerAdvice 标记的类中查找 @ExceptionHandler 标记的方法来处理异常. 5、使用 SimpleMappingExceptionResolver eg. <!-- 配置使用 SimpleMappingExceptionResolver 来映射异常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- exceptionAttribute 属性默认值为 "exception",在页面上可以通过${ex}直接获取异常信息--> <property name="exceptionAttribute" value="ex"></property> <property name="exceptionMappings"> <props> <prop key="java.lang.ArrayIndexOutOfBoundsException">error</prop> </props> </property> </bean>