SpringMVC学习笔记(未完)

来源:互联网 发布:sql insert语句返回值 编辑:程序博客网 时间:2024/05/17 06:31

前边的入门就不说了~~

如果有不懂的可以参考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-introduction



5、@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>



1 0