多语言展示
当前在线:1893今日阅读:176今日分享:34

struts1.3的国际化

在学struts2之前先把struts1大概的学习一下,虽然说两者相差很大,但是大致的思想都是差不多的,也对于之后学习struts2会有帮助。这里主要分享一下struts1.3的国际化实现,1.3也差不多是struts1中的最新或者是最后的版本了,也跟之前的版本小有区别。我做之前也在网上搜了很多,大都是千篇一律,但是其实都漏了很多,根本实现不了,而且都没怎么讲原理,或者是struts内部到底是怎么实现的,我待会都会说一下,有不妥的望高手指正。 上面图片的英文还没弄。
工具/原料
1

需要的类库及工具

2

*struts1.3的jar包,直接去apache的官网上去下,最好是下的完整包,包含源代码(http://struts.apache.org/download.cgi#struts1310)

3

*然后工具我用的是eclipse的J2EE版

4

*服务器用的是apache-tomcat 6

步骤/方法
2

然后要把struts用到的核心jar文件放到新建项目的web目录下的lib目录里,由于struts你打开里面的包的话是有很多很多的,但是我们现在只需要基础核心的jar包,因为只是做一个简单的例子,所以我们就直接把struts给的简单例子里用到的lib复制到当前项目的lib里。解压你的struts1.3.10压缩包,然后然后打开里面的apps目录,选择struts-blank-1.3.10例子进行解压,把里面的的web-inf下的lib里德jar包全部拷到当前项目下的lib下。拷贝好以后把eclipse下的项目刷新一下就可以了。此时项目在eclipse中的大致结构

3

先看一下我的页面的国际化实现的代码,首先是源代码 里面的就是实现的不同语言文字的标签,一般都是用标签来实现,key就是你所存储的国际化文件里的key 如上图可以找到register.languagezh用英文是CHINESE,对于英文文件倒好办,但对于中文文件就不能直接在等号后面写中文,需要通过java\bin(你的jdk目录)目录下的native2ascii.exe程序来转化,在cmd中输入native2ascii RegisterResourcesTemp.properties gb2312 RegisterResources_zh_CN.properties temp文件就是直接包含中文的文件,gb2312是temp文件编码形式,这个根据你保存时确定的,后面的就是新生成的中文版的资源文件 当然你的页面必须得utf-8编码的,不然就不能显示了。至于这些文件怎么让struts找到,那当然要在配置文件里配置,这个待会说。然后再看一下实际浏览器里的源代码

4

现在看一下配置文件,先是web.xml,  struts1.3demo1  /home/register.jsp   ServletAction org.apache.struts.action.ActionServlet  config /WEB-INF/struts-config.xml  2   ServletAction *.do  、、、、、ActionServlet就是所有的请求都会经过这里,然后在给别的action类进行处理,上面也包含了初始化时的config参数,他的value就是struts配置文件所在的位置,这里跟web.xml在同一目录,下面的servlet-mapping就是所有的.do操作都会映射到actionservlet来处理,然后是struts-config.xml配置文件              form-bean里我们用的是DynaActionForm,下面包含几个参数,language就是语言参数,我们在上面的浏览器代码里可以看到传递了一个language参数,country是国家参数,我们没传,下面的page就是处理好后要传回的页面,这里还是注册界面,只不过语言改掉了。action的处理类是用的struts自带的简易的LocaleAction类来处理的,下面的message-resources标签就是告诉struts去哪里找到国际化资源文件,parameter参数就是他的位置,这里的写法跟类的写法一样,speak是一个包,里面还有很多的类,resources是speak下的目录,里面包含了了国际化资源文件,这里就直接写了RegisterResources,而没有加什么_CN这些的,这里就是资源文件的写法,name_language_country.properties,就是文件名加上语言加上国家,后面可以省略部分

5

简要的说一下原理,为什么用标签可以,这里当编译器编译这个jsp文件时,遇到这些标签他就会把这标签转成成相应的类,建立相应的对象,再根据里面的属性去做相应的处理,你可以到struts的源码src目录里的struts-1.3.10\src\taglib\src\main\resources\META-INF\tld里面就是4个标签文件,在main下的java目录里就是相应的一系列处理这个标签文件的java类,我看了下里面的处理,他是如何去找到资源文件,如何找到相应的key,里面各种类的调用实在是太多了,我就不写了,有兴趣的可以自己去看看,总之他是通过Locale对象来确定当前的语言环境,再去寻找相应的语言文件,然后再输出来。

6

我们再看看上面的LocaleAction是怎么实现的,然后我们可以根据这个简单的实现在这上面进行一些改进以实现自己的目的,它的类声明public final class LocaleAction extends BaseAction {}一个final类继承BaseAction类,所有的action都会继承baseaction。然后private Log log = LogFactory.getFactory().getInstance(this.getClass().getName());这段当然是用来日志记录的,不管它。接下来就是最重要的execute方法,简要的解释一下:public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // Extract attributes we will need HttpSession session = request.getSession();//先去得到session Locale locale = getLocale(request);//这个应该是父类的方法,通过request得到locale String language = null;//这里就是配置文件里的三个参数了 String country = null; String page = null; try {//分别去获得三个参数的值,form就是那个DynaActionForm对象 language = (String) PropertyUtils.getSimpleProperty(form, 'language'); country = (String) PropertyUtils.getSimpleProperty(form, 'country'); page = (String) PropertyUtils.getSimpleProperty(form, 'page'); } catch (Exception e) { log.error(e.getMessage(), e); } boolean isLanguage = ((language != null) && (language.length() > 0)); boolean isCountry = ((country != null) && (country.length() > 0)); if ((isLanguage) && (isCountry)) {//如果都不会空的话,就建立新的locale对象 locale = new java.util.Locale(language, country); } else if (isLanguage) { locale = new java.util.Locale(language, '');//没有国家的话直接就是语言locale } session.setAttribute(Globals.LOCALE_KEY, locale);吧新的locale放到session里,这样放回过去,就可以根据新的locale来实现国际化了 if (null == page) { return mapping.findForward('success'); } else { return new ActionForward(page);//返回到page,就是还是之前的注册页面 } }

7

差不多一个简易的struts国际化就这样搞定,至于自己要实现跟多的功能就靠自己去摸索了,我想struts2的国际化也差不多吧,连接了大致的原理,用起来就快了。希望对大家有帮助。

注意事项

原创内容,转载请注明出处,作者,否则后果自负

推荐信息