struts1与spring的继承注入问题

飞奔的兔子鸡 2010-09-17 01:42:54
Struts1中
我执行的action全部继承自DispatchAction

我要在这些所有的action中加入一个验证,我这里想到的是写一个MyFirstDispatchAction继承DispatchAction,重写execute方法,在这个方法内写验证
然后所有的action都继承MyFirstDispatchAction,从而达到一次验证处处验证的目的!

那么现在的问题是,MyFirstDispatchAction中有一个mm对象,是需要spring自动注入的,但是调用时一直都是提示为空,请问这个要如何配置呢?下面这个是我自己的配置,报空异常的
<bean name="/productfirst" class="huanran.action. FirstDispatchAction">
<property name="mm">
<ref bean="membermanager"/>
</property>
</bean>

其他所有的action用spring注入没任何问题,我怀疑是上面这部分的配置没执行,因为我没调用productfirst.do的内容!
请教大家,这个问题如何解决
...全文
380 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
甘苦绿茶 2011-08-22
  • 打赏
  • 举报
回复
刚刚试了试,利用24楼说的方法,配置文件中子类也不需要注入了直接声明这样的一个bean即可。真到位,草
甘苦绿茶 2011-08-22
  • 打赏
  • 举报
回复
要的就是这个,到位!
[Quote=引用 24 楼 wrskywolf123 的回复:]

不懂,干嘛在子类加上MemberManager mm属性。直接在spring配置父类 abstract=true,然后再子类的配置上加上parent 这样不就可以了
[/Quote]
甘苦绿茶 2011-08-22
  • 打赏
  • 举报
回复
这个解决方法值得考虑
[Quote=引用 20 楼 believefym 的回复:]

lz不妨尝试一下从构造方法上入手
A extends B
B(mm)
A(mm){
super(mm);
}


在spring配置文件里面增加一个constructor的参数,把mm reference过去。
[/Quote]
eemean 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wrskywolf123 的回复:]
不懂,干嘛在子类加上MemberManager mm属性。直接在spring配置父类 abstract=true,然后再子类的配置上加上parent 这样不就可以了
[/Quote]
高人出现
eemean 2010-09-17
  • 打赏
  • 举报
回复
唔,个人觉得,按照你的案例,写基类确实是比较好的方法。

而如果用一般的Spring AOP的话,也是可以取request中的值的。但XML配置起来比较麻烦。

如果用AspectJ的话,是只能拦截实现了某接口的类的方法。所以还得在每个Action的每个方法里头添加一个验证方法。
wrskywolf123 2010-09-17
  • 打赏
  • 举报
回复
不懂,干嘛在子类加上MemberManager mm属性。直接在spring配置父类 abstract=true,然后再子类的配置上加上parent 这样不就可以了
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 believefym 的回复:]
lz不妨尝试一下从构造方法上入手
A extends B
B(mm)
A(mm){
super(mm);
}


在spring配置文件里面增加一个constructor的参数,把mm reference过去。
[/Quote]

用构造函数的话,可以了!谢谢了兄弟#89
不过似乎很麻烦,我尝试下能不能用aspect解决掉!学习嘛,多玩玩,哈!
believefym 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 huanran_li 的回复:]
这些我都知道啊!
我不理解的就是,为什么直接访问父类的路径时,spring会给注入Mm对象。而访问子类时,spring却不给其父类注入该对象!
那么,我在子类也注入该对象时,也出现同样的问题!这个问题,改怎么解决呢?
[/Quote]

你没理解。。。
再琢磨吧。。。。
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 believefym 的回复:]
引用 16 楼 huanran_li 的回复:

子类action在执行过程中就出问题了!提示父累的mm是空值!


这个自然是正常的,

lz你要理解子类跟父类,以及,子类跟父类的instance之间的关系

A extends B
B b = new B();

是A跟B之间的关系, 而不是A跟b之间的关系,

好好理解一下吧。。。。
[/Quote]

这些我都知道啊!
我不理解的就是,为什么直接访问父类的路径时,spring会给注入Mm对象。而访问子类时,spring却不给其父类注入该对象!
那么,我在子类也注入该对象时,也出现同样的问题!这个问题,改怎么解决呢?
believefym 2010-09-17
  • 打赏
  • 举报
回复
lz不妨尝试一下从构造方法上入手
A extends B
B(mm)
A(mm){
super(mm);
}


在spring配置文件里面增加一个constructor的参数,把mm reference过去。
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 eemean 的回复:]
引用 12 楼 huanran_li 的回复:
引用 9 楼 eemean 的回复:
引用 6 楼 huanran_li 的回复:
引用 5 楼 eemean 的回复:
请问你要验证什么,继承DispatchAction已经够复杂啦,还要来多一层

我要严重权限,这个是struts1的,确实比较麻烦,但是问题是这样的,其他东西基本上都写好了,现在改struts2的话,工程量太大!

……
[/Quote]

这个问题要加filter的话,访问路径很多,而且没什么规律,这时就出现了很多个判断,特别是Action非常多的情况下,这些判断写起来也就太多,而且似乎是一个增加一个action就需要多增加一个判断,似乎也不是很合理!

如果用aop aspect 的话,因为验证过程中要取到request或者session,这个也不是很好搞啊!

本来想我上面想的那个思路,如果能实现的话,是最简单也是最方便的!头大!
believefym 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 huanran_li 的回复:]

子类action在执行过程中就出问题了!提示父累的mm是空值!
[/Quote]

这个自然是正常的,

lz你要理解子类跟父类,以及,子类跟父类的instance之间的关系

A extends B
B b = new B();

