ServletActionContext.getServletContext()方法不是什么时候都能用的

1.当时我是这么建立这个类的

Java代码  收藏代码
  1. public class StaticAction extends ActionSupport { 
  2.     static
  3.         logDir = ServletActionContext.getServletContext().getRealPath("/"); //在这里打个断点 
  4.     } 
  5.  

2.在com.opensymphony.xwork2.DefaultActionInvocation 类下大约第362行

Java代码  收藏代码
  1. private void init() throws Exception { 
  2.         Map contextMap = createContextMap(); 
  3.  
  4.         createAction(contextMap); //在这个方法打个断点,该方法会去创建你所调用的Action。详情可以看看它里面的objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);这一句 
  5.  
  6.         if (pushAction) { 
  7.             stack.push(action); 
  8.         } 
  9.  
  10.         invocationContext = new ActionContext(contextMap); //注意你所调用的Action,它的ActionContext在这里才会创建。 
  11.         invocationContext.setName(proxy.getActionName()); 
  12.  
  13.         // get a new List so we don't get problems with the iterator if someone changes the list 
  14.         List interceptorList = new ArrayList(proxy.getConfig().getInterceptors()); 
  15.         interceptors = interceptorList.iterator(); 
  16.     } 

好了。调试运行。因为StaticAction有静态代码块,而objectFactory在创建action实例时,使用的是Class.forName(String cls)方式,它的具体实现如下:

Java代码  收藏代码
  1. java.lang.Class.java 
  2.  
  3.     public static Class<?> forName(String className)  
  4.                 throws ClassNotFoundException { 
  5.         return forName0(className, true, ClassLoader.getCallerClassLoader()); 
  6.     } 

看到forName0的第二个参数设置为true了吗?表示该类被JVM装载后,要不要立即初始化,如果设置成false,表示在将初始化的工作推迟到了newInstance的时候进行.所以,当方法createAction(contextMap)被调用时,要执行的StaticAction的静态代码块肯定会被调用的。


当运行到ServletActionContext.getServletContext().getRealPath("/")这一句时,继续查看ServletActionContext.getServletContext()的来源:


org.apache.struts2.ServletActionContext.java 大概第137行

Java代码  收藏代码
  1. public static ServletContext getServletContext() { 
  2.     return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT); 

可以看到其实调用的是ActionContext.getContext().get(SERVLET_CONTEXT);过来的,而咱们在最开始也看到了createAction(contextMap);方法在 invocationContext = new ActionContext(contextMap); 方法执行之前,是无法正常得到SERVLET_CONTEXT的,所以,就会出空指针异常了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public class UploadAction extends ActionSupport { //定义一个继承自ActionSupport的类UploadAction,用于文件上传功能 private static final long serialVersionUID = 1L; //定义一个序列化ID,用于版本控制 private static final String CONTENT_TYPE= "text/html; charset=utf-8"; //定义一个常量CONTENT_TYPE,表示上传文件的内容类型 public String execute() { //定义一个execute方法,用于执行文件上传操作 HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); //获取HttpServletResponse响应对象 HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); //获取HttpServletRequest请求对象 SingleFileUpload upload = new SingleFileUpload(); //创建SingleFileUpload类的实例 try { upload.parseRequest(request); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } //解析HttpServletRequest请求对象,获取上传的文件信息 String temp =ServletActionContext.getServletContext().getRealPath("/") + "upload\temp\"; //获取临时目录存储路径 System.out.print("上传路径"+temp); //输出上传路径 String loadpath = ServletActionContext.getServletContext().getRealPath("/") + "upload\"; //获取上传文件存储路径 File file = new File(temp); //创建文件对象 if(!file.exists()) file.mkdirs(); //如果临时目录不存在,则创建该目录 try { upload.upload(file); response.getWriter().write(upload.getFileItem().getName()); } catch(org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e){ //文件大小超过限制 e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); } //上传文件,将文件存储到指定路径下,返回文件名 return null; //返回null值,表示上传完成,不进行页面跳转 } } //类UploadAction结束

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值