首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

浅析struts2源码中对requset的打包

2012-11-10 
浅析struts2源码中对requset的封装??当前台发送来HttpServletRequest的请求的时候,struts2是用StrutsPrepa

浅析struts2源码中对requset的封装

?

?当前台发送来HttpServletRequest的请求的时候,struts2是用StrutsPrepareAndExecuteFilter的doFilter来接收并处理的.

(现在web.xml的配置都是StrutsPrepareAndExecuteFilter了吧浅析struts2源码中对requset的打包)

而struts2刚开始就对request和response进行了封装

?

prepare.setEncodingAndLocale(request, response);prepare.createActionContext(request, response);

?设置编码:

        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);            }        }

?

        Locale locale = null;        if (defaultLocale != null) {            locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale());        }

?

       if (locale != null) {            response.setLocale(locale);        }

?

而默认编码defaultEncoding,在初始化Dispatcher的时候被设置如下:

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

?STRUTS_I18N_ENCODING就是"struts.i18n.encoding"

在default.properties中struts.i18n.encoding=UTF-8

所以set request默认的编码是UTF-8

?

而Locale默认是null,貌似是因为required=false(仅是推断,没有验证)

    @Inject(value=StrutsConstants.STRUTS_LOCALE, required=false)    public void setDefaultLocale(String val) {        defaultLocale = val;    }

?

?

继续回到StrutsPrepareAndExecuteFilter的doFilter

开始生成新的request (StrutsRequestWrapper类型)?

request = prepare.wrapRequest(request);

?在Dispatcher中,直接返回StrutsRequestWrapper:

else {            request = new StrutsRequestWrapper(request);        }        return request;

?

那么原先从前台传来的HttpServletrequest在哪呢

?

回到:

prepare.createActionContext(request, response);
 ActionContext ctx; ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack(); stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext)); ctx = new ActionContext(stack.getContext());
ActionContext.setContext(ctx);

?在方法里生成了一个新的ActionContext 而HttpServletRequest就存放ActionContext 中,

首HttpServletRequest由RequestMap接收

其次RequestMap?ApplicationMap 又经过一次put放在Map<String,Object> extraContext中:

extraContext.put(StrutsStatics.HTTP_REQUEST, request);

而extraContext被putAll进ValueStack 的Map中,最终被ActionContext接收

?

?
?

?

获取HttpServletrequest的方法:

1)ActionContext context = ActionContext.getContext();   HttpServletRequest request=(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);   HttpServletResponse response = (HttpServletResponse)context.get(ServletActionContext.HTTP_RESPONSE);   2)HttpServletRequest request = ServletActionContext.getRequest();

?

两种方法实际是相同?的:

?

    public static HttpServletRequest getRequest() {        return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);    }

?

?

?

以上,不知道有哪点理解的不对? 希望大家指出

热点排行