【望高人指点】struts2的Action构造函数中为何无法取得ServletContext?

netsgo 2009-04-15 03:30:20
我想在struts2的构造函数中做一些初始化处理,模仿spring的依赖注入方式初始化service组件。
比如:


public class LoginAction
{
private String userId;
private String password;
private UserLoginService userLoginService;

public P0101002Action(){
ServletContext context = ServletActionContext.getServletContext(); //上面这句之后context为null,但是如果把这句直接放到execute事件中就可以取到,为何?
}
//........

public String execute(){
ServletContext context = ServletActionContext.getServletContext();
//放到这里则可以取得上下文ServletContext
}
}



上面代码中红色那句,取得的context为空,但是如果把这句直接放到execute事件中就可以取到,为什么?
如果就是不行,有别的方法可以取得吗?

注意:本帖不讨论为何不用spring之类的问题,本人就是需要不用spring而解决上面问题的答案。
...全文
1175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon 2010-07-20
  • 打赏
  • 举报
回复
如果需要每次进入action时,使用servletContext,可以考虑重写下execute方法。
leon 2010-07-20
  • 打赏
  • 举报
回复
Action类的servlet属性是在Action对象创建后,调用setServlet()方法进行赋值的。在构造函数阶段,servlet属性为null。
参见struts源码:RequestProcessor.processActionCreate()方法的实现。

Action instance;

synchronized (actions) {
// Return any existing Action instance of this class
try {
instance = (Action) RequestUtils.applicationInstance(className);

// Maybe we should propagate this exception
// instead of returning null.
} catch (Exception e) {
......
}
actions.put(className, instance);

if (instance.getServlet() == null) {
instance.setServlet(this.servlet);
}
}
祝威廉 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 SINCE1978 的回复:]
s2的action可以实现Preparable
复写prepare()方法,其中可以获取如:
ServletActionContext.getRequest()
[/Quote]


正解
SINCE1978 2009-04-21
  • 打赏
  • 举报
回复
s2的action可以实现Preparable
复写prepare()方法,其中可以获取如:
ServletActionContext.getRequest()
netsgo 2009-04-15
  • 打赏
  • 举报
回复
哇,没人知道么?还是我没说清楚问题?
netsgo 2009-04-15
  • 打赏
  • 举报
回复
晕,忘了按代码格式提交标签就无效了。

public class LoginAction
{
private String userId;
private String password;
private UserLoginService userLoginService;

public P0101002Action(){
ServletContext context = ServletActionContext.getServletContext();
//上面这句之后context为null,但是如果把这句直接放到execute事件中就可以取到,为何?
}
//........

public String execute(){
//放到这里则可以取得上下文ServletContext
ServletContext context = ServletActionContext.getServletContext();
}
//...........
}
netsgo 2009-04-15
  • 打赏
  • 举报
回复
不好意思,上面代码有误,构造函数写错了,应该是:
public LoginAction(){
ServletContext context = ServletActionContext.getServletContext(); //上面这句之后context为null,但是如果把这句直接放到execute事件中就可以取到,为何?
}

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