天天看点

SpringMVC视图解析器、处理静态资源、类型转换等一大堆InternalResourceViewResolver其他功能:

InternalResourceViewResolver其他功能:

1. <mvc:view-controller

index.jsp---->Controller(@RequestMappping)---->success.jsp

要用SpringMVC实现:index.jsp---->success.jsp

在springmvc.xml中配置

<!--view-name也会被配置的视图解析器添加前缀和后缀,
	此配置会让所有的请求 转入<mvc:...>中匹配映射地址,而忽略掉@RequestMapping(...)
	让两者都有效的配置:<mvc:annotation-driven>
-->
<mvc:view-controller  path="hh/welcome"  view-name="success" />

<!--此配置是SpringMVC的基础配置,很多功能都需要该配置来协调-->
<mvc:annotation-driven></mvc:annotation-driven>
           

2. 指定请求方式

指定跳转方式:return "forward:/views/success.jsp ";

forward:请求转发 和 redirect:重定向

注意:此种方式不会被视图解析器加上前缀(/views)和后缀(.jsp)。

3. 处理静态资源(html,css,js,图片,视频)

动态:可以与用户交互,或者因为时间、地点的不同而结果不同的内容。例如:百度搜索天气情况。

在springmvc中,如果直接访问静态资源:404。

原因:之前将所有的请求通过 通配符“/” 拦截,进而交给了SpringMVC的 入口DispatcherServlet 去处理,然而 DispatcherServlet 处理的方式是:寻找该请求映射对应的@RequestMapping。

解决:如果是 需要mvc处理的,则交给@RequestMapping处理;如果不需要springmvc处理,则使用tomcat默认的Servlet去处理。

tomcat默认的Servlet:如果有 对应的请求拦截,则交给相应的Servlet去处理;如果没有对应的Servlet,则直接访问。

tomcat默认的Servlet在哪?在tomcat配置文件/conf/web.xml中

解决静态资源方案:

如果有对应的@RequestMapping,则交给springmvc处理;如果没有对应的@RequestMapping,则交给服务器tomcat默认的Servlet处理。

实现方法:只需要增加2个配置即可

在springmvc.xml中配置

<!--该配置会让springmvc:接受一个请求,并且该请求 没有对应的@RequestMapping时,
将该请求交给tomcat默认的Servlet处理(直接访问)
-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>

<mvc:annotation-driven></mvc:annotation-driven>
           

4. 类型转换

  1. springmvc自带一些 常见的类型转换器

    如:public String welcome4(@PathVariable(“name”) String tt){},既可以接受int类型数据tt,也可以接受String类型的数据tt。

  2. 自定义类型转换器
    SpringMVC视图解析器、处理静态资源、类型转换等一大堆InternalResourceViewResolver其他功能:
    i.编写 自定义类型转换器的类(实现Converter接口)
    SpringMVC视图解析器、处理静态资源、类型转换等一大堆InternalResourceViewResolver其他功能:
    ii. 配置:将自定义的类型转换器(MyConverter)加入到springmvc中
<!-- 1.将自定义转换器纳入SpringIoC容器中 -->
 <bean id="myConverter" class="com.ph.converter.MyConverter"></bean>
 
 <!-- 2.将myConverter再纳入SpringMVC提供的转换器Bean -->
 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
 	<property name="converters">
 		<set>
 			<ref bean="myConverter"/>
 		</set>
 	</property>
 </bean>
 
 <!-- 3.将conversionService注册到annotation-driven中 -->
 <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
           

iii.测试

@RequestMapping(value="testConverter")
	<!--studentInfo是前端表单中的name中的值-->
	public String RHeadder(@RequestParam("studentInfo") Student  student) {
		System.out.println(student);
		return "success";
	}
           

其中@RequestParam(“studentInfo”) 是触发转换器的桥梁:

@RequestParam(“studentInfo”) 接受的数据 是前端传递过来的:2-lw-23,但是 需要将该数据 赋值给 修饰的目标对象Student;因此SpringMVC会发现 接受的数据 和 目标数据 不一致,并且这两种数据分别是String、Student,正好符合自定义的转换器,所有会触发。

5. 数据格式化

SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd”);

SpringMVC提供了很多注解,方便我们数据格式化

实现步骤:

a.配置

<!-- 配置 数据格式化 注解 所依赖的bean 
FormattingConversionServiceFactoryBean:既可以实现格式化,又可以实现类型转换
-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean>
           

b.通过注解使用

//格式化前台传过来的数据,将前台输入的数据 固定为yyyy-MM-dd
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
           
@RequestMapping("testDateFormat")
public String testDateFormat(Student student,BindingResult result) {
/*参数BindingResult 必须跟在Student参数的后面,
 需要验证的数据是Student中的birthday,SpringMVC要求 如果校验失败 ,
 则将 错误信息自动放入 该对象之后紧挨着的BindingResult中。
*/
	System.out.println(student.getId()+"-"+student.getName()+"-"+student.getBirthday());
	if(result.getErrorCount()>0) {
		for(FieldError error : result.getFieldErrors()) {
			System.out.println(error.getDefaultMessage());
		}
	}
	return "success";
}
           

@DateTimeFormat(pattern=“yyyy-MM-dd”)

@NumberFormat(pattern=“###,#”)