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的内容!
请教大家,这个问题如何解决

解决方案 »

  1.   

    没有初始化。
    看看你把spring的那个contextloader加载进来没有,在web.xml里配置一下需要
      

  2.   

    问题不详细!
    FirstDispatchAction extends MyFirstDispatchAction?/productfirst.do 请求是Spring的 /productfirst 确认被拿到了?-----------
    其他所有的action用spring注入没任何问题,我怀疑是上面这部分的配置没执行
    -----------这句话让人更疑惑,难道别的东西还是依赖你这个 “/productfirst” bean的初始化?
      

  3.   


    这个怎么配置呢?
    是这样的,我这里访问productfirst.do时spring是会自动注入mm对象的,
    但是我访问的是其他action的name,即是productsecond.do(productsecond是MyFirstDispatchAction子类的一个action name)那么此时执行MyFirstDispatchAction时,spring就没给他注入mm这个对象了!
      

  4.   

    不好意思,我说的不够详细MyFirstDispatchAction extends DispatchAction其他所有的action extends MyFirstDispatchAction (例如OtherAction)在spring配置文件中如下:
    <bean name="/MyFirstDispatchAction" class="huanran.action.ProductFirstAction">
    <property name="mm">
    <ref bean="membermanager"/>
    </property>
    </bean>

    <bean name="/OtherAction" class="huanran.action.ProductTypeAction">
    <property name="ptm">
    <ref bean="producttypemanager"/>
    </property>
    </bean>那么此时,我直接用MyFirstDispatchAction.do访问的话,MyFirstDispatchAction的Mm对象就会被Spring 注入
    但是实际上,我的目的是要访问OtherAction,从而来执行MyFirstDispatchAction.execute()这个方法
    所以我用OtherAction.do访问时,MyFirstDispatchAction.exceute()执行的时候,就提示mm是空值,没注入!
      

  5.   

    请问你要验证什么,继承DispatchAction已经够复杂啦,还要来多一层
      

  6.   

    我要严重权限,这个是struts1的,确实比较麻烦,但是问题是这样的,其他东西基本上都写好了,现在改struts2的话,工程量太大!现在是想加入个验证权限的,就是想在excetu里面验证该用户是否具有访问这一类Action的权限
    如果没继承这一个的话,那么就意味着我要在这一类的所有Action中都写上相同的验证代码!
      

  7.   

    在struts-config。xml文件中 添加<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
       <set-property property="contextConfigLocation" value="/WEB-INF/struts-context.xml"/>
      </plug-in> 
    在web.xml中添加<listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      

  8.   

    用filter和spring拦截器都可以。如果spring够支持的话,直接上aspectj
      

  9.   


    WEB-INF/struts-context.xml没这个啊?
    这样会报错!
    Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/struts-context.xml]
      

  10.   

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

  11.   

    因为在这个验证过程中,还需要用到request或者session的东西,如果用aspect的话,似乎拿不到这些对象吧?
      

  12.   

    那就用AOP吧,拦截Action中的特定方法
      

  13.   

    看着不像是个spring的问题,倒像是最基本的继承都没立即mm既然是父类action的,子类何来这个property?
      

  14.   


    如果一定要拦截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);
    }
      

  15.   


    这个似乎说到点上了!
    子类执行的时候,父类也已经初始化的,但是问题就是这时父类初始化就没给注入其对象了!
    我并不是在子类中要拿到这个属性,这个是在在父类执行的!给你看下源代码!:
    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是空值!
      

  16.   


    拦截我知道,也拦截到了!但是因为我在验证过程中,是需要在request或者session中取东西的!用aop似乎取不到啊
      

  17.   


    这个自然是正常的,lz你要理解子类跟父类,以及,子类跟父类的instance之间的关系A extends B
    B b = new B();是A跟B之间的关系, 而不是A跟b之间的关系,好好理解一下吧。
      

  18.   


    这个问题要加filter的话,访问路径很多,而且没什么规律,这时就出现了很多个判断,特别是Action非常多的情况下,这些判断写起来也就太多,而且似乎是一个增加一个action就需要多增加一个判断,似乎也不是很合理!如果用aop aspect 的话,因为验证过程中要取到request或者session,这个也不是很好搞啊!本来想我上面想的那个思路,如果能实现的话,是最简单也是最方便的!头大!
      

  19.   

    lz不妨尝试一下从构造方法上入手
    A extends B
    B(mm)
    A(mm){
     super(mm);
    }
    在spring配置文件里面增加一个constructor的参数,把mm reference过去。
      

  20.   


    这些我都知道啊!
    我不理解的就是,为什么直接访问父类的路径时,spring会给注入Mm对象。而访问子类时,spring却不给其父类注入该对象!
    那么,我在子类也注入该对象时,也出现同样的问题!这个问题,改怎么解决呢?
      

  21.   


    用构造函数的话,可以了!谢谢了兄弟#89
    不过似乎很麻烦,我尝试下能不能用aspect解决掉!学习嘛,多玩玩,哈!
      

  22.   

      不懂,干嘛在子类加上MemberManager mm属性。直接在spring配置父类 abstract=true,然后再子类的配置上加上parent  这样不就可以了
      

  23.   

    唔,个人觉得,按照你的案例,写基类确实是比较好的方法。而如果用一般的Spring AOP的话,也是可以取request中的值的。但XML配置起来比较麻烦。如果用AspectJ的话,是只能拦截实现了某接口的类的方法。所以还得在每个Action的每个方法里头添加一个验证方法。
      

  24.   

    刚刚试了试,利用24楼说的方法,配置文件中子类也不需要注入了直接声明这样的一个bean即可。真到位,草