- 浏览: 302700 次
- 性别:
- 来自: 南昌
文章分类
最新评论
-
秋风扫落叶:
不错,学习了。shadow文件中记录的格式是什么?
/etc/passwd & /etc/shadow 详解 -
key232323:
重拾jstl——写得很好。我收藏下。
JSTL标签用法 -
zxl10059:
不错,非常简明扼要
Hibernate分页 -
Batmankwok:
很好,所见略同,
自定义组件MXML和as两种实现的方式和区别 -
Dxx23:
摘话回帖!
通过response对象的sendRedirec ...
response.sendRedirect方式的转向与RequestDispatcher的forward方法的比较
DispatchAction, LookupDispatchAction, MappingDispatchAction深入分析
首先我们来看一下它们三者之间的关系 java.lang.Object | +--org.apache.struts.action.Action | +--org.apache.struts.actions.DispatchAction | +--org.apache.struts.actions.LookupDispatchAction | +--org.apache.struts.actions.MappingDispatchAction
DispatchAction定义 public abstract class DispatchAction extends Action这是一个抽象的Action,它会根据request 中的parameter来执行相应的方法。通个这个Action类可以将不同的Action集中到一个Action文件中来。 Struts-config.xml: <action path="/saveSubscription" type="org.apache.struts.actions.DispatchAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="method"/> 在Action中要有相应的方法: Public class demoAction extends DispatchAction{ public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception } 你就可以通过这样的方法来访问你的程序 :
http://localhost:8080/myapp/saveSubscription.do?method=update
如果parameter中参数为空,则执行Action中unspecified方法
LookupDispatchActionpublic abstract class LookupDispatchAction extends DispatchAction通过这个Action抽象类继承DispatchAction,它的相应方法的执行由 ActionMapping中parameter属性决定。它适合在一个form中有很多按钮,按不同的按钮则执行不同的操作。 struts-config.xml:
<action path="/test" type="org.example.MyAction" name="MyForm" scope="request" input="/test.jsp" parameter="method"/>
ApplicationResources.properties:
button.add=add button.delete=delete JSP:
Action 中必须实现getKeyMethodMap:
protected Map getKeyMethodMap() { Map map = new HashMap(); map.put("button.add", "add"); map.put("button.delete", "delete"); return map; } public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // do add return mapping.findForward("success"); } public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // do delete return mapping.findForward("success"); }
MappingDispatchAction public class MappingDispatchAction extends DispatchAction它的相应方法的执行由 ActionMapping中parameter名决定,注意这里和LookupDispatchAction不同,LookupDispatchAction的相应方法的执行由 ActionMapping中parameter属性决定,
struts-config.xml:
<action path="/saveSubscription" type="org.example.SubscriptionAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="method"/>
Action:
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
for which you would create corresponding <action> configurations that reference this class:
<action path="/createSubscription" type="org.example.SubscriptionAction" parameter="create"> <forward name="success" path="/editSubscription.jsp"/> </action> <action path="/editSubscription" type="org.example.SubscriptionAction" parameter="edit"> <forward name="success" path="/editSubscription.jsp"/> </action> <action path="/saveSubscription" type="org.example.SubscriptionAction" parameter="save" name="subscriptionForm" validate="true" input="/editSubscription.jsp" scope="request"> <forward name="success" path="/savedSubscription.jsp"/> </action> <action path="/deleteSubscription" type="org.example.SubscriptionAction" name="subscriptionForm" scope="request" input="/subscription.jsp" parameter="delete"> <forward name="success" path="/deletedSubscription.jsp"/> </action> <action path="/listSubscriptions" type="org.example.SubscriptionAction" parameter="list"> <forward name="success" path="/subscriptionList.jsp"/> </action>
|
DispatchAction,LookupDispatchAction,MappingDispatchAction
1) DispatchAction就是在struts-config中用parameter参数配置一个表单字段名,这个字段的值就是最终替代execute被调用的方法. 例如parameter="method"而request.getParameter("method")="save",其中"save"就是MethodName。struts的请求将根据parameter被分发到"save"或者"edit"或者什么。但是有一点,save()或者edit()等方法的声明和execute必须一模一样。
2) LookupDispatchAction继承DispatchAction, 用于对同一个页面上的多个submit按钮进行不同的响应。其原理是,首先用MessageResource将按钮的文本和ResKey相关联,例如button.save=保存;然后再复写getKeyMethodMap(), 将ResKey和MethodName对应起来, 例如map.put("button.save", "save"); 其配置方法和DispatchAction是一样的, 使用时要这么写:
3) MappingDispatchAction是1.2新加的, 也继承自DispatchAction. 它实现的功能和上面两个区别较大, 是通过struts-config.xml将多个action-mapping映射到同一个Action类的不同方法上, 典型的配置就是:
然后UserAction继承MappingDispatchAction,其中有:public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
等方法
可以看到, 不管怎么变化, 其实这些类都是把execute给分解开, 不管是save, edit还是其他什么方法, 其实都是和原来的execute是等价的, save和edit之间没有任何直接的关系, 而事实呢,它们是同一个业务模型的两种不同操作。 我觉得这就是一个问题,对于save和edit这两种请求, 我后台逻辑有可能只是调用service的方法那一句不一样,其他代码是完全一致的(例如错误处理, 日志记录等)。因此我想出了这个小东西,在execute方法内部进行局部分解。
上面有人说看iBATIS的代码看到过类似的。的确,iBATIS实现了一个BeanAction,将ActionForm和Acion写到了一个类里,然后通过一个ThreadLocal的局部变量在各个方法之间传递actionMapping, request, response这些参数。其每个方法的声明变得非常简单,返回的也是字符串forward名。
我在很大程度上是受了Clinton Begin的一些启发,但是BeanAction实现的框架稍微有些大,改写了struts的根本模式。而且作者也说,该框架没有经过实际应用的测试,所以我不想用。
楼顶的帖子我是想说的尽量全面些,所以把service,dao什么的都写进去了。有人说为什么不用setDao, 我不太明白是什么意思。是不是用spring直接注入呢?那样的话,必须用spring的代理,感觉不是很稳定而且大大增加了配置工作。
有人说xxxDao是局部变量,线性不安全。我也是想问问这个,象这种DAO和Service类,其本身一旦建立,是不会进行任何修改的(但是因为要从spring取,所以不能声明为final)。是不是可以理解为提供一些静态方法(例如saveWorld)的工具类呢?
发表评论
-
在struts中使用checkbox实现批量删除
2010-04-01 20:39 1635在struts中使用checkbox实现批量删除 JSP ... -
struts1.x总结
2010-03-17 08:42 743Struts是基于Model 2之上的,而Model 2是经典 ... -
Hibernate分页
2009-11-13 13:24 968在进行web应用开发的时候经常要进行分页处 ... -
Hibernate主键生成方式
2009-09-20 13:05 7371) assigned 主键由外部程序负责生成,无需Hibe ... -
结合Struts和Hibernate谈J2EE架构的数据表示
2009-09-17 00:36 737在 struts+ hibernate 这种结构中,是不应该把 ... -
Struts标签库详解(三)
2009-09-08 14:31 992Bean 标签库 此标签库和Java Bean ... -
Struts标签库详解(二)
2009-09-08 14:30 954<form>标签系列使用& ... -
Struts标签库详解(一)
2009-09-08 14:29 921Struts提供了五个标签库,即:HTML、Bean、Log ... -
胡诌Spring
2009-09-05 22:50 1107像Struts一样, ... -
两个字母搞定J2EE通用分页标签(二)
2009-08-24 10:21 1017作者:张纪豪(转载请注明出处) (三)、数据访问层设计与数据 ... -
两个字母搞定J2EE通用分页标签(三)
2009-08-24 10:23 1037作者:张纪豪(转载请注明出处) (四)、控制层取得分页数据 ... -
两个字母搞定J2EE通用分页标签(四)
2009-08-24 10:26 1002作者:张纪豪(转载请注明出处) (五)、视图层的JSP页面输 ... -
两个字母搞定J2EE通用分页标签(一):
2009-09-01 18:16 876作者:张纪豪(转载请注明出处) (一)摘要与设计思想 ... -
ApplicationResources
2009-08-04 16:02 738能够为ActionServlet同时指定多个xml配置文件, ... -
修改action
2009-08-05 12:24 782更改源文件MyAction.java package str ... -
myeclipse中如何自动生成hibernate得POJO和hbm.xml文件
2009-08-14 21:21 4553在Eclipse中打开MyEclipse的DbBrowser窗 ...
相关推荐
DispatchAction与MappingDispatchAction
struts中的DispatchAction应用实例
一个比较简单的struts的dispatchAction 类的入门案例,适合初学者理解dispatchAction
简单的DispatchAction实例。。。。。。。。
DispatchAction的作用简单地说就是把原来我们写在多个acton里的操作放在同一个 action里处理。
Struts(DispatchAction) + 存储过程 => 实现分页效果
在页面中用js传递执行方法参数,传递到后台执行, 在你用的Action类中的方法名前加“run“及可被调用。
解决Struts1.x中使用Validator框架对DispatchAction不同方法使用不同的字段验证 你可以先参看我的blog文章:http://blog.csdn.net/qjyong/archive/2008/11/16/3311688.aspx 再决定是否下载。
03Struts2常用标签&DispatchAction.rar03Struts2常用标签&DispatchAction.rar03Struts2常用标签&DispatchAction.rar03Struts2常用标签&DispatchAction.rar
Struts 之 DispatchAction add
Struts1中怎样实现DispatchAction配置多个input属性\Struts1中怎样实现DispatchAction配置多个input属性
利用struts标签,dispatchAction,实现增删改查 有利于初学者掌握struts!
这是个SSH整合的简单例子,Action是继承自DispatchAction,多个JSP页面或是form可以跳转到这一个Action中调用同一个或是不同滴方法,有兴趣滴可以看一下,绝对无误!
自习struts时做时,大家可以互相交流一下
主要介绍了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web开发框架之一,需要的朋友可以参考下
最近自学java中的框架-struts写了一些小例子,这都是很经典的程序,如果大家瞧得起要下载去看看,顺便给俺找找不足的地方。我的qq 821865130 email qingtian_hechen@163.com 希望大家能多多给我帮助...在此谢谢各位!!
Struts 之 DispatchAction
2、内含详细的注释说明 3、知识点较全面 【内容目录】 01 Struts_01HandworkApply : 手工配置Struct应用程序,演示用户提交数据后服务器的应答 02 Struts_02MyEclipseApply : 借助于MyEclipse6开发Struct应用程序,...
struts 框架验证,是针对在某一次具体的请求过程中对这次请求所提交的表单进行验证,也就是根据Action路径进行表单验证,使用的Action为DispatchAction,使用的Form是ValidatorActionForm,其中有个说明文件“ReadMe...
用struts1.2写的一个计算器示例程序,供研究struts原理的初学者参考,其中action继承的DispatchAction。