》Java中i18nAction实现国际化<一> 作者:左轩、Shiny
实现方式一:过滤器Filter+i18nAction实现按钮切换并返回之前的页面
login_zh_CN.properties属性文件:
username=\u8D26\u53F7
password=\u5BC6\u7801
languag=\u8BED\u8A00\u8BBE\u7F6E
zhcn=\u4E2D\u6587
enus=English
login_en_US.properties属性文件:
username=User Name
password=Password
languag=Language Set
zhcn=\u4E2D\u6587
enus=English
language.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>I18N国际化</title>
</head>
<body>
<s:text name="languag" />
<a href="i18nAction_changeLocal.action?local=zh_CN">
<s:text name="zhcn" />
</a>
<a href="i18nAction_changeLocal.action?local=en_US">
<s:text name="enus" />
</a>
<s:form action="">
<s:textfield name="user.username" key="username" />
<s:textfield name="user.username" key="password" />
</s:form>
</body>
</html>
web.xml
<filter>
<filter-name>localeFilter</filter-name>
<filter-class>com.huawei.ssi.filter.LocaleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>localeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml
<constant name="struts.custom.i18n.resources" value="login"></constant>
<action name="i18nAction_*" class="com.huawei.ssi.action.I18NAction" method="{1}">
<result name="url" >${url}</result>
</action>
LocaleFilter.java
package com.huawei.ssi.filter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionContext;
public class LocaleFilter implements Filter {
private List<String> urls=null;
private Map<String,List<String>> map = null;
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
String url=request.getRequestURI();
String currentUrl="";
//Jsp页面
if(url.contains("i18nAction")){
if(map.get("url")!=null){
List<String> uls=map.get("url");
if(uls.size()>0){
request.getSession().setAttribute("url", urls.get(urls.size()-1));
}else{
request.getSession().setAttribute("url", "index.jsp");
}
}else{
request.getSession().setAttribute("url", "index.jsp");
}
}else{
currentUrl = url.substring(request.getContextPath().length()+1);
if(request.getQueryString()!=null){
currentUrl+="?"+request.getQueryString();
}
System.out.println(">>"+currentUrl);
urls.add(currentUrl);
map.put("url", urls);
request.getSession().setAttribute("url", currentUrl);
}
chain.doFilter(request, resp);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
urls = new ArrayList<String>();
map = new HashMap<String,List<String>>();
}
}
I18NAction.java
package com.huawei.ssi.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class I18NAction extends ActionSupport{
private String url;
/**
*
*/
private static final long serialVersionUID = 1L;
public String changeLocal(){
HttpServletRequest request = (HttpServletRequest) ServletActionContext.getRequest();
String str = (String) request.getSession().getAttribute("url");
setUrl(str);
return "url";
}
public void setUrl(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}