StrutsRequestWrapper详解
来源:互联网 发布:抢票软件演唱会 编辑:程序博客网 时间:2024/06/09 19:35
查看一下StrutsRequestWrapper的源代码,本人将其中的英文注释转为中文
package org.apache.struts2.dispatcher;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.util.ValueStack;/** * * 所有的request请求用这个类,他提供了简单的JSTL的可达性,这是因为JSTL与请求属性与请求属性在一起工作 * 所以这个类代表值栈,除了在少数情况下需要防止无限循环的发生,即,不要让任何属性的名字中带有#,#代表了值栈,他可能导致无限循环 * 例如在这种情况下可能发生无限循环 * request.getAttribute("#attr.foo"). */public class StrutsRequestWrapper extends HttpServletRequestWrapper { /** * The constructor * @param req The request */ public StrutsRequestWrapper(HttpServletRequest req) { super(req); } /** * 获取对象,如果不存在,那么在值栈中找 * @param s The attribute key */ public Object getAttribute(String s) { if (s != null && s.startsWith("javax.servlet")) { // don't bother with the standard javax.servlet attributes, we can short-circuit this // see WW-953 and the forums post linked in that issue for more info return super.getAttribute(s); } ActionContext ctx = ActionContext.getContext(); Object attribute = super.getAttribute(s); if (ctx != null) { if (attribute == null) { boolean alreadyIn = false; Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute"); if (b != null) { alreadyIn = b.booleanValue(); } // note: we don't let # come through or else a request for // #attr.foo or #request.foo could cause an endless loop if (!alreadyIn && s.indexOf("#") == -1) { try { // If not found, then try the ValueStack ctx.put("__requestWrapper.getAttribute", Boolean.TRUE); ValueStack stack = ctx.getValueStack(); if (stack != null) { attribute = stack.findValue(s); } } finally { ctx.put("__requestWrapper.getAttribute", Boolean.FALSE); } } } } return attribute; }}
由源代码可以看到的是HttpServletRequestWrapper,所以先来了解一下HttpServletRequestWrapper.
Wrapper是包装的意思,所以HttpServletRequestWrapper的字面意思就是对HttpServletRequest的包装。首先查看一下HttpServletRequestWrapper的源代码:
package javax.servlet.http;import javax.servlet.ServletRequestWrapper;import java.util.Enumeration;/** * * Provides a convenient implementation of the HttpServletRequest interface that * can be subclassed by developers wishing to adapt the request to a Servlet. * This class implements the Wrapper or Decorator pattern. Methods default to * calling through to the wrapped request object. * * * @see javax.servlet.http.HttpServletRequest * @sincev 2.3 * */public class HttpServletRequestWrapper extends ServletRequestWrapper implements HttpServletRequest {/** * Constructs a request object wrapping the given request.* @throws java.lang.IllegalArgumentException if the request is null*/ public HttpServletRequestWrapper(HttpServletRequest request) { super(request); } private HttpServletRequest _getHttpServletRequest() {return (HttpServletRequest) super.getRequest(); } /** * The default behavior of this method is to return getAuthType() * on the wrapped request object. */ public String getAuthType() {return this._getHttpServletRequest().getAuthType(); } /** * The default behavior of this method is to return getCookies() * on the wrapped request object. */ public Cookie[] getCookies() {return this._getHttpServletRequest().getCookies(); } /** * The default behavior of this method is to return getDateHeader(String name) * on the wrapped request object. */ public long getDateHeader(String name) {return this._getHttpServletRequest().getDateHeader(name); } /** * The default behavior of this method is to return getHeader(String name) * on the wrapped request object. */ public String getHeader(String name) {return this._getHttpServletRequest().getHeader(name); } /** * The default behavior of this method is to return getHeaders(String name) * on the wrapped request object. */ public Enumeration getHeaders(String name) {return this._getHttpServletRequest().getHeaders(name); } /** * The default behavior of this method is to return getHeaderNames() * on the wrapped request object. */ public Enumeration getHeaderNames() {return this._getHttpServletRequest().getHeaderNames(); } /** * The default behavior of this method is to return getIntHeader(String name) * on the wrapped request object. */ public int getIntHeader(String name) {return this._getHttpServletRequest().getIntHeader(name); } /** * The default behavior of this method is to return getMethod() * on the wrapped request object. */ public String getMethod() {return this._getHttpServletRequest().getMethod(); } /** * The default behavior of this method is to return getPathInfo() * on the wrapped request object. */ public String getPathInfo() {return this._getHttpServletRequest().getPathInfo(); } /** * The default behavior of this method is to return getPathTranslated() * on the wrapped request object. */ public String getPathTranslated() {return this._getHttpServletRequest().getPathTranslated(); } /** * The default behavior of this method is to return getContextPath() * on the wrapped request object. */ public String getContextPath() {return this._getHttpServletRequest().getContextPath(); } /** * The default behavior of this method is to return getQueryString() * on the wrapped request object. */ public String getQueryString() {return this._getHttpServletRequest().getQueryString(); } /** * The default behavior of this method is to return getRemoteUser() * on the wrapped request object. */ public String getRemoteUser() {return this._getHttpServletRequest().getRemoteUser(); } /** * The default behavior of this method is to return isUserInRole(String role) * on the wrapped request object. */ public boolean isUserInRole(String role) {return this._getHttpServletRequest().isUserInRole(role); } /** * The default behavior of this method is to return getUserPrincipal() * on the wrapped request object. */ public java.security.Principal getUserPrincipal() {return this._getHttpServletRequest().getUserPrincipal(); } /** * The default behavior of this method is to return getRequestedSessionId() * on the wrapped request object. */ public String getRequestedSessionId() {return this._getHttpServletRequest().getRequestedSessionId(); } /** * The default behavior of this method is to return getRequestURI() * on the wrapped request object. */ public String getRequestURI() {return this._getHttpServletRequest().getRequestURI(); }/** * The default behavior of this method is to return getRequestURL() * on the wrapped request object. */ public StringBuffer getRequestURL() {return this._getHttpServletRequest().getRequestURL(); } /** * The default behavior of this method is to return getServletPath() * on the wrapped request object. */ public String getServletPath() {return this._getHttpServletRequest().getServletPath(); } /** * The default behavior of this method is to return getSession(boolean create) * on the wrapped request object. */ public HttpSession getSession(boolean create) {return this._getHttpServletRequest().getSession(create); } /** * The default behavior of this method is to return getSession() * on the wrapped request object. */ public HttpSession getSession() {return this._getHttpServletRequest().getSession(); } /** * The default behavior of this method is to return isRequestedSessionIdValid() * on the wrapped request object. */ public boolean isRequestedSessionIdValid() {return this._getHttpServletRequest().isRequestedSessionIdValid(); } /** * The default behavior of this method is to return isRequestedSessionIdFromCookie() * on the wrapped request object. */ public boolean isRequestedSessionIdFromCookie() {return this._getHttpServletRequest().isRequestedSessionIdFromCookie(); } /** * The default behavior of this method is to return isRequestedSessionIdFromURL() * on the wrapped request object. */ public boolean isRequestedSessionIdFromURL() {return this._getHttpServletRequest().isRequestedSessionIdFromURL(); } /** * The default behavior of this method is to return isRequestedSessionIdFromUrl() * on the wrapped request object. */ public boolean isRequestedSessionIdFromUrl() {return this._getHttpServletRequest().isRequestedSessionIdFromUrl(); } }
这个HttpServletRequestWrapper就是对HttpServletRequest的包装实现。其实这个类的作用与HttpServletRequest的·作用类似。
通过上面源码的了解,可以看到StrutsRequestWrapper是在struts2框架中对HttpServletRequestWrapper类的包装,以使其得到扩展,在Struts2中,扩展后的HttpServletRequest类有了一个方法
public Object getAttribute(String s)这个方法的作用是在servlet的Request的作用域中获得属性名为s的属性值,如果Request作用域中不存在,那么将到Struts2的值栈中查找。
它们应用了设计模式中的装饰者模式。
它们之间的关系如上图所示
0 0
- StrutsRequestWrapper详解
- Struts2源码分析(二) 一一一 StrutsRequestWrapper
- 详解
- 详解
- 详解
- 详解
- &,&&,|,||详解
- 详解
- Scala详解--------基础知识详解
- Spring详解-----------事务详解
- github 详解详解
- InputFilter详解、TextWatcher详解
- Spring详解-----------事务详解
- 【词汇详解】事务详解
- Session 详解
- Session 详解
- sizeof详解
- 端口详解
- CSS基础案例展示
- 考研个人经验分享
- Linux windows 文件互传
- 处理上传图片的临时文件代码
- mysql 2013error
- StrutsRequestWrapper详解
- 2.tcpdump(1)
- String、StringBuffer与StringBuilder之间区别
- 微信小程序实例教程(一)
- Morris Traversal
- Android openGL ES2.0 Matrix.frustumM和Matrix.setLookAtM解析
- spring容器及bean加载机制源码解读
- HDU2602/HDU1114/HDU2191(重新整理一下01背包,完全背包,多重背包)
- 高精度之高精除以低精取余(天使的起誓)