struts2国际化全例 错误解决

在struts2中需要做国际化的有:

jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化

在之前的例子中已经做过和国际化相关的例子了,在struts.xml中配置过

 

view
plain
copy
to clipboard
print?

  1. <constant name="struts.custom.i18n.resources" value="message"></constant>   

 

 

其中的message就是国际化资源文件的baseNmae。

我们先看看简单的在jsp中进行国际化

在src目录下新建message_en_US.properties,内容为

hello=add user

新建message_zh_CN.properties文件,内容为

hello=\u589e\u52a0\u7528\u6237

然后修改register2.jsp

要想使用国际化显示,可以将信息添加到<s:text></s:text> 标签中,也可以放在<s:i18n></s:i18n> 中,

在这里,先使用标签 <s:text></s:text>

增加以下内容:

 

view
plain
copy
to clipboard
print?

  1. <s:text name="hello"></s:text>   

 

 

重启服务器后,浏览该页,默认会显示出“增加用户”,可以在IE中打开Internet选项,在常规中选择语言,增加英语(美国)[en-US],然后设置为第一项,刷新就可以看到输出“add user”。

这边很可能会出一种错误,如下:

The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when
the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]
 at org.apache.struts2.views.jsp.TagUtils.getStack(TagUtils.java:60)
 at org.apache.struts2.views.jsp.StrutsBodyTagSupport.getStack(StrutsBodyTagSupport.java:44)
 at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:48)
 at org.apache.jsp.basicinfo.basicInfo_jsp._jspx_meth_struts_005fform_005f0(basicInfo_jsp.java:122)
 at org.apache.jsp.basicinfo.basicInfo_jsp._jspService(basicInfo_jsp.java:93)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
 at java.lang.Thread.run(Thread.java:619)

web.xml相关配置如下:

  <filter>
   <filter-name>struts2</filter-name>
   <filter-class>
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
   </filter-class>
 <init-param>
  <param-name>config</param-name>
  <param-value>struts-default.xml,struts-plugin.xml,/config/struts.xml </param-value>
 </init-param>    
  </filter>
  <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>*.action</url-pattern>
  </filter-mapping>

 

原因是因为过滤器只过滤action结尾的请求

但我在JSP页面中使用了 struts的tag

所以请求不会被struts的过滤器处理

标签也就无法解析

 

修改web.xml即可:

