首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于struts.i18n.encoding的疑义

2012-11-08 
关于struts.i18n.encoding的疑问大家现在都清楚了,struts.i18n.encoding既应用于请求流也应用于返回流。但

关于struts.i18n.encoding的疑问

大家现在都清楚了,struts.i18n.encoding既应用于请求流也应用于返回流。但通过对源码org.apache.struts2.dispatcher.FilterDispatcher的研究发现好像只对requst指定了encode啊?大家请看源码

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {    HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;        ServletContext servletContext = getServletContext();        String timerKey = "FilterDispatcher_doFilter: ";        try {            UtilTimerStack.push(timerKey);            request = prepareDispatcherAndWrapRequest(request, response);//这里是重点        //这里省略后面的代码        } finally {            try {                ActionContextCleanUp.cleanUp(req);            } finally {                UtilTimerStack.pop(timerKey);            }        }    }}

?

? prepareDispatcherAndWrapRequest

protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException {        Dispatcher du = Dispatcher.getInstance();        if (du == null) {            Dispatcher.setInstance(dispatcher);            dispatcher.prepare(request, response);//这里是重点        } else {            dispatcher = du;        }        //省略了一些代码        return request;}

? ?prepare

public void prepare(HttpServletRequest request, HttpServletResponse response) {        String encoding = null;        if (defaultEncoding != null) {            encoding = defaultEncoding;        }    //省略了一些代码        if (encoding != null) {            try {                request.setCharacterEncoding(encoding);//这里是重点            } catch (Exception e) {                LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);            }        }        //省略了一些代码}

?

? defaultEncoding 在org.apache.struts2.dispatcher.Dispatcher下:

@Inject(StrutsConstants.STRUTS_I18N_ENCODING)public static void setDefaultEncoding(String val) {    defaultEncoding = val;}

?

? 问题1:在prepare函数中request.setCharacterEncoding(encoding);这句设置了encoding,但这里只是设置了request的字符编码吧?那response的呢?

?问题2:我在项目中使用encodefilter,和struts.i18n.encoding:

假设条件有三 1.encode filter中设置了request,response的编码都为UTF8

???????? ?????????? 2.struts.i18n.encoding=utf8

????????????? ????? 3.web.xml中过滤器encode filter放在struts过滤器之前

?

???????? 这三者同时满足的情况下在表单中输入中文,返回正确(不是乱码)

??但如果我修改(1),在encode filter仅设置response编码为utf8,其他条件不变则产生乱码!这是为什么?

? 如果我修改(3),将两个filter调换下顺序则发现也是乱码?就算Jsp页面设置为utf8也一样,filter执行顺序是和web.xml文件中的filter-maping有关。这里按理应该是encode filter的编码设置覆盖struts2的编码设置吧?怎么还会乱码?

?

?

?下面是测试附件:

1 楼 only_java 2009-03-23   搞什么鬼,在家测的结果和在公司测的结果不一样。。。

热点排行