技术开发 频道

使用WebSphere Portal开发多区域设置网站

    开发请求包装

    J2EE 规范提供了请求包装机制来修改供下游应用程序或组件使用的请求。本文并不会讨论请求包装和 Servlet 筛选器;有关这两个构件的详细信息,请参见 Java Servlet 2.3 规范。

    要设计请求包装,首先需要 Servlet 筛选器能够指定请求包装的区域设置。因此,您需要一个构造函数,该构造函数接受传入请求对象和 Servlet 筛选器所确定的区域设置作为参数。

    清单 1. LocaleRequestWrapper
public class LocaleRequestWrapper extends HttpServletRequestWrapper implements com.ibm.wsspi.webcontainer.servlet.IServletRequest { private String locale = null; private Locale localeObj; private List locales = new ArrayList(1); public LocaleRequestWrapper(HttpServletRequest request, Locale locale) { super(request); // validate the locale here…if invalid locale is passed // throw illegal argument exception String langCode = locale.getLanguage(); String countryCode = locale.getCountry(); if (langCode != null && langCode.trim().length() > 0 && countryCode != null && countryCode.trim().length() > 0) { this.locale = langCode + "-" + countryCode; localeObj = new Locale(langCode, countryCode); } else if (langCode != null && langCode.trim().length() > 0) { this.locale = langCode; localeObj = new Locale(langCode); } if (locale != null) { locales.add(locale); } } public Object clone() throws CloneNotSupportedException { LocaleRequestWrapper crequest = (LocaleRequestWrapper)super.clone(); javax.servlet.ServletRequest inner = crequest.getRequest(); if (inner instanceof IServletRequest) { crequest.setRequest( (HttpServletRequest)((IServletRequest)inner).clone()); } else { throw new CloneNotSupportedException(); } return crequest; } }
    接下来,请求包装需要重写 getHeader 和 getHeaders 方法,以便能在指定的键为 Accept-Languag 时返回 Servlet 筛选器指定的区域设置。

    清单 2. LocaleRequestWrapper getHeader() 和 getHeaders() 方法
public String getHeader(String key) { // get the original request HttpServletRequest request = (HttpServletRequest)getRequest(); // if the header request is for locale, return the stored locale if ("Accept-Language".equalsIgnoreCase(key)) { if (locale != null) return locale; // if no locale is set, then return a value that would cause // WPS to use default language. else return request.getHeader(key); } // if the requested header is not the locale, return the value // from the wrapped request else return request.getHeader(key); } public Enumeration getHeaders(String key) { // get the original request HttpServletRequest request = (HttpServletRequest)getRequest(); // if the header request is for locale, return the stored locale if ("Accept-Language".equalsIgnoreCase(key)) { if (locale != null) return Collections.enumeration(locales); // if no locale is set, then return a value that would cause // WPS to use default language. else return request.getHeaders(key); } // if the requested header is not the locale, return the value // from the wrapped request else return request.getHeaders(key); }
    您还需要重写 getLocale 和 getLocales 方法,以返回与 getHeader 方法所返回的相同的区域设置。

    清单 3. LocaleRequestWrapper getLocale() 和 getLocales() 方法
public Locale getLocale() { if (localeObj != null) return localeObj; else { // get the original request HttpServletRequest request = (HttpServletRequest)getRequest(); return request.getLocale(); } } public Enumeration getLocales() { if (locale != null) return Collections.enumeration(locales); else { // get the original request HttpServletRequest request = (HttpServletRequest)getRequest(); return request.getLocales(); } }








0
相关文章