通常在设计中往往会要求同一个Action来处理客户端发出的不同请求,如下
代码
<
a
href
="
users.do&operation=deleteUsr
">删除一个成员</
a>
<a href="users.do&operation=addUsr">添加一个成员<
/
a
>
碰到该类问题,在struts中得到了很好的处理,如下
sturts-config.xml配置
代码
<actiontype="test.struts.dispatch.UserAction"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">
<forwardname="del_succ"path="/del_succ.jsp"/>
<forwardname="ins_succ"path="/ins_succ.jsp"/>
<forwardname="failed"path="/error.jsp"/>
</action>
UserAction代码
代码
publicclass UserActionextendsDispatchAction{
publicUserAction(){}
publicActionForwarddeleteUsr(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
......
}
publicActionForwardaddUsr(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
......
}
在struts中DispatchAction 很好的解决了此类问题。可是当spring+sturst结合的过程中,如果碰到上面的问题,首先改写struts-config.xml
代码
<actionpath="/users"type="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"scope="request">
<forwardname="del_succ"path="/del_succ.jsp"/>
<forwardname="ins_succ"path="/ins_succ.jsp"/>
</action>
显而易见,在面向SS组合的配置方式中,用spring提供的DelegatingActionProxy 作为Action
的type属性。DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将
把调用请求转交给真正的Action实现.如下
代码
<beanname="/users"class="classmate.LoginAction"singleton="false">
<propertyname="userDAO">
<refbean="userDAOProxy"/>
</property>
</bean>
DelegatingActionProxy则实现了针对实际Action的调用代理,struts最终调用的将是由spring管理的Action实例,这样客户端发送的各种请求就可以用spring的Ioc设计思想实现了。可是在我发现并不是我预想的那样结果,总是出现source not found。程序无法执行下去,原因很简单就是在
代码
<actionpath="/users"type="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"scope="request">
<forwardname="del_succ"path="/del_succ.jsp"/>
<forwardname="ins_succ"path="/ins_succ.jsp"/>
</action>
的时候,并没有像struts那样传递一个参数parameter="operation",所以肯定找不到执行哪一个Action的type,我猜想DelegatingActionProxy代理返回的类型一定不会是DispatchAction,于是我查看了DelegatingActionProxy的源码
代码
publicclass DelegatingActionProxyextendsAction{/**
* Pass the execute call on to the Spring-managed delegate Action.
* @see #getDelegateAction
*/
publicActionForwardexecute(
ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
ActiondelegateAction=getDelegateAction(mapping);
returndelegateAction.execute(mapping,form,request,response);
}
......
}
果然是继承了Action,此时我要实现上述描述的操作,DelegatingActionProxy代理应该如何处理呢?
改写struts-config.xml的时候,你只需要更改type为org.springframework.web.struts.DelegatingActionProxy,其他的还是按照原来不与spring结合那样写就可以了。
即改写成如下sturts-config.xml配置
代码
<actiontype="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">
<forwardname="del_succ"path="/del_succ.jsp"/>
<forwardname="ins_succ"path="/ins_succ.jsp"/>
<forwardname="failed"path="/error.jsp"/>
</action>
改写struts-config.xml的时候,你只需要更改type为org.springframework.web.struts.DelegatingActionProxy,其他的还是按照原来不与spring结合那样写就可以了。
即改写成如下sturts-config.xml配置
代码
<actiontype="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">
<forwardname="del_succ"path="/del_succ.jsp"/>
<forwardname="ins_succ"path="/ins_succ.jsp"/>
<forwardname="failed"path="/error.jsp"/>
</action>
谢谢你的恢复,你的意思就是追加一个parameter="operation"参数的传递,按照你的说法,我试了一下,果然达到了预期的效果,可是我就弄不明白DelegatingActionProxy
代理过后返回的是一个Action类型的,而在UserAction 中又必须继承DispatchAction
代码
publicclass UserActionextendsDispatchAction{
publicUserAction(){}
publicActionForwarddeleteUsr(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
......
}
publicActionForwardaddUsr(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)
throwsException{
......
}
spring是在哪里操作了parameter="operation"参数。谢谢
SS的这种结合方式耦合度低,便于利用Spring的IoC或AOP特性,正说明Spring对Struts并没有过多的干涉,仅仅是在其环境下来管理Struts Action,即Action的实际运作方式还是按Struts原有方式运行,所以在相应的Action类上还得继承Action类,DispatchAction类其中的一类来完成对应的操作。
所以我觉得Spring并没有操作parameter="operation"分发参数,这是由Struts本身来完成的。
代码
<actiontype="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">
可是在DelegatingActionProxy源码中并没有直接处理parameter="operation"这一个分发参数。spring是在哪里把这个参数告诉给了struts呢?
谢谢代码
<actiontype="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">
可是在DelegatingActionProxy源码中并没有直接处理parameter="operation"这一个分发参数。spring是在哪里把这个参数告诉给了struts呢?
谢谢
代码
protectedActiongetDelegateAction(ActionMappingmapping)throwsBeansException{
WebApplicationContextwac=getWebApplicationContext(getServlet(),mapping.getModuleConfig());
StringbeanName=determineActionBeanName(mapping);
return(Action)wac.getBean(beanName,Action.class);
}publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
ActiondelegateAction=getDelegateAction(mapping);
returndelegateAction.execute(mapping,form,request,response);
}