郭克华J2EE高级框架实战教学 对于购物车这种轻量级的组件,,可能在一个ActionAction里面要实现添加,,删除,,修改,,查询等各种工作,,但是只有一个executeexecute方法,,怎么办? ### J2EE 高级Action知识点详解 #### 一、背景与问题提出 在Web开发中,特别是使用Struts框架时,经常会遇到一个问题:当一个简单的组件(如购物车)需要执行多种操作(如添加商品、删除商品、修改商品数量等),而Struts的`Action`类通常只有一个`execute`方法时,如何设计才能更高效地处理这些逻辑呢? #### 二、解决方案介绍 针对上述问题,我们可以采用以下几种方法来优化Action的设计: 1. **DispatchAction** - **定义**:`DispatchAction`是Struts框架提供的一种特殊的`Action`实现,它可以在一个Action中根据不同的请求参数执行不同的方法。 - **应用场景**:当一个页面需要通过同一个Action处理多种类型的请求时,可以使用`DispatchAction`。 2. **MappingDispatchAction** - **定义**:`MappingDispatchAction`同样是Struts框架提供的一种特殊Action,它可以根据请求参数动态映射到不同的Action处理类。 - **应用场景**:当一个页面需要通过同一个Action但映射到不同逻辑处理时使用,这样可以减少Action类的数量,提高代码复用率。 3. **LookupDispatchAction** - **定义**:`LookupDispatchAction`也是Struts提供的另一种特殊Action,它可以通过Action内部的方法选择来执行不同的逻辑。 - **应用场景**:当一个页面中有多个提交按钮,每个按钮触发不同的业务逻辑时使用。 #### 三、DispatchAction详解 **1. 实现方法** - 创建一个继承自`DispatchAction`的类,并为其添加多个处理方法,这些方法可以根据不同的请求参数(例如`method`)被调用。 - 在JSP页面中使用`<s:form>`标签,并通过`<s:url>`设置`method`属性为具体的处理方法名,以实现不同的请求行为。 - 注意表单提交方式应设置为`POST`。 **2. 耦合性评价** - `DispatchAction`降低了Action与视图之间的耦合度,因为它不需要为每一个请求创建一个新的Action类。 - 但是,这种方式也增加了Action自身的复杂度,因为一个Action类需要处理多种业务逻辑。 **示例代码**: ```java public class ShoppingCartAction extends DispatchAction { public String addBook() { // 添加书籍到购物车 return SUCCESS; } public String removeBook() { // 从购物车移除书籍 return SUCCESS; } } ``` #### 四、MappingDispatchAction详解 **1. 实现方法** - 创建一个继承自`MappingDispatchAction`的类,并为其添加多个处理方法。 - 在Struts配置文件中为该Action配置不同的`parameter`值,这些值对应不同的处理方法。 - 页面通过传统方式提交请求。 **2. 耦合性评价** - `MappingDispatchAction`进一步降低了Action与视图之间的耦合度,因为可以通过配置文件动态地指定不同的处理方法。 - 但是,这也意味着配置文件变得更为复杂,维护成本增加。 **示例代码**: ```xml <!-- struts-config.xml --> <action path="/shoppingCart" type="com.example.ShoppingCartAction" parameter="method"> <forward name="addBook" path="/addBook"/> <forward name="removeBook" path="/removeBook"/> </action> ``` #### 五、LookupDispatchAction详解 **1. 实现方法** - 创建一个继承自`LookupDispatchAction`的类,并为其添加多个处理方法。 - 在Action类内部通过`lookupMethod`方法来决定调用哪个处理方法。 - 页面通过不同的提交按钮提交请求。 **2. 耦合性评价** - `LookupDispatchAction`提供了更为灵活的方式处理多个提交按钮,因为它允许在Action内部动态决定调用哪个方法。 - 但是,这种方式仍然需要在Action内部维护一定的逻辑判断,可能会导致Action类的复杂度提升。 **示例代码**: ```java public class LoginRegisterAction extends LookupDispatchAction { private String button; public String getButton() { return button; } public void setButton(String button) { this.button = button; } @Override protected String findForwardMethod() { return button; // 根据button值返回对应方法名 } public String login() { // 登录逻辑 return SUCCESS; } public String register() { // 注册逻辑 return SUCCESS; } } ``` #### 六、总结 通过以上分析可以看出,`DispatchAction`、`MappingDispatchAction`和`LookupDispatchAction`都是解决单个Action处理多种业务逻辑的有效手段。其中,`DispatchAction`相对简单直接,适用于处理较为简单的场景;`MappingDispatchAction`则更加灵活,适合需要根据不同请求参数执行不同Action的情况;`LookupDispatchAction`则更适合处理包含多个提交按钮的表单。开发者可以根据实际需求选择最适合的解决方案。
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助