您的位置:首页 > 编程语言 > Java开发

【Java框架篇】Struts+displaytag国际化简单使用

2017-12-05 16:02 519 查看
说明:

本篇基于上一篇

mvc方式再做简要说明,说明Struts国际化其与的不同之处。

用的框架比较老,基于Struts1。

首先配置方面,属性和配置文件必不可少,然后起初的的想法是在自己封装的ActionBase里处理每次请求的拦截(class ActionBase extends Action)。 后来改为只在登录时处理下即可。主要逻辑如下代码所示,其中加了一层本地存储的cookie记忆每次系统使用的语言。便于下次使用时语言可以记忆。然后关键一步用了Action里的一个setLocal(),将存到localde里的语言放在session中用于以后的请求时拿到当前语言用于不同语言的展示。如下代码示例二。

简要分析:首先根据传递的语言类型去跟本地cookie查找是否有已经存在,若空去浏览器默认语言去库里查找是否是系统需要切换的几种语言,如果库里没有就设置默认语言。所有的判断结束后。将拿到的语言的字符串存在local,然后存在cookie中。最后放入setlocal.

主要java代码:

示例代码一(java核心处理类)

Locale defaultLocale = getLocale(request); // 获取浏览器系统语言
public Locale getLocale(ActionEvent ae, String defaultLocale) {
HttpServletRequest request = ae.getRequest();
HttpServletResponse response = ae.getResponse();
String localeParam = request.getParameter(LOCALE_PARAM_NAME);
if (StringUtils.isEmpty(localeParam)) {
// 获取本地cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (StringUtils.equals(cookie.getName(), LOCALE_PARAM_NAME)) {
localeParam = cookie.getValue();
}
}
if (StringUtils.isEmpty(localeParam)) {
localeParam = defaultLocale;
}
}
Language language = new Language();
language.setLangName(localeParam);
Language languageObj = languageDAO.selectLanguage(language);
if (languageObj == null) {
languageObj = languageDAO.selectDefaultLanguage();
}
Locale locale = LocaleUtils.toLocale(languageObj.getLangName());
Cookie cookie = new Cookie(LOCALE_PARAM_NAME, locale.toString());
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
return locale;
}
setLocale(request, locale);


示例代码二(Action.java 中setlocal源码)

protected Locale getLocale(HttpServletRequest request) {
HttpSession session = request.getSession();
Locale locale = (Locale) session
.getAttribute("org.apache.struts.action.LOCALE");
if (locale == null) {
locale = defaultLocale;
}
return locale;
}

protected void setLocale(HttpServletRequest request, Locale locale) {
HttpSession session = request.getSession();
if (locale == null) {
locale = defaultLocale;
}
session.setAttribute("org.apache.struts.action.LOCALE", locale);
}


前端代码:

通过Struts <%@ taglib uri=”struts-bean” prefix=”bean”%>

<bean:message key="XXXX"/>
可拿到属性文件的值。

配置文件:

我的属性文件放在resource包下,均已application

<description>应用程序属性配置组件</description>
ba76
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename"><value>resources.application</value></property>
<property name="useCodeAsDefaultMessage"><value>true</value></property>
</bean>


属性文件新建以resource的属性文件后追加以_zh_CN,_zh_TW,en_US结尾的不同语言的属性文件即可,详见上一篇。读取的时候配置文件只需配置resource的即可。

备注:项目中的分页功能用的displaytag标签。其国际化需要单独处理,具体的办法有有几种



以上几种均可实现国际化,具体的使用,需要在display.properties文件里的做如下配置:

说明:locale provider (Jstl provider by default)

locale.provider=org.displaytag.localization.I18nStrutsAdapter

说明:locale.resolver (nothing by default, simply use locale from request)

locale.resolver=org.displaytag.localization.I18nStrutsAdapter

如果要使用默认的jstl方式国际化,则需要修改locale.provider的配置为I18nJstlAdapter。并且在jsp的分页出把需要替换分页的表头用titleKey。并设置如下的引入:

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="displaytag" prefix="display"%>
<fmt:setLocale value="${sessionScope['org.apache.struts.action.LOCALE']}"/>
<fmt:setBundle basename="resources.application" />


如果使用jstl的方式,那么就无需上述的java类的处理,但是想达到以上的需求无法实现。因此改用Struts的方式,既

配置locale.provider和locale.resolver为Struts的方式。jsp中无需上述的fmt引入。

如果使用spring的方式亦可。再此不做介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: