目的:
@1在视图层显示的文字显国际化
@2数据验证后显示国际化
@3通过超链接的参数,让客户自动选择国际化
1:在spring.xml中配置国际化类,让容器管理国际化
2:在页面显示国际化:可以使用spring的标签<st:message code="userName"></st:message>
@2数据验证
1: 代码层数据验证:自动装配 MessageSource source java代码层根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中
2:属性类数据验证:使用自定义数据验证注解,在springmvc.xml中创建bean,l设置属性数据验证,并引用国际化messagesource,可以让数据验证达到国际化效果
@3:使用LocaleChangeInterceptor拦截器,拦截指定参数的值,然后使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中
//spring.xml
<!--国际化 id必须为后两个单词,第一个单词小写 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename"> <value>/ui</value> </property> </bean>
//jsp
<%@page import="java.util.List"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://www.springframework.org/tags/form" prefix="s"%> <%@taglib uri="http://www.springframework.org/tags" prefix="st"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> <script type="text/javascript"> function $(name){ return document.getElementsByName(name); } /* 前端验证 在跳转到后台服务器之前进行验证 安全性差 减轻服务器压力 */ function checkForm(){ var userName=$("userName")[0].value; /** if(userName==null || userName==‘‘){ alert(‘请输入用户名‘); return; }**/ document.forms[0].submit(); } </script> </head> <body> <a href="${pageContext.request.contextPath}/anation?request_locale=zh_CN">中文</a> <a href="${pageContext.request.contextPath}/anation?request_locale=en_US">英文</a> <form action="${pageContext.request.contextPath}/formValidate.action" method="post"> <st:message code="userName"></st:message>:<input type="text" name="userName"/> <font color="red"><s:errors path="user.userName"></s:errors> </font><br/> <st:message code="phone"></st:message> <input type="text" name="phone"/> <font color="red"><s:errors path="user.phone"></s:errors> </font><br/> 邮件 <input type="text" name="email"/> <font color="red"><s:errors path="user.email"></s:errors></font><br/> 密码 <input type="password" name="password"/><s:errors path="user.password"></s:errors><br/> 再次密码 <input type="password" name="repassword"/> <s:errors path="user.repassword"></s:errors><br/> <input type="button" onclick="checkForm()" value="提交"/><br/> </form> </body> </html>
@2:自动装配
package com.crazy.goods.tools.validator; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ValdAction { @Autowired private MessageSource source; /** * 当@Valid注解标示的实体 验证失败后 * 所有的错误消息都被注入到BindingResult对象中 * 还可以在jsp上使用${userInfo.name}获取到对象的值 * * 显示错误时 springmvc标签的path 由对象名(类名第一个字母小写).属性名 * @ModelAttribute("user") 可以单独使用,无需和@valid一起使用 可以修改对象名 在页面上使用对象的属性获取值 是放在request区域内 * @ sessionAttribute 存在session区域内,一般不用 * 3种方法可以将数据传递到模型中 * 1:new ModelAndView("vald/suc",map) * 2:Model.addAttribute() * 3:ModelMap.put() 他是hashmap的子类 * * @param user * @param result * @return * @Valid 注解 :当经过springmvc调用时,看到参数有这个注解,就会跑到属性类进行验证,如果验证失败,会将失败的信息放在BindingResult类里面 * @Valid UserInfo user 如果前面不加@ModelAttribute(name="user") 那么对象的名字为第一个字母小写 userInfo */ @RequestMapping(value="/formValidate") public String user(@ModelAttribute(name="user") @Valid UserInfo user,BindingResult result,Locale locale){ if(!user.getPassword().equals(user.getRepassword())){ //根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中 String errorMsg=source.getMessage("passwordError", null, locale); result.addError(new FieldError("user", "repassword", errorMsg)); } if(result.hasErrors()){ return "vald/form"; } return "vald/suc"; } @RequestMapping(value="/formValidate1") public String uploadpage() { return "vald/form"; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * //Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); * @param user * @param result * @return */ @RequestMapping(value="/model") public ModelAndView model(HttpServletRequest request){ //request.setAttribute("sex", "男"); Map map=new HashMap(); map.put("age", 100); map.put("sex", "男"); ModelAndView mav=new ModelAndView("vald/suc",map);//Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); return mav; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * * @param user * @param result * @return */ @RequestMapping(value="/model1") public String model(Model model,ModelMap mm){ //request.setAttribute("sex", "男"); model.addAttribute("age", 100); model.addAttribute("sex", "男"); mm.put("name", "zs"); return "vald/suc"; } }
@2。2//springmvc.xml 设置属性数据验证,并引用国际化messagesource,可以让数据验证达到国际化效果
<!-- springmvc默认的验证 就是实例化了 一个LocalValidatorFactoryBean的实例 其中没有实现国际化 手工创建一个该类的实例 并且注入 messageSouce 才能国际化 --> <bean id="myvlidat" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="validationMessageSource" ref="messageSource"></property> </bean>
@3
<!-- 如果引用这个类,那么i18n拦截器获取到的值会调用 AcceptHeaderLocaleResolver 存储 不支持 存储 setLocale 使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中 --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean> <mvc:interceptors> <!-- 定义i18n拦截器 用于获取请求头中的 locale对象 zh_CN 默认获取到了 request_locale的值 会调用 AcceptHeaderLocaleResolver 存储 不支持 存储 setLocale 使用 SessionLocaleResolver 替代默认 将locale对应的值存放 session中 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"> <property name="paramName" value="request_locale"></property> </bean> </mvc:interceptors> -->
//action
package com.crazy.goods.tools.validator; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class ValdAction { @Autowired private MessageSource source; /** * 当@Valid注解标示的实体 验证失败后 * 所有的错误消息都被注入到BindingResult对象中 * 还可以在jsp上使用${userInfo.name}获取到对象的值 * * 显示错误时 springmvc标签的path 由对象名(类名第一个字母小写).属性名 * @ModelAttribute("user") 可以单独使用,无需和@valid一起使用 可以修改对象名 在页面上使用对象的属性获取值 是放在request区域内 * @ sessionAttribute 存在session区域内,一般不用 * 3种方法可以将数据传递到模型中 * 1:new ModelAndView("vald/suc",map) * 2:Model.addAttribute() * 3:ModelMap.put() 他是hashmap的子类 * * @param user * @param result * @return * @Valid 注解 :当经过springmvc调用时,看到参数有这个注解,就会跑到属性类进行验证,如果验证失败,会将失败的信息放在BindingResult类里面 * @Valid UserInfo user 如果前面不加@ModelAttribute(name="user") 那么对象的名字为第一个字母小写 userInfo */ @RequestMapping(value="/formValidate") public String user(@ModelAttribute(name="user") @Valid UserInfo user,BindingResult result,Locale locale){ if(!user.getPassword().equals(user.getRepassword())){ String errorMsg=source.getMessage("passwordError", null, locale); result.addError(new FieldError("user", "repassword", errorMsg)); } if(result.hasErrors()){ return "vald/form"; } return "vald/suc"; } @RequestMapping(value="/formValidate1") public String uploadpage() { return "vald/form"; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * //Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); * @param user * @param result * @return */ @RequestMapping(value="/model") public ModelAndView model(HttpServletRequest request){ //request.setAttribute("sex", "男"); Map map=new HashMap(); map.put("age", 100); map.put("sex", "男"); ModelAndView mav=new ModelAndView("vald/suc",map);//Model传递的键值对 实际上还是存放request.setAttribute("sex", "男"); return mav; } /** * 演示无耦合的方式传递数据 * request.setAttribute() 耦合 * * @param user * @param result * @return */ @RequestMapping(value="/model1") public String model(Model model,ModelMap mm){ //request.setAttribute("sex", "男"); model.addAttribute("age", 100); model.addAttribute("sex", "男"); mm.put("name", "zs"); return "vald/suc"; } }
时间: 2024-10-25 09:40:05