Struts是一种支持国际化的MVC的WebFramework。可是如何来使用struts国际化是一个问题。下面我们来探讨一下,如何实现Struts的国际化。Web程式的国际化涉及到3个层面。
第一、jsp部分的输入/输出;
第二、应用处理程序的国际化;
第三、DB的国际化问题。
这里主要探讨的是jsp部分的输入/输出问题。
在struts-config.xml中配置message-resources标签
<message-resourcesparameter="resources.MessageResources" />
其中的参数是国际化配置文件MessageResource.properties的文件名。
中文:MessageResource_zh_cn.properties
英文:MessageResource_en_us.properties
源文件:resource.properties表示中文信息
在源文件resource.properties中硬编码中文信息
errors.header=<UL> errors.prefix=<fontcolor="red"><LI> errors.suffix=</LI></font> errors.footer=</UL> login.form.field.username=用户 login.form.field.password=密码 login.form.button.login=登录 login.success={0},登录成功 login.user.not.found=用户不能找到,用户名称=【{0}】 login.password.error=密码错误
然后用java中提供的工具把这些信息转换为unicode放到相应国际化文件中。
MessageResource_zh_cn.properties文件中
errors.header=<UL> errors.prefix=<fontcolor="red"><LI> errors.suffix=</LI></font> errors.footer=</UL> login.form.field.username=\u7528\u6237 login.form.field.password=\u5bc6\u7801 login.form.button.login=\u767b\u5f55 login.success={0},\u767b\u5f55\u6210\u529f login.user.not.found=\u7528\u6237\u4e0d\u80fd\u627e\u5230\uff0c\u7528\u6237\u540d\u79f0=\u3010{0}\u3011 login.password.error=\u5bc6\u7801\u9519\u8bef
引入标签:
<%@ tagliburi="http://struts.apache.org/tags-html"prefix="html"%> <%@ tagliburi="http://struts.apache.org/tags-bean"prefix="bean"%> <formaction="login.do" method="post"> <bean:messagekey="login.form.field.username"/>:<input type="text"name="username"><br> <bean:messagekey="login.form.field.password"/>:<inputtype="password" name="password"></br> <inputtype="submit" value="<bean:messagekey="login.form.button.login"/>"> </form>
bean:message中的属性key指的是国际化文件中的键。
public ActionForwardexecute(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { Stringlang = request.getParameter("lang"); Localelocale = Locale.getDefault(); if("zh".equals(lang)) { locale= new Locale("zh", "CN"); }elseif ("en".equals(lang)) { locale= new Locale("en", "US"); } //将Locale设置到session中 //request.getSession().setAttribute(Globals.LOCALE_KEY,locale); this.setLocale(request,locale); returnmapping.findForward("index"); }
动态信息国际化:
public ActionForwardexecute(ActionMapping mapping, ActionForm form, HttpServletRequestrequest, HttpServletResponse response) throwsException { LoginActionFormlaf = (LoginActionForm)form; Stringusername = laf.getUsername(); Stringpassword = laf.getPassword(); UserManageruserManager = new UserManager(); ActionMessagesmessages = new ActionMessages(); try { userManager.login(username,password); //创建国际化消息文本 ActionMessagemessage = new ActionMessage("login.success", username); messages.add("login_success_1",message); //传递国际化消息 this.saveMessages(request,messages); returnmapping.findForward("success"); }catch(UserNotFoundExceptione) { e.printStackTrace(); //创建国际化消息文本 ActionMessageerror = new ActionMessage("login.user.not.found", username); messages.add("error_1",error); //传递国际化消息 this.saveErrors(request,messages); }catch(PasswordErrorExceptione) { e.printStackTrace(); //创建国际化消息文本 ActionMessageerror = new ActionMessage("login.password.error"); messages.add("error_2",error); //传递国际化消息 this.saveErrors(request,messages); } returnmapping.findForward("error"); }
jsp页面:
<body> <ahref="login.jsp">登录</a> <br> <ahref="changeLang.do?lang=zh">中文</a> <ahref="changeLang.do?lang=en">英文</a> <p> <ahref="login_jstl.jsp">登录(jstl)</a> </body>
动态国际化消息读取:
<body> <html:messagesid="msg" message="true"> <bean:writename="msg"/> </html:messages> </body>
配置国际化Action和资源文件:
<actionpath="/changeLang" type="com.tgb.struts.ChangeLanguageAction" > <forwardname="index" path="/index.jsp"/> </action> <message-resourcesparameter="res.MessageResources" />
res.MessageResources表示的是res包下的MessageResources文件。