前边的入门就不说了~~
如果有不懂的可以参考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域中,该注解只能放到类上面
*注意:在@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作为参数传递给目标方法的入参。
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中,
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>
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>