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. 类型转换
-
springmvc自带一些 常见的类型转换器
如:public String welcome4(@PathVariable(“name”) String tt){},既可以接受int类型数据tt,也可以接受String类型的数据tt。
- 自定义类型转换器 i.编写 自定义类型转换器的类(实现Converter接口) 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=“###,#”)