开博之前本准备学习完ssh,然后做一demo为结尾的,但发现这三类框架的东西多多,于是乎决定分别学习回顾....闲话少说....
demo环境:myeclipse5.5+jdk1.5+tomcat5.5,demo步骤如下:
1.建一web工程,引入struts。(没有使用myeclipse的朋友自己将struts包导入)
2.先简单处理action、form、struts-config.xml等,使其正常启动,本文以简单登录为例
3.将引入struts产生的默认ApplicationResources.properties文件拉到一新建package下,package名称:resources
4.写入“login.success=哦,登录成功!”到ApplicationResources.properties, 作为我们登录成功的提示
5.在resources下新建2个.properties文件,分别为代表中文的ApplicationResources_zh_CN.properties和代表英文的ApplicationResources_en_US.properties
6.使用native2ascii 将ApplicationResources.properties中文转码到ApplicationResources_zh_CN.properties中,格式为utf-8
7.将login.success=oh,success!写入ApplicationResources_en_US.properties作为英文提示
8.在struts-config.xml中,配置resources信息:<message-resources parameter="com.gdcn.ssh.resources.ApplicationResources" />
9.在登录提示的页面将pageEncoding="UTF-8",并在<body>中写入:<bean:message key="login.success"/>
10.启动tomcat,查看中文提示效果是否正确。然后将ie语言设为英文关闭ie,重新打开一新的ie,查看英文提示是否正确!
注意点:
1.使用国际化页面的编码格式最好为utf-8
2.properties文件中英文要完整、正确
3.native2ascii 转码要正确。本文:native2ascii -encoding UTF-8 ApplicationResources.properties ApplicationResources_zh_CN.properties
优化及拓展:
1.每次中英文切换,要关掉ie然后重新打开才有效果的问题:
大家都知道,struts的处理机制是:*.do-->actionServlet-->requestProcessor-->action
其中在工程中actionServlet-->requestProcessor过程是看不到,但它是存在的。在requestProcessor类的众多方法中有个获取请求用户信息和语言方法:processLocale(),其源码如下
protected void processLocale(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
{
if (!moduleConfig.getControllerConfig().getLocale())
return;
HttpSession httpsession = httpservletrequest.getSession();
if (httpsession.getAttribute(Globals.LOCALE_KEY) != null)
return;
java.util.Locale locale = httpservletrequest.getLocale();
if (locale != null)
{
if (log.isDebugEnabled())
log.debug(" Setting user locale '" + locale + "'");
httpsession.setAttribute(Globals.LOCALE_KEY, locale);
}
}
大家可以看到,用户地区信息和语言是用Globals.LOCALE_KEY保存在新开浏览器时创建的session中,即使刷新N次页面,session中的值是不会改变的,所以改变ie语言后,需要重新打开浏览器才起到效果,怎么解决?对了,从上面代码中,我们可以看到每次的httpservletrequest.getLocale()获取的都是新的用户语言信息,所以问题迎刃而解了,处理方法:
1.在action方法中重新设置session的语言信息:request.getSession().setAttribute(Globals.LOCALE_KEY,request.getLocale());即可,当然如果大的项目,大家最好把此句放入filter或者其类中。
2.继承requestProcessor类,重写processLocale方法,具体怎么改写不再赘述,但有点不要忘记,struts-config.xml中配置实现类:<controller>
<set-property property="processorClass" value="实现类路径"/>
</controller>
注:关于struts的requestProcessor扩展及使用,本人近期将同struts的plugIn一同开博介绍,请朋友们捧场关注....谢谢