SpringMVC学习笔记(未完)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kavu1/article/details/61619770

前边的入门就不说了~~

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



猜你喜欢

转载自blog.csdn.net/kavu1/article/details/61619770
今日推荐