struts2充分国际化案例 错误解决
在struts2中须要做国际化的有:
jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化。校验错误信息的国际化
在之前的样例中已经做过和国际化相关的样例了,在struts.xml中配置过
- <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>
添加下面内容:
- <s:text name="hello"></s:text>
重新启动server后,浏览该页,默认会显示出“添加用户”,能够在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验证为例:
- ) {
- this.addActionError(this.getText("username.invalid"));
- }
这样就从资源文件里读取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为例
- <field name="username">
- <field-validator type="requiredstring">
- <param name="trim">true</param>
- <message key="username.xml.invalid"></message>
- </field-validator>
- </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
改动表单标签
- <s:textfield name="username" key="username.name"></s:textfield>
注意到key通常是和国际化相关的。
另外除了用
另外除了用<s:text>这个标签外。还能够使用<s:i18n>这个标签
- <s:i18n name="temp"></s:i18n>
标签中包括name,代表着能够定义资源文件的baseName。如能够定义成temp。那么相应着
temp_en_US.properties和temp_zh_CN.properties这两个资源文件。
如定义:
- <s:i18n name="hello">
- <s:text name="world">
- <s:param>struts2</s:param>
- </s:text>
- </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会查找从client提交的request_locale属性,并存到session中的WW_TRANS_I18N_LOCALE字段
中。
这个<s:text> 标签外,还能够使用<s:i18n> 这个标签
- <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>
版权声明:本文博主原创文章,博客,未经同意不得转载。
struts2充分国际化案例 错误解决的更多相关文章
- struts2校验器规范错误解决
今天struts2的校验器的配置文件文件头出现了错误,配置如下: <!DOCTYPE validators PUBLIC "-//OpenSymphony Group// ...
- Unable to find ‘struts.multipart.saveDir’ Struts2上传文件错误的解决方法
Unable to find ‘struts.multipart.saveDir’ Struts2上传文件错误的解决方法 在使用struts2的项目中上传文件的时候出现了一个这样的错误: 2011-7 ...
- Struts2 internationalization(国际化)
1:什么是国际化? 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有的与语言,国家/地区和文化相关的元素.换言之,应用程序的功 ...
- struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化
其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用 ...
- 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决
微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...
- ORA-00911: invalid character 错误解决集锦
转: ORA-00911: invalid character 错误解决集锦 参考https://www.linuxidc.com/Linux/2017-05/144361.htm ORA-00911 ...
- MySQL之Field‘***’doesn’t have a default value错误解决办法
这篇文章主要介绍了MySQL之Field‘***’doesn’t have a default value错误解决办法,需要的朋友可以参考下 今天,中国博客联盟有博友反馈,zgboke.com无法提交 ...
- (十四)struts2的国际化
一.国际化的概念 国际化是指web程序在运行时,根据客户端请求的国家.语言的不同而显示不同的界面. 例如,如果请求来自中文客户端,则页面的显示,提示信息等都是中文,如果是英文客户端,则显示英文信息. ...
- Struts2之国际化
时间:2017-1-11 11:12 --国际化Struts2已经对国际化进行了封装,我们只需要根据其提供的API进行访问即可.要使用国际化的Action必须继承ActionSupport.1.什么是 ...
随机推荐
- 彻底删除"提示删除文件和目录"时出错的文件或目录
当删除文件是出现上图时 能够用以下的方法删除文件 策略一:系统大法 第一招 进程帮你搞定 很多时候乱码文件名称里的文件是explorer.exe进程联系在一起的. 假设要删除的话能够这样:首先命令 ...
- VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器
VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...
- ios学习:AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件
首先要导入AVFoundation框架及 #import <AVFoundation/AVFoundation.h>头文件 注意:要在真机上调试 下面是ipad上的调试效果 下面是代码,代 ...
- Linux 利用hosts.deny 防止暴力破解ssh(转)
一.ssh暴力破解 利用专业的破解程序,配合密码字典.登陆用户名,尝试登陆服务器,来进行破解密码,此方法,虽慢,但却很有效果. 二.暴力破解演示 2.1.基础环境:2台linux主机(centos 7 ...
- PVPlayer的实现方式
关于opencore下多媒体播放,在mediaserver进程里面仅仅有一行代码: MediaPlayerService::instantiate(); 这行代码的作用是初始化一个MediaPlaye ...
- poj2479(dp)
题目链接:http://poj.org/problem?id=2479 题意:求所给数列中元素值和最大的两段子数列之和. 分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和. 从右往左扫一遍, ...
- 【iOS】文件下载小记
下载文件到NSURLConnection与NSURLSession两种,一种有恨悠久的历史了. 使用相对麻烦,后者是新出来的,添加了一些额外的功能. 一.NSURLConnection实现下载 TIP ...
- ubuntu linux 13.04更新
首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开: gksu gedit /et ...
- 聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计
JUC包中除了一系列的同步类之外,就是Executor运行框架相关的类.对于一个运行框架来说,能够分为两部分 1. 任务的提交 2. 任务的运行. 这是一个生产者消费者模式,提交任务的操作是生产者,运 ...
- 在Java中如何使用jdbc连接Sql2008数据库(转)
我们在javaEE的开发中,肯定是要用到数据库的,那么在javaEE的开发中,是如何使用代码实现和SQL2008的连接的呢?在这一篇文章中,我将讲解如何最简单的使用jdbc进行SQL2008的数据库的 ...