<url-pattern>/*</url-pattern>

action错误的国际化

在message_en_US.properties中增加以下内容

username.invalid=username invalid...

在message_zh_CN.properties中增加以下内容

username.invalid=\u7528\u6237\u540d\u4e0d\u5408\u6cd5...

修改RegisterAction中的validate方法,将错误加到ActionError中,在这里将使用到ActionSupport中的getText方法获得和国际化资源文件相关的信息。

以username验证为例:

 

view
plain
copy
to clipboard
print?

  1. if (null == username || username.length() < 5 || username.length() > 10) {   
  2.   
  3.     this.addActionError(this.getText("username.invalid"));   
  4.   
  5. }   

这样就从资源文件中读取username.invalid的值,增加到ActionError中。

 

查看该页面不输入任何数据,提交后就可以看到显示效果了。

 

验证框架的国际化(field级别错误)

在message_en_US.properties文件中增加以下内容

username.xml.invalid=validate information

在message_zh_CN.properties文件中增加以下内容

username.xml.invalid=\u9a8c\u8bc1\u6846\u67b6\u4fe1\u606f

然后修改验证框架,需要将在properties文件中的内容增加到框架中。

以username为例 

 

view
plain
copy
to clipboard
print?

  1. <field name="username">   
  2.     <field-validator type="requiredstring">   
  3.         <param name="trim">true</param>   
  4.         <message key="username.xml.invalid"></message>   
  5.     </field-validator>   
  6. </field>   

 

在message标签中增加属性key,值为properties文件中的key

标签中key大多是和国际化相关的

 

国际化资源文件的分类

当应用程序很大时,需要国际化的东西会很多,因此需要将国际化资源文件进行分类。

需要知道的是在src中的properties文件是全局资源文件,另外还可以分为包级别的和类级别的

首先看看包级别的

命名规则为package_language_country.properties

新建package_en_US.properties,内容为

username.xml.invalid=package validate information

新建package_zh_CN.properties,内容为

username.xml.invalid=\u5305\u9a8c\u8bc1\u4fe1\u606f

可以看到输出的信息为“包验证信息”,由此可见包级别的国际化资源文件的优先级高于全局国际化资源文件。

 

类级别

新建RegisterAction_en_US.properties,内容为

username.xml.invalid=class validate information

新建RegisterAction_zh_CN.properties,内容为

username.xml.invalid=\u7c7b\u9a8c\u8bc1\u4fe1\u606f

此时可以看到输出的信息为“类验证信息”。

由此可以得到国际化资源文件的优先级

全局<包级别<类级别

另外要进行表单的国际化时,要去掉theme="simple"

在RegisterAction_en_US.properties中增加

username.name=username

在RegisterAction_zh_CN.properties中增加

username.name=\u7528\u6237\u540d

修改表单标签

 

view
plain
copy
to clipboard
print?

  1. <s:textfield name="username" key="username.name"></s:textfield>   

 

 

注意到key一般是和国际化相关的。

另外除了用

 

 

另外除了用<s:text>这个标签外,还可以使用<s:i18n>这个标签

 

view
plain
copy
to clipboard
print?

  1. <s:i18n name="temp"></s:i18n>   

 

 

标签中包含name,代表着可以定义资源文件的baseName,如可以定义成temp,那么对应着

temp_en_US.properties和temp_zh_CN.properties这两个资源文件。

 

如定义:

 

 

view
plain
copy
to clipboard
print?

  1. <s:i18n name="hello">   
  2.     <s:text name="world">   
  3.         <s:param>struts2</s:param>   
  4.     </s:text>   
  5. </s:i18n>   

 

 

注意到可以在<s:text>标签中增加<s:i18n> 标签。

在hello_en_US.properties文件中增加

world=hello {0}

hello_zh_CN.properties中增加

world=\u4f60\u597d,struts2

在struts2的默认拦截器栈中已经定义了i18n拦截器,所以struts2已经是一个国际化的框架了。

struts2会查找从客户端提交的request_locale属性,并存到session中的WW_TRANS_I18N_LOCALE字段

中。

这个<s:text> 标签外,还可以使用<s:i18n> 这个标签  

view
plain
copy
to clipboard
print?

  1. <s:i18n name="temp"></s:i18n>   

 总结一下显示方法: 

<s:textname="hello"></s:text>

getText("username.invalid") 

<message key="username.xml.invalid"></message>  

<s:textfield name="username" key="username.name"></s:textfield>    

<s:i18n name="temp"></s:i18n>

时间: 2024-11-08 17:47:55

struts2国际化全例 错误解决的相关文章

struts2+UrlRewriteFilter配置404错误解决办法

1.UrlRewriteFilter 应在 struts2过滤器前. 2.struts2的filtermap应如此修改,否则会报404错误.  代码如下 复制代码 <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher&g

imageloader-Imagrloader 的library 导入全是错误 求解决

问题描述 Imagrloader 的library 导入全是错误 求解决 老是报那个asseration 有错误 不想要jar文件的 因为看不见源码 求助 解决方案 参考:http://blog.csdn.net/braddoris/article/details/41542023

求解决,急用啊大神们,Struts2配置文件首行错误

问题描述 求解决,急用啊大神们,Struts2配置文件首行错误 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd&quo

AIX中使用DBCA创建数据库ora-12547错误解决一例

                         AIX中使用DBCA创建数据库ora-12547错误解决一例    Could not load program oracledevmdm:  Symbol resolution failed for /usr/lib/libc.a[aio_64.o] because:          Symbol kaio_rdwr64 (number 1) is not exported from dependent            module /

struts2国际化

在struts2中需要做国际化的有: jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化,校验错误信息的国际化 jsp页面的国际化 第一步 在src目录下新建tanggao_en_US.properties,内容为 username=username password=password tanggao_zh_CN.properties文件,内容为 username=\u7528\u6237\u540D password=\u5BC6\u7801 第二步 在struts.xml

IIS5 HTTP500内部错误解决办法

iis|错误|解决 iis5的http 500内部服务器错误是我们经常碰到的错误之一,它的主要错误表现就是asp程序不能浏览但htm静态网页不受影响.另外当错误发生时,系统事件日志和安全事件日志都会有相应的记录. 具体如下:(一)ie中的表现 当浏览以前能够正常运行的asp页面时会出现如下的错误: 网页无法显示 您要访问的网页存在问题,因此无法显示. 请尝试下列操作: 打开 http://127.0.0.1 主页,寻找指向所需信息的链接. 单击刷新按钮,或者以后重试. http 500 - 内部

ORA-00600 [2662]错误解决过程

错误|过程|解决 ORA-00600 [2662]错误解决过程 数据库版本:7.3.2   背景: 客户那边数据库突然出现一个current日志文件坏了,导致数据库crash了,然后现场工程师使用_ALLOW_RESETLOGS_CORRUPTION = TRUE这个隐含参数,做了不完全恢复后强行将数据库打开.可是打开数据库后发现只能用internal用户连接进去,别的用户连接都报错,错误信息如下: ORA-00600: internal error code, arguments: [2662

IIS5 HTTP500内部错误解决办法(转自eNet)-------(三)

iis|错误|解决 三.解决办法 知道了导致HTTP 500内部错误的原因,解决起来就比较简单了,那就是人工同步IWAM账号在Active Directory.IIS metabase数据库和COM+应用程序中的密码. 具体操作分三步,均需要以管理员身份登录计算机以提供足够的操作权限(IWAM账号以IWAM_MYSERVER为例). (一)更改Active Directory中IWAM_MYSERVER账号的密码 因IWAM账号的密码由系统控制,随机产生,我们并不知道是什么,为完成下面两步的密码

Maven 项目关于 plexus-utils:jar的错误解决

Maven 项目关于 plexus-utils:jar的错误解决 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Failure to transfer org.codehaus.plexus: