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的内容!
请教大家,这个问题如何解决
我执行的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的内容!
请教大家,这个问题如何解决
解决方案 »
- 关于楼层的设定。
- java定时器
- maven2执行mvn deploy时所出现的很缠人的错误。
- oracle和mysql数据库的问题!求高手回答
- java问题
- applet里面调用客户端的dll的方法?
- 关于Struts Validator的疑问:客户端的验证方法(JavaScripte)如何使用自己的类验证器.
- 写了一个javabean的小例子 但运行不起来 各位高手帮忙看看吧
- jboss默认的web应用放在哪里?
- java jni 调用C c 实现openssl 加密和解密
- 高分求struts2整合spring和hibernate的视频教程
- 先学EJB还是框架(struts,spring,hibernate)?
看看你把spring的那个contextloader加载进来没有,在web.xml里配置一下需要
FirstDispatchAction extends MyFirstDispatchAction?/productfirst.do 请求是Spring的 /productfirst 确认被拿到了?-----------
其他所有的action用spring注入没任何问题,我怀疑是上面这部分的配置没执行
-----------这句话让人更疑惑,难道别的东西还是依赖你这个 “/productfirst” bean的初始化?
这个怎么配置呢?
是这样的,我这里访问productfirst.do时spring是会自动注入mm对象的,
但是我访问的是其他action的name,即是productsecond.do(productsecond是MyFirstDispatchAction子类的一个action name)那么此时执行MyFirstDispatchAction时,spring就没给他注入mm这个对象了!
<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是空值,没注入!
如果没继承这一个的话,那么就意味着我要在这一类的所有Action中都写上相同的验证代码!
<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>
WEB-INF/struts-context.xml没这个啊?
这样会报错!
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/struts-context.xml]
一个action对应一个路径。很多个路径,而这类路径与其他的Action类路径没什么明显的区别,所以我也不清楚这个拦截条件该怎么写!
如果一定要拦截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);
}
这个似乎说到点上了!
子类执行的时候,父类也已经初始化的,但是问题就是这时父类初始化就没给注入其对象了!
我并不是在子类中要拿到这个属性,这个是在在父类执行的!给你看下源代码!:
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是空值!
拦截我知道,也拦截到了!但是因为我在验证过程中,是需要在request或者session中取东西的!用aop似乎取不到啊
这个自然是正常的,lz你要理解子类跟父类,以及,子类跟父类的instance之间的关系A extends B
B b = new B();是A跟B之间的关系, 而不是A跟b之间的关系,好好理解一下吧。
这个问题要加filter的话,访问路径很多,而且没什么规律,这时就出现了很多个判断,特别是Action非常多的情况下,这些判断写起来也就太多,而且似乎是一个增加一个action就需要多增加一个判断,似乎也不是很合理!如果用aop aspect 的话,因为验证过程中要取到request或者session,这个也不是很好搞啊!本来想我上面想的那个思路,如果能实现的话,是最简单也是最方便的!头大!
A extends B
B(mm)
A(mm){
super(mm);
}
在spring配置文件里面增加一个constructor的参数,把mm reference过去。
这些我都知道啊!
我不理解的就是,为什么直接访问父类的路径时,spring会给注入Mm对象。而访问子类时,spring却不给其父类注入该对象!
那么,我在子类也注入该对象时,也出现同样的问题!这个问题,改怎么解决呢?
用构造函数的话,可以了!谢谢了兄弟#89
不过似乎很麻烦,我尝试下能不能用aspect解决掉!学习嘛,多玩玩,哈!