ServletActionContext.getServletContext()方法不是什么时候都能用的
2012-10-17 17:19
567 查看
1.当时我是这么建立这个类的
Java代码
public class StaticAction
extends ActionSupport {
static {
logDir = ServletActionContext.getServletContext().getRealPath("/");
//在这里打个断点
}
}
2.在com.opensymphony.xwork2.DefaultActionInvocation 类下大约第362行
Java代码
private void init()
throws Exception {
Map contextMap = createContextMap();
createAction(contextMap); //在这个方法打个断点,该方法会去创建你所调用的Action。详情可以看看它里面的objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);这一句
if (pushAction) {
stack.push(action);
}
invocationContext = new ActionContext(contextMap);
//注意你所调用的Action,它的ActionContext在这里才会创建。
invocationContext.setName(proxy.getActionName());
// get a new List so we don't get problems with the iterator if someone changes the list
List interceptorList = new ArrayList(proxy.getConfig().getInterceptors());
interceptors = interceptorList.iterator();
}
好了。调试运行。因为StaticAction有静态代码块,而objectFactory在创建action实例时,使用的是Class.forName(String cls)方式,它的具体实现如下:
Java代码
java.lang.Class.java
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className,
true, ClassLoader.getCallerClassLoader());
}
看到forName0的第二个参数设置为true了吗?表示该类被JVM装载后,要不要立即初始化,如果设置成false,表示在将初始化的工作推迟到了newInstance的时候进行.所以,当方法createAction(contextMap)被调用时,要执行的StaticAction的静态代码块肯定会被调用的。
当运行到ServletActionContext.getServletContext().getRealPath("/")这一句时,继续查看ServletActionContext.getServletContext()的来源:
org.apache.struts2.ServletActionContext.java 大概第137行
Java代码
public static ServletContext getServletContext() {
return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT);
}
可以看到其实调用的是ActionContext.getContext().get(SERVLET_CONTEXT);过来的,而咱们在最开始也看到了createAction(contextMap);方法在 invocationContext = new ActionContext(contextMap); 方法执行之前,是无法正常得到SERVLET_CONTEXT的,所以,就会出空指针异常了。
Java代码
public class StaticAction
extends ActionSupport {
static {
logDir = ServletActionContext.getServletContext().getRealPath("/");
//在这里打个断点
}
}
2.在com.opensymphony.xwork2.DefaultActionInvocation 类下大约第362行
Java代码
private void init()
throws Exception {
Map contextMap = createContextMap();
createAction(contextMap); //在这个方法打个断点,该方法会去创建你所调用的Action。详情可以看看它里面的objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);这一句
if (pushAction) {
stack.push(action);
}
invocationContext = new ActionContext(contextMap);
//注意你所调用的Action,它的ActionContext在这里才会创建。
invocationContext.setName(proxy.getActionName());
// get a new List so we don't get problems with the iterator if someone changes the list
List interceptorList = new ArrayList(proxy.getConfig().getInterceptors());
interceptors = interceptorList.iterator();
}
好了。调试运行。因为StaticAction有静态代码块,而objectFactory在创建action实例时,使用的是Class.forName(String cls)方式,它的具体实现如下:
Java代码
java.lang.Class.java
public static Class<?> forName(String className)
throws ClassNotFoundException {
return forName0(className,
true, ClassLoader.getCallerClassLoader());
}
看到forName0的第二个参数设置为true了吗?表示该类被JVM装载后,要不要立即初始化,如果设置成false,表示在将初始化的工作推迟到了newInstance的时候进行.所以,当方法createAction(contextMap)被调用时,要执行的StaticAction的静态代码块肯定会被调用的。
当运行到ServletActionContext.getServletContext().getRealPath("/")这一句时,继续查看ServletActionContext.getServletContext()的来源:
org.apache.struts2.ServletActionContext.java 大概第137行
Java代码
public static ServletContext getServletContext() {
return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT);
}
可以看到其实调用的是ActionContext.getContext().get(SERVLET_CONTEXT);过来的,而咱们在最开始也看到了createAction(contextMap);方法在 invocationContext = new ActionContext(contextMap); 方法执行之前,是无法正常得到SERVLET_CONTEXT的,所以,就会出空指针异常了。
相关文章推荐
- idea编辑器HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath();方法无法使用
- eclipse使用ServletActionContext.getRequest总是出错的解決方法
- ServletActionContext.getRequest().getServletPath()错误的解决方法
- ServletActionContext.getRequest().getServletPath()错误的解决方法
- eclipse使用ServletActionContext.getRequest总是出错的解決方法
- 直接用request.setAttribute()会报错,在这之前应该先让request获取ServletActionContext.getRequest();方法 // request.getAttribute同理
- eclipse java文件中ServletActionContext.getServletContext()报找不到getServletContext()方法
- 获取servlet API的方法------ActionContext VS sessionAware
- ActionContext和ServletActionContext区别以及action访问servlet API的三种方法
- ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()
- jsp The method getServletContext() is undefined for the type in eclipse解决方法
- FlexContext.getFlexSession()在servlet的doPost方法中不能用的问题解决
- java后台获取服务器的相对路径,不用request.getSession().getServletContext()和ServletActionContext
- ActionContext和ServletActionContext区别以及action访问servlet API的三种方法
- getServletContext()空指针异常的原因 和 Servlet的init方法
- ActionContext和ServletActionContext区别以及action访问servlet API的三种方法
- struts2中ServletActionContext与ActionContext区别及获取Servlet对象方法
- struts2生成session的方法:ActionContext.getContext().getSession()
- Eclipse导入web项目,ServletActionContext.*() 出错的解決方法
- Eclipse导入web项目,ServletActionContext.*() 出错的解決方法