struts2的请求参数的编码和valuestack放在哪了
来源:互联网 发布:c语言程序代码生日快乐 编辑:程序博客网 时间:2024/06/05 15:56
struts2的请求编码和valuestack放在哪了
首先来看一下Struts2的过滤器的doFilter方法
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try { prepare.setEncodingAndLocale(request, response); prepare.createActionContext(request, response); prepare.assignDispatcherToThread(); if (excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) { chain.doFilter(request, response); } else { request = prepare.wrapRequest(request); ActionMapping mapping = prepare.findActionMapping(request, response, true); if (mapping == null) { boolean handled = execute.executeStaticResourceRequest(request, response); if (!handled) { chain.doFilter(request, response); } } else { execute.executeAction(request, response, mapping); } } } finally { prepare.cleanupRequest(request); } }
首先我们来分析一下struts2的请求参数的编码,看一下这个方法。 prepare.setEncodingAndLocale(request, response);从字面意思来看,这个就是设置encoding和locale,当然咯,说话要讲究实际,我们还是去看一下源代码。
public void setEncodingAndLocale(HttpServletRequest request, HttpServletResponse response) { dispatcher.prepare(request, response); }
这里调用了dispatcher.prepare()方法,这里我们继续跟下,进入prepare方法
public void prepare(HttpServletRequest request, HttpServletResponse response) { String encoding = null; if (defaultEncoding != null) { encoding = defaultEncoding; } if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) { encoding = "UTF-8"; } Locale locale = null; if (defaultLocale != null) { locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale()); } if (encoding != null) { applyEncoding(request, encoding); } if (locale != null) { response.setLocale(locale); } if (paramsWorkaroundEnabled) { request.getParameter("foo"); // simply read any parameter (existing or not) to "prime" the request } }
这里我们先看一下这个defaultEncoding。
/** * Store state of StrutsConstants.STRUTS_I18N_ENCODING setting. */ private String defaultEncoding;
好像貌似这里可以通过default.properties中的属性注入进来的。
default.properties里面有这么一条struts.i18n.encoding=UTF-8,说明编码为utf-8,当然我们可以修改这个变量,我们可以在在struts.xml中添加constant节点修改,name=struts.i18n.encoding,value=编码。
说完了这里,去看一下applyEncoding(request, encoding)这个方法。
private void applyEncoding(HttpServletRequest request, String encoding) { try { if (!encoding.equals(request.getCharacterEncoding())) { // if the encoding is already correctly set and the parameters have been already read // do not try to set encoding because it is useless and will cause an error request.setCharacterEncoding(encoding); } } catch (Exception e) { LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e); } }
这里request.setCharacterEncoding(encoding);发现设置post方式请求的编码。
到此,请求参数的编码到此完毕。
下一步,寻找valuestack放在哪了?
还是来到struts2的过滤器的doFilter方法中,我们去看一下execute.executeAction(request, response, mapping);这一条代码
public void executeAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws ServletException { dispatcher.serviceAction(request, response, servletContext, mapping); }
public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException { Map<String, Object> extraContext = createContextMap(request, response, mapping, context); ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); boolean nullStack = stack == null; if (nullStack) { ActionContext ctx = ActionContext.getContext(); if (ctx != null) { stack = ctx.getValueStack(); } } if (stack != null) { extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack)); } request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack()); }
上述贴出了部分代码,我们需要的是 request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());可以发现是将valuestack放入了request对象中了
到此,源码解析结束
- struts2的请求参数的编码和valuestack放在哪了
- struts2的contextmap和valueStack
- struts2的contextmap和valueStack
- Struts2的Stack Context和ValueStack
- Struts2的Stack Context和ValueStack
- Struts2 ValueStack和StackContext的区别
- 在Struts2中valuestack,stackContext,ActionContext.之间的关系
- 在Struts2 中 ValueStack 的实现(一)
- 在Struts2中valuestack,stackContext,ActionContext.之间的关系
- 关于struts2.0的valuestack
- struts2 ValueStack的理解
- struts2的ognl与valuestack
- Struts2的ValueStack(值栈)介绍
- Struts2的ValueStack工作原理
- (转)Struts2 ValueStack的理解
- Struts2中ValueStack的学习
- Struts2的ValueStack(值栈)
- 深度解析struts2的valueStack
- java.lang.Class usage
- csdn博客
- 关于以太网(Ethernet II)这个网络的个人理解以及应用(1)
- redis学习与应用
- bean的作用域
- struts2的请求参数的编码和valuestack放在哪了
- Kafka源码深度解析-序列6 -Consumer -消费策略分析
- 正则表达式
- Android——Activity生命周期
- JavaWeb工作原理
- [bzoj 1013] [JSOI2008]球形空间产生器sphere:高斯消元
- Java多线程一:创建线程
- 精益创业和画布实战(1):变革家,让天下没有难懂的生意
- 深入理解Java的接口和抽象类