Struts温习(7)--国际化的使用

本文详细介绍了如何使用 Struts 实现应用的国际化,包括配置资源文件、使用标签显示不同语言的消息、验证规则与错误信息展示等核心步骤。

这里的国际化其实跟第五篇文章第一篇文章要实现的效果一样,也是登录验证信息,只不过是国际化处理而已,多了几个国际化的配置文件

这里我要说下,可能第一篇文章和第五篇文章看完后,好多人都还有疑问

关于第一篇文章的疑问就是,为什么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"/>&nbsp;<br/>
    	<bean:message key="pwd"/>:<html:password property="pwd" redisplay="false" />&nbsp;<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\u6301
loginname=\u7528\u6237\u540D
pwd=\u5BC6\u7801


button.submit=\u63D0\u4EA4
button.reset=\u91CD\u7F6E

welcome= \u6B22\u8FCE\: {0}, \u5F53\u524D\u65F6\u95F4\: {1}

loginname.error=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
pwd.error=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A

 msg_en_US.properties

title=Java I18N
loginname=LoginName
pwd=Password

button.submit=Submit
button.reset=Reset

welcome= 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\u6301
loginname=\u7528\u6237\u540D
pwd=\u5BC6\u7801


button.submit=\u63D0\u4EA4
button.reset=\u91CD\u7F6E

welcome= \u6B22\u8FCE\: {0}, \u5F53\u524D\u65F6\u95F4\: {1}

loginname.error=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
pwd.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);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值