本节重点:拦截器(责任链模式)、类型转换、国际化、验证
1、拦截器:实现HandlerInterceptor接口或继承HandlerInterceptorAdapter
<!-- intercepter -->
<mvc:interceptors>
<!-- 配置多个形成拦截器链 -->
<mvc:interceptor>
<!-- /**将拦截所有包括静态资源但不包括jsp,如果jsp包含静态js也会经过拦截器 -->
<!-- /*只拦截一级目录下所有Controller,如:/he.action,不拦截二级目录及静态资源 -->
<mvc:mapping path="/**"/>|<mvc:mapping path="/*"/>
<!-- 如果拦截了所有,必须设置放过静态资源 -->
<mvc:exclude-mapping path="/static/**"/>
<bean class="com.cssl.interceptor.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="引用的类名首字母小写"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器参数handler中包含请求类及方法,可以精确控制调用方法权限
handler.toString().indexOf(“方法名”)!=-1
2、类型转换:
a、基本类型的数据类型转换自动完成
日期类型转换(springmvc只提供yyyy/MM/dd这样的格式转换)
b、@InitBinder //注解方式方法名可以任意命名,只能转换一种格式
public void initBind(DataBinder binder){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//true表示该日期字段可以为空
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf,false));
}
c、直接在vo的属性上(get|set也可以)注解@DateTimeFormat(pattern=“yyyy-MM-dd”)
BindingResult:该类封装转换失败的信息,必须紧跟在command类型参数后面,日期必须是command属性
**result.hasErrors()**判断是否转换出错
3、自定义类型转换:
Spring3引入了一个Converter接口,它支持从一个Object转为另一个Object。除了Converter接口之外,实现 ConverterFactory接口和GenericConverter接口也可以实现我们自己的类型转换逻辑。
A、定义转换类实现Converter<S,T>接口重写convert实现类型转换功能
B、添加注解@Component注册到bean到Spring容器
C、配置
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="dateConverter"/>
</set>
</property>
</bean>
或者手动注入日期格式类型:
<set>
<bean class="com.cssl.converter.DateConverter">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd"/>
</bean>
</set>
D、修改<mvc:annotation-driven conversion-service="conversionService"/>
4、国际化:IE11设置语言问题(不显示中文可以先删除英文语言选项)
<!-- 资源文件绑定器(使用Spring标签配置) -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="message"/>
<property name="useCodeAsDefaultMessage" value="true"/>
</bean>
在JSP文件中使用fmt标记就可以实现浏览器语言国际化
如:
<fmt:setBundle basename="message"/>
<fmt:message key="info.login.title" />
其中的info.login.title和你的资源文件对应.
另外一种方式是使用spring自带的标签显示国际化信息
如:<spring:message code="main.title" />
注意:使用springmvc标签必须配置监听器,除非是通过控制器访问页面
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
属性文件显示中文插件:
Eclipse Marketplace->find properties->选择Properties Editor
5、Spring3开始支持JSR-303验证框架:
验证使用的包hibernate-validator-5.0.1.Final-dist
最少需要4个jar:
hibernate-validator-5.0.1.Final.jar
required:classmate-0.8.0.jar、jboss-logging-3.1.1.GA.jar、validation-api-1.1.0.Final.jar
注解:
1、在vo参数前添加@Validated|@Valid,后面紧跟BindingResult参数不能间隔其他参数
2、在实体类要验证的属性getXxx上添加各种验证注解
@NotNull(空对象)、 @NotEmpty(字符串)、@NotBlank(去首尾空格)、 @Size(min=4,max=6)、@Email
3、使用<sf:errors path="vo.fieldName"/>显示错误(vo对应实体类首字母小写UsersVo-usersVo)
4、国际化显示可以不写message,有默认出错信息提示,如果想自定义则修改键名(key)为:
Size.usersVo.name ,其含义为(Size代表@Size,usersVo代表vo,name代表fileName)