Struts温习(7)--国际化的使用
这里的国际化其实跟第五篇文章和第一篇文章要实现的效果一样,也是登录验证信息,只不过是国际化处理而已,多了几个国际化的配置文件
这里我要说下,可能第一篇文章和第五篇文章看完后,好多人都还有疑问
关于第一篇文章的疑问就是,为什么msg.properties这个配置文件会为登录页面服务,并且会显示用户名和密码的错误信息
首先呢我们看,由于资源文件和验证规则文件都在struts-config.xml中配置了,虽然msg.properties并没有出现跟登录页面对应的loginname和pwd,但是我们看到了validator.xml中出现了这两个属性,并且将两个属性对应出错的信息关联到msg.properties中去,因此呢,登录页面就通过validator.xml与msg.properties关联起来了,至于为什么会显示错误信息呢
我不得不提上篇文章中介绍到的html:message标签了,这个标签的作用就是
?在页面中取出消息:
?? ? ?错误消息:<html:errors>, <html:messages id="msg">...
?? ? 提示消息:<html:messages id="msg" message="true">
这里的id="msg"这是种规定写法,不能改成别的了,所以如果取的是错误消息的话,messge=true就不用设置了,如第一篇文章中
<html:messages id="msg">
?? <li><bean:write name="msg"/></li>
?? </html:messages>
这个就用来显示配置文件中关于错误的信息
,如第五篇文章的话,因为在LoginForm中配置有
if(this.loginname == null || "".equals(this.loginname)){
ActionMessage msg = new ActionMessage("用户名不能为空",false);
errors.add(ActionErrors.GLOBAL_MESSAGE, msg);
}
if(this.pwd == null || "".equals(this.pwd)){
ActionMessage msg = new ActionMessage("密码不能为空",false);
errors.add(ActionErrors.GLOBAL_MESSAGE, msg);
}
这段代码起了作用,就在页面上匹配的显示出来了,其实我上面说的关于第五篇文章的疑问其实不用疑问,因为他是将验证放在LoginForm中,而LoginForm正好是用来接收登录页面信息的,所以自然就匹配验证上了
关于这一篇要讲的国际化,其实也是跟第一篇文章差不多,就多几个资源配置文件,不过不用配置验证文件,而是将页面的文本域属性名称值直接配置到资源文件中,而不像第一篇那样通过validator.xml与资源文件联系起来了
login.jsp
<%@ page pageEncoding="UTF-8"%><%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %><%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %><%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %><%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title><bean:message key="title"/></title> </head> <body> <h3><bean:message key="title"/></h3><hr/> <ul> <html:messages id="msg"> <li style="color:red"><bean:write name="msg"/></li> </html:messages> </ul> <form action="login.do" method="post"> 用户:<input type="text" name="loginname" value="${param.loginname}"><br/> 密码:<input type="text" name="pwd" value="${param.pwd }"><br/> <input type="submit" value="提交"> </form> </body></html>??关于表单元素完全也可以通过HTML标签表示,效果是一样的
<html:form action="login.do" method="post"> <bean:message key="loginname"/>:<html:text property="loginname"/> <br/> <bean:message key="pwd"/>:<html:password property="pwd" redisplay="false" /> <br/> <html:submit><bean:message key="button.submit"/></html:submit> </html:form>
看到上面的html:messgaes没有,由于没有配置属性message=true,所以显示的是错误信息,关于错误信息在LoginForm中都已经通过ActionErrors写好了?
?LoginForm.java
package com.javacrazyer.web.formbean;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessage;/** * 用来收集客户端提交数据. * 要收集数据的属性的名一定要跟请求参数名相同 * */public class LoginForm extends ActionForm {public ActionErrors validate(ActionMapping mapping,HttpServletRequest request) {ActionErrors errors = new ActionErrors();if(this.loginname == null || "".equals(this.loginname)){ActionMessage msg = new ActionMessage("loginname.error");errors.add("loginname", msg);}if(this.pwd == null || "".equals(this.pwd)){ActionMessage msg = new ActionMessage("pwd.error");errors.add("pwd", msg);}return errors;}private static final long serialVersionUID = 6619272689058619128L;private String loginname;private String pwd;public String getLoginname() {return loginname;}public void setLoginname(String loginname) {this.loginname = loginname;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}}?msg.properties
title=Java\u56FD\u9645\u5316\u652F\u6301loginname=\u7528\u6237\u540Dpwd=\u5BC6\u7801button.submit=\u63D0\u4EA4button.reset=\u91CD\u7F6Ewelcome= \u6B22\u8FCE\: {0}, \u5F53\u524D\u65F6\u95F4\: {1}loginname.error=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7Apwd.error=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A?msg_en_US.properties
title=Java I18Nloginname=LoginNamepwd=Passwordbutton.submit=Submitbutton.reset=Resetwelcome= Welcome: {0}, currDate: {1}loginname.error= LoginName Can not be Null!pwd.error=Password Can not be Null\!?msg_zh_CN.properties
title=Java\u56FD\u9645\u5316\u652F\u6301loginname=\u7528\u6237\u540Dpwd=\u5BC6\u7801button.submit=\u63D0\u4EA4button.reset=\u91CD\u7F6Ewelcome= \u6B22\u8FCE\: {0}, \u5F53\u524D\u65F6\u95F4\: {1}loginname.error=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7Apwd.error=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A?
?LoginAction.java
package com.javacrazyer.web.action;import java.util.Date;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.action.ActionMessage;import org.apache.struts.action.ActionMessages;import com.javacrazyer.service.UserService;import com.javacrazyer.web.formbean.LoginForm;/** * 业务控制器:控制业务处理的流程 * */public class LoginAction extends Action {//具体业务流程处理方法,由Struts框架回调public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {//取数据LoginForm loginForm = (LoginForm)form;String loginname = loginForm.getLoginname();String pwd = loginForm.getPwd();//调用业务逻辑UserService service = new UserService();boolean flag = service.validate(loginname, pwd);//跳转if(flag){//成功//创建一个普通消息ActionMessage msg = new ActionMessage("welcome", new Object[]{loginname, new Date()});//添加到消息容器中ActionMessages msgs = new ActionMessages();msgs.add("succ", msg);//保存到请求属性域内this.saveMessages(request, msgs);return mapping.findForward("succ");}else{//失败request.setAttribute("errorMsg", "你输入的用户名或密码有误,请返回,重新登录!!!");return mapping.findForward("failure");}}}?WEB-INF/struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"><struts-config><!-- ================================================ Form Bean Definitions --> <form-beans> <form-bean name="loginForm" type="com.javacrazyer.web.formbean.LoginForm"></form-bean> </form-beans><!-- =========================================== Action Mapping Definitions --> <action-mappings><action path="/login" name="loginForm" type="com.javacrazyer.web.action.LoginAction"input="/login.jsp"><forward name="succ" path="/succ.jsp"/><forward name="fail" path="/failure.jsp"/></action> </action-mappings> <message-resources parameter="msgs"/></struts-config>
?succ.jsp
<%@ page pageEncoding="UTF-8"%><%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %><%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> </head> <body> <html:messages id="msg" message="true"> <bean:write name="msg"/> </html:messages> </body></html>
看到succ.jsp的messge=true这个属性没有,这就是要显示提示信息,而非错误信息,这些提示信息在LoginAction处理登录成功的代码中ActionMessages已经写好了
?failure.jsp
<%@ page pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>登录失败</title> </head> <body> <h3>登录失败</h3><hr/> <h2 style="color:red">可能的原因是:${errorMsg}</h2> </body></html>?好了,最后回顾下struts的国际化操作要点吧
1. 提供资源文件:msgs.properties,msgs_zh_CN.properties,....
2. 在struts配置文件中用<message-resources parameter=“资源文件的基本名”>元素来声明资源文件基本名
3. 页面中:
?? 1)显示文件信息需要使用:<bean:message key="..."/>
?? 2) 程序中怎么产生国际化的提示消息和错误消息:
?? ? ?ActionMessage msg = new AcctionMessage("key", Object[] );
?? ? ?如果是错误信息
?? ? ?ActionErrors errors = new ActionErrors();
?? ? ?errprs.add("loginname",msg);
?? ? ?如果是提示信息
??ActionMessages msgs = new ActionMessages();
?msgs.add("succ", msg);
?