数据加载中……
请教SS中DelegatingActionProxy代理问题

通常在设计中往往会要求同一个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);
}













posted on 2007-04-01 16:44 叶浩 阅读(2098) 评论(4)  编辑  收藏

评论

# re: 请教SS中DelegatingActionProxy代理问题 2007-05-24 10:27 link

<actiontype="org.springframework.web.struts.DelegatingActionProxy"name="UserForm"parameter="operation"scope="request"path="/users"input="/users.jsp">这个在sturts-config.xml中配置完了。
在spring中是不是就不用再配置了。
  回复  更多评论    

# re: 请教SS中DelegatingActionProxy代理问题 2007-05-24 10:30 link

还是得配置啊,不好意思了。
  回复  更多评论    

# re: 请教SS中DelegatingActionProxy代理问题 2007-05-29 15:24 yaochang

好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好好
  回复  更多评论    

# re: 请教SS中DelegatingActionProxy代理问题 2008-08-23 15:08 Rekoe

在strurs-config.xml 中配置type = "org.springframework.web.struts.DelegatingActionProxy"
在spring的配置文件中配置class="" 这个Action的真实Action类的路径(包路径+类名)
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: