SpringMvc 国际化消息处理
来源:互联网 发布:linux 每10秒 shell 编辑:程序博客网 时间:2024/06/07 06:16
类似于将参数放到properties配置文件中进行读取,我们也可以将各种message放到配置文件中
然后按照语言读取不同的配置响应到页面,从而实现国际化。
这里我们学习messageSource的使用。
一,添加配置文件spring-servlet-validator.xml
引入消息配置文件,这里只需要写明文件名中公共部分"message"即可
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- 消息处理,可以直接使用properties的key值,返回的是对应的value值 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames"> <list> <value>classpath:messages/message</value> </list> </property> <!-- 必须设置成false,否则hibernate原有的校验信息无法返回value值--> <property name="useCodeAsDefaultMessage" value="false"/> </bean><!-- 它在启动的时候会初始化hibernate validator,同时它引用的消息显示内容是前面定义的messageSource的消息内容文件 --> <bean id="myValidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <property name="validationMessageSource" ref="messageSource"/> </bean></beans>
二,在Spring-config.xml中引入以上配置:
<!-- Validator设置 --><import resource="classpath*:spring-servlet-validator.xml"/>
并且配置localeResolver bean,管理locale
<!-- 国际化消息处理 --><bean id="localeResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver"><property name="defaultLocale" value="zh_CN" /></bean>三,Spring-servlet.xml 中开启扫描校验:
<mvc:annotation-driven validator="myValidator">四,message配置文件,这里我们准备两个,一个中文,一个英文。放在Classpath下面。
message_zh_CN.properties
#============================= message ===============================msg.success=\u8BBF\u95EE\u6210\u529Fvalid.userInfo.userName=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7Avalid.userInfo.email=\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7Avalid.userInfo.phone=\u7535\u8BDD\u53F7\u7801\u4E0D\u80FD\u4E3A\u5C0F\u6570valid.userInfo.userName.notRepeat=\u7528\u6237\u540D\u5DF2\u5B58\u5728valid.userInfo.userName.notLogin=\u7528\u6237\u540D\u5BC6\u7801\u4E0D\u6B63\u786Emessage_en_US.properties
#============================= message ===============================msg.success=successvalid.userInfo.userName=userName can not be nullvalid.userInfo.email=email can not be nullvalid.userInfo.phone=param phone is errorvalid.userInfo.userName.notRepeat=userName already exsistvalid.userInfo.userName.notLogin=user not login
五,准备工具类,用于获取消息配置的内容
SpringUtils 这里主要是要实现ApplicationContextAware,使用applicationContext.getMessage方法获取。
package com.maven.web.util;import java.util.Locale;import org.springframework.beans.factory.DisposableBean;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.context.annotation.Lazy;import org.springframework.stereotype.Component;import org.springframework.util.Assert;import org.springframework.web.servlet.LocaleResolver;/** * Utils - Spring * */@Component("springUtils")@Lazy(false)public final class SpringUtils implements ApplicationContextAware, DisposableBean {/** applicationContext */private static ApplicationContext applicationContext;/** localeResolver */private static LocaleResolver localeResolver;/** * 不可实例化 */private SpringUtils() {}public void setApplicationContext(ApplicationContext applicationContext) {SpringUtils.applicationContext = applicationContext;}public void destroy() throws Exception {applicationContext = null;}/** * @return applicationContext */public static ApplicationContext getApplicationContext() {return applicationContext;}/** * @param name Bean名称 * @return 实例 */public static Object getBean(String name) {Assert.hasText(name);return applicationContext.getBean(name);}/** * @param name Bean名称 * @param type Bean类型 * @return 实例 */public static <T> T getBean(String name, Class<T> type) {Assert.hasText(name);Assert.notNull(type);return applicationContext.getBean(name, type);}/** * @param code 代码 * @return 国际化消息 */public static String getMessage(String code) {Locale locale = getLocaleResolver().resolveLocale(null);return applicationContext.getMessage(code, null, locale);}/** * @param code 代码 * @param args 参数 * @return 国际化消息 */public static String getMessage(String code, Object[] args) {Locale locale = getLocaleResolver().resolveLocale(null);return applicationContext.getMessage(code, args, locale);}/** * @return localeResolver */private static LocaleResolver getLocaleResolver() {if (localeResolver == null) {localeResolver = getBean("localeResolver", LocaleResolver.class);}return localeResolver;}}准备工作做好了,我们对上一篇的校验规则进行改造。
首先是UserInfoRequest,我们在注解后面加上自定义的message
package com.maven.web.entity;import javax.validation.constraints.Digits;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import org.hibernate.validator.constraints.Email;import com.maven.web.validator.NotRepeat;/** * 接收前端传递数据的映射类 * @author Administrator * */public class UserInfoRequest {@NotNull(message="{valid.userInfo.userName}")@NotRepeatprivate String userName;@Size(min=6, max=8) private String password;@Email private String email; /** * 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度 */ @Digits(integer=11,fraction=0,message="{valid.userInfo.phone}") private String phone;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "UserInfoRequest [userName=" + userName + ", password=" + password + ", email=" + email + ", phone="+ phone + "]";} }
自定义注解@NotRepeat也使用国际化消息替代原来定义的中文消息
package com.maven.web.validator;import static java.lang.annotation.ElementType.ANNOTATION_TYPE;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.RetentionPolicy.RUNTIME;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import javax.validation.Constraint;import javax.validation.Payload;@Target( { METHOD, FIELD, ANNOTATION_TYPE }) @Retention(RUNTIME) @Constraint(validatedBy = UserNameValidator.class) @Documented public @interface NotRepeat {String message() default "{valid.userInfo.userName.notRepeat}";Class<?>[] groups() default {}; public abstract Class<? extends Payload>[] payload() default {}; }在controller中我们也使用上面定义的SpringUtil获取国际化消息。
/** * 校验ajax传递的json字符串 * @param userInfo * @return */@RequestMapping(value="/ajax/post",method=RequestMethod.POST)public Result validAjax(@RequestBody @Valid UserInfoRequest userInfo){logger.info("如果校验通过则打印参数:"+userInfo);Result r = new Result(ErrorCode.SUCCESS);r.setDetailMsg(SpringUtils.getMessage("msg.success"));return r;}接下来访问测试,http://localhost:8088/com.maven.web/valid/ajax/post
更改语音环境为英文
<!-- 国际化消息处理 --><bean id="localeResolver" class="org.springframework.web.servlet.i18n.FixedLocaleResolver"><!-- <property name="defaultLocale" value="zh_CN" /> --><property name="defaultLocale" value="en_US" /></bean>
再次测试:
可以看到返回的提示消息为英文。
使用freemarker也可以在页面上使用我们定义的message,不过这是另外一篇要讲述的了,有空再整理吧。
阅读全文
0 0
- SpringMvc 国际化消息处理
- SpringMVC如何处理国际化
- springMvc视图化,国际化,静态资源处理
- Struts消息国际化及异常处理
- Struts2-11 消息处理与国际化
- 异常的处理以及消息国际化
- Struts2的国际化和消息处理
- Struts2(十二)---消息处理与国际化
- springmvc-4 springmvc视图解析、国际化、静态资源处理
- 学习SpringMVC(十九)之显示错误消息和国际化
- SpringMVC国际化
- SpringMVC国际化
- SpringMVC 国际化
- SpringMVC国际化
- SpringMVC 国际化
- SpringMVC-国际化
- springmvc 国际化
- SpringMVC国际化
- WKWebKit 与js的交互
- Your first Kaa application
- linux修改端口配置
- Spring AOP——Java动态代理
- 通信系统仿真速成第3天:16QAM调制与解调(实验)
- SpringMvc 国际化消息处理
- 接口测试总结(转)
- MVC使用SignalR 提高B2C商城用户体验2
- 多态--回调
- leetcode 572. Subtree of Another Tree
- 第一节:详细透彻解读Git与SVN的区别(集中式VS分布式)
- docker rm -f Error response from daemon: Driver overlay failed to remove root filesystem
- android 属性动画工具类
- 使用JavaScript和SVG来绘制饼状图