最近在看struts2的国际化, i18n拦截器代码很简单, 具体是根据访问参数和session方式来控制语言, 其实每次都更改语言还是很麻烦的, 特别做了一个Cookie保存当前语言设置, 仅仅一个例子供大家参考, 修改i18n的拦截器代码.
流程处理: 首先判断parameters里面有没有语言选择参数, 有则取出放到cookie, 如果没有则从cookie中取, 放到parameters, 这样就可以实现本地保存, 最终和i18n的拦截器互动, 即使以后struts改了, 我们也能灵活处理; 当然也可以完全从新实现i18n的拦截器功能, 但是那样我觉得后期如果struts i18n方式一变就有点被动.
代码如下:
最近在看struts2的国际化, i18n拦截器代码很简单, 具体是根据访问参数和session方式来控制语言, 其实每次都更改语言还是很麻烦的, 特别做了一个Cookie保存当前语言设置, 仅仅一个例子供大家参考, 修改i18n的拦截器代码.
流程处理: 首先判断parameters里面有没有语言选择参数, 有则取出放到cookie, 如果没有则从cookie中取, 放到parameters, 这样就可以实现本地保存, 最终和i18n的拦截器互动, 即使以后struts改了, 我们也能灵活处理; 当然也可以完全从新实现i18n的拦截器功能, 但是那样我觉得后期如果struts i18n方式一变就有点被动.
代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
自定义拦截器类
1
package sh.mgr.ui.interceptor;
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
import java.util.Locale;
4
import java.util.Map;
5![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
import javax.servlet.http.Cookie;
7
import javax.servlet.http.HttpServletRequest;
8
import javax.servlet.http.HttpServletResponse;
9![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
import org.apache.struts2.ServletActionContext;
11![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
import com.opensymphony.xwork2.ActionInvocation;
14
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
15
import com.opensymphony.xwork2.interceptor.I18nInterceptor;
16
import com.opensymphony.xwork2.util.LocalizedTextUtil;
17
import com.opensymphony.xwork2.util.logging.Logger;
18
import com.opensymphony.xwork2.util.logging.LoggerFactory;
19![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class I18nSh extends AbstractInterceptor
{
21
private static final long serialVersionUID = -1419979008563298812L;
22![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
protected static final Logger LOG = LoggerFactory.getLogger(I18nInterceptor.class);
24![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
public static final String DEFAULT_SESSION_ATTRIBUTE = "WW_TRANS_I18N_LOCALE";
26
public static final String DEFAULT_PARAMETER = "request_locale";
27![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
protected String parameterName = DEFAULT_PARAMETER;
29
protected String attributeName = DEFAULT_SESSION_ATTRIBUTE;
30
31
protected static final String LAN_COOKIE_NAME = "lan";
32![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
33![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public I18nSh()
{
34![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (LOG.isDebugEnabled())
{
35
LOG.debug("new I18nInterceptor()");
36
}
37
}
38![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
39![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setParameterName(String parameterName)
{
40
this.parameterName = parameterName;
41
}
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setAttributeName(String attributeName)
{
44
this.attributeName = attributeName;
45
}
46![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47
@Override
48![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String intercept(ActionInvocation invocation) throws Exception
{
49![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (LOG.isDebugEnabled())
{
50
LOG.debug("intercept '"
51
+ invocation.getProxy().getNamespace() + "/"
52
+ invocation.getProxy().getActionName() + "' { ");
53
}
54
55
56
//get requested locale
57
Map<String, Object> params = invocation.getInvocationContext().getParameters();
58
Object requested_locale = params.get(parameterName);
59
if (requested_locale != null && requested_locale.getClass().isArray()
60![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
&& ((Object[]) requested_locale).length == 1)
{
61
requested_locale = ((Object[]) requested_locale)[0];
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (LOG.isDebugEnabled())
{
64
LOG.debug("requested_locale=" + requested_locale);
65
}
66
}
67![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
68
//save it in session
69
Map<String, Object> session = invocation.getInvocationContext().getSession();
70![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
71![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
72![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (session != null)
{
73![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
synchronized (session)
{
74
Cookie cookie = getLocaleCookie();
75![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (requested_locale != null)
{
76
Locale locale = (requested_locale instanceof Locale) ?
77
(Locale) requested_locale : LocalizedTextUtil.localeFromString(requested_locale.toString(), null);
78![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (LOG.isDebugEnabled())
{
79
LOG.debug("put request local to cookie=" + locale);
80
}
81![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (locale != null)
{
82
this.setLocaleCookie(cookie, requested_locale.toString());
83
}
84![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
}else if(cookie!=null)
{
85
requested_locale = cookie.getValue();
86![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (LOG.isDebugEnabled())
{
87
LOG.debug("put local to request_params=" + requested_locale);
88
}
89
params.put(parameterName, requested_locale);
90
}
91
}
92
}
93![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
94
return invocation.invoke();
95
}
96
97![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private Cookie getLocaleCookie()
{
98
HttpServletRequest request = ServletActionContext.getRequest();
99
Cookie cookies[] = request.getCookies();
100![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (cookies != null)
{
101![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int a=0; a< cookies.length; a++)
{
102![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(cookies[a].getName().equals(LAN_COOKIE_NAME))
{
103
return cookies[a];
104
}
105
}
106
}
107
return null;
108
}
109
110![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private void setLocaleCookie(Cookie cookie, String lan)
{
111
HttpServletResponse response = ServletActionContext.getResponse();
112![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(cookie==null)
{
113
cookie = new Cookie(LAN_COOKIE_NAME, lan);
114![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
}else
{
115
cookie.setValue(lan);
116
}
117
cookie.setMaxAge(Integer.MAX_VALUE);
118
cookie.setPath("/");
119
response.addCookie(cookie);
120![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
121
122
}
123
}
124![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
struts 配置
1
<package name="myDefPkg" extends="struts-default" abstract="true">
2
<interceptors>
3
<interceptor name="i18nSh" class="sh.mgr.ui.interceptor.I18nSh"></interceptor>
4
<interceptor-stack name="myStack">
5
<interceptor-ref name="i18nSh"></interceptor-ref>
6
<interceptor-ref name="defaultStack"></interceptor-ref>
7
</interceptor-stack>
8
</interceptors>
9
<default-interceptor-ref name="myStack" />
10
</package>
11
<package name="account" extends="myDefPkg">
12
![](https://www.cnblogs.com/Images/dot.gif)
..
13
</package>