是A跟B之间的关系, 而不是A跟b之间的关系,

好好理解一下吧。。。。
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 eemean 的回复:]
引用 11 楼 huanran_li 的回复:
引用 7 楼 zn85600301 的回复:
你可以用拦截器 实现呀

因为这里有很多Action,我要验证的仅仅是其中的一类,如果用拦截器的话,还真不知道拦截条件是什么!
一个action对应一个路径。很多个路径,而这类路径与其他的Action类路径没什么明显的区别,所以我也不清楚这个拦截条件该怎么写!

那就用AOP吧,拦截Acti……
[/Quote]

拦截我知道,也拦截到了!但是因为我在验证过程中,是需要在request或者session中取东西的!用aop似乎取不到啊
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 believefym 的回复:]
看着不像是个spring的问题,倒像是最基本的继承都没立即

mm既然是父类action的,子类何来这个property?
[/Quote]

这个似乎说到点上了!
子类执行的时候,父类也已经初始化的,但是问题就是这时父类初始化就没给注入其对象了!
我并不是在子类中要拿到这个属性,这个是在在父类执行的!给你看下源代码!:
public class ProductFirstAction extends DispatchAction {

private MemberManager mm;

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("-------------ProductFirstAction.execute()-----------------");
Admin admin=(Admin)request.getSession().getAttribute("admin");
Member member=(Member)request.getSession().getAttribute("member");
if(admin!=null){
return super.execute(mapping, form, request, response);
}
else if(member!=null){
Member m=mm.load(member.getId());
if(member.getDepartment().isPrp()){
return super.execute(mapping, form, request, response);
}
}
request.setAttribute("msg", "你还没有登录或者你还没有权限作此操作");
return mapping.findForward("result2");
}

public void setMm(MemberManager mm) {
this.mm = mm;
}


package huanran.action;

import huanran.form.ProductForm;
import huanran.manager.Datas;
import huanran.manager.MemberManager;
import huanran.manager.ProductBrandManager;
import huanran.manager.ProductManager;
import huanran.value.Admin;
import huanran.value.Member;
import huanran.value.Product;
import huanran.value.ProductBrand;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

public class ProductAction extends ProductFirstAction {

private ProductManager pm;
private ProductBrandManager pbm;
private MemberManager mm;

public ActionForward del(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
int id=Integer.parseInt(request.getParameter("id"));
//做了很多处理
return mapping.findForward("result");
}
//这里还有好多其他方法,暂省略

public void setPm(ProductManager pm) {
this.pm = pm;
}

public void setPbm(ProductBrandManager pbm) {
this.pbm = pbm;
}

public void setMm(MemberManager mm) {
this.mm = mm;
}

}

子类action在执行过程中就出问题了!提示父累的mm是空值!
eemean 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 huanran_li 的回复:]
引用 9 楼 eemean 的回复:
引用 6 楼 huanran_li 的回复:
引用 5 楼 eemean 的回复:
请问你要验证什么,继承DispatchAction已经够复杂啦,还要来多一层

我要严重权限,这个是struts1的,确实比较麻烦,但是问题是这样的,其他东西基本上都写好了,现在改struts2的话,工程量太大!

现在是想加入个验证权限的,就是想在excetu里……
[/Quote]

如果一定要拦截Action,就取URI出来判断,,再与数据库中的权限记录进行比较。。。

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest rq=(HttpServletRequest) request;
RequestDispatcher rd = rq.getRequestDispatcher("/");
if(!rq.getRequestURI().equals("/")&&!rq.getRequestURI().equals("/perso.do")&&rq.getSession().getAttribute("diquid")==null){
rq.setAttribute("msg", "超时,请重新登录");
rd.forward(request, response);
}

if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}
chain.doFilter(request, response);
}
believefym 2010-09-17
  • 打赏
  • 举报
回复
看着不像是个spring的问题,倒像是最基本的继承都没立即

mm既然是父类action的,子类何来这个property?
eemean 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huanran_li 的回复:]
引用 7 楼 zn85600301 的回复:
你可以用拦截器 实现呀

因为这里有很多Action,我要验证的仅仅是其中的一类,如果用拦截器的话,还真不知道拦截条件是什么!
一个action对应一个路径。很多个路径,而这类路径与其他的Action类路径没什么明显的区别,所以我也不清楚这个拦截条件该怎么写!
[/Quote]
那就用AOP吧,拦截Action中的特定方法
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eemean 的回复:]
引用 6 楼 huanran_li 的回复:
引用 5 楼 eemean 的回复:
请问你要验证什么,继承DispatchAction已经够复杂啦,还要来多一层

我要严重权限,这个是struts1的,确实比较麻烦,但是问题是这样的,其他东西基本上都写好了,现在改struts2的话,工程量太大!

现在是想加入个验证权限的,就是想在excetu里面验证该用户是否具有访问这一类Actio……
[/Quote]
因为在这个验证过程中,还需要用到request或者session的东西,如果用aspect的话,似乎拿不到这些对象吧?
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zn85600301 的回复:]
你可以用拦截器 实现呀
[/Quote]
因为这里有很多Action,我要验证的仅仅是其中的一类,如果用拦截器的话,还真不知道拦截条件是什么!
一个action对应一个路径。很多个路径,而这类路径与其他的Action类路径没什么明显的区别,所以我也不清楚这个拦截条件该怎么写!
飞奔的兔子鸡 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lh446 的回复:]
在struts-config。xml文件中 添加<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/struts-context.xml"/>
</plug-in>
……
[/Quote]

WEB-INF/struts-context.xml没这个啊?
这样会报错!
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/struts-context.xml]
加载更多回复(9)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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