不同的Action类处理不同的用户请求,并不意味着一个Action类只能执行一个操作。在Action类中可以聚合多个操作。基本原则是一个Action与一个业务操作相关联。例如商品的增、删、改、查可以放到一个Action类中实现,而购物车功能不能和用户注册功能放到同一个Action类中。
Struts中预定义的Action类:
1. ForwardAction类:类似于<jsp:forward>功能,在Struts中尽量避免直接调用jsp(会失去了MVC风格),当仅仅需要从一个JSP页面到另一个JSP页面的请求转发操作时,并不需要一个真正的Action,ForwardAction类专门用于请求转发,不进行任何其他业务操作(MVC中控制器的作用),这样做的好处是控制器可以预处理请求。
具体使用ForwardAction类只需在配置文件中声明,无需编写代码:
<action
input=”/index.jsp”
name=”loginForm”
scope=”request”
validate=”false”
path=”/homepage”
type=”org.apache.struts.actions.ForwardAction”
parameter=”/shop/homepage.jsp” />
parameter属性用于指定往哪里转发。Path、type、parameter三个属性为必须,其他可忽略。
2. IncludeAction类:类似于<jsp:include>动作或Servlet中的RequestDispatcher的include()方法功能。
<action
input=”/index.jsp”
mane=”loginForm”
scope=”request”
validate=”false”
path=”/homepage”
type=”org.apache.struts.actions.IncludeAction”
parameter=”/shope/includepage.jsp” />
3. DispatchAction类:常用于在一个Action类中完成一组紧密相关的业务操作,例如增、删、改、查,可以减少重复编程。不同于一般的Action类,创建一个扩展DispatchAction类的子类时,不必覆盖execute()方法,而是创建一些实现具体业务操作的方法,这些方法和execute()方法有一样的参数和返回值,以及声明可能抛出的异常,例如:
Public final class UserAction extends DispatchAction{
Public ActionForward add(ActionMapping mapping,ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
Throws Exception{
If(log.isDebugEnabled())
Log.debug(“Entering ‘add’ method”);
User user = new User();
User.addRole(new Role(“admin”));
UserForm userForm = (UserForm)convert(user);
updateFormBean(mapping,request,userForm);
return mapping.findForward(“edit”);
}
public ActionForward delete(ActionMapping mapping,ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
Throws Exception{
…………….删除用户的代码写在这里。
Return mapping.findForward(“viewUsers”);
}
在配置DispatchAction类时,需要指定parameter属性为method,例如:
<action
path=”/users”
type=”包名. UserAction”
name=”userForm”
scope=”request”
input=”/userlist.jsp”
parameter=”method”
validate=”false”
>
<forward name=”edit” path=”/WEB-INF/shop/userEdit.jsp” redirect=”false”>
<forward name=”viewUsers” path=”/WEB-INF/shop/userlist.jsp” redirect=”false”>
</action>
4. LookupDispatchAction类:是DispatchAction的子类,不同之处在于DispatchAction类使用请求参数的值确定调用哪种方法,而LookupDispatchAction类利用请求参数值,反向查询资源绑定,并将它与类中的一种方法匹配。通常用于在有多个同名提交按钮的表单的场合。例如:
页面代码如下(具有相同的按钮名称“action”,但是每个按钮的值都不同):
<html:form action=”/shop/cart”>
….
<html:submit property=”action”>
<bean:message key=”cart.remove”/>
</html:submit>
….
<html:submit property=”action”>
<bean:message key=”cart.update”/>
</html:submit>
….
<html:submit property=”action”>
<bean:message key=”cart.checkout”/>
</html:submit>
</html:form>
这里提交按钮的名字action与配置文件中的parameter属性值一致。假定在资源文件中已经定义了键为cart.update和cart.checkou和cart.remove的消息资源。
配置文件如下:
<action
path=”/carts”
type=”包名.CartAction”
name=”userForm”
scope=”request”
input=”viewcart.jsp”
parameter=”action”
validate=”false”>
<forward name=”success” path=”/shop/viewcart.jsp” redirect=”false”/>
</action>
CartAction.java代码如下:(导入java.util.Map,实现方法:getKeyMethodMap())
Protected Map getKeyMethodMap(){
Map map = new Map();
Map.put(“cart.update”,”updateCart”);
Map.put(“cart.checkout”,”checkout”);
Map.put(“cart.remove”,”removeCart”);
Return map;
}
然后分别实现updateCart、checkout、removeCart方法,每种方法的方法签名与execute方法一致。
当CartAction被触发时,它根据传入按钮的值到消息资源文件中找到相应的键,再由getKeyMethodMap方法返回的Map对象映射到相应的方法。
5.AwitchAction类:主要用于在不同的模块之间切换操作,详见Struts多模块开发。
分享到:
相关推荐
DS18B20的独特之处在于它只需要一根线就能完成数据传输、电源供应和地址识别,这使得它在各种嵌入式系统中非常受欢迎,尤其是在空间有限或者需要简化布线的场合。 接下来,我们转向FPGA。FPGA是一种集成电路,它的...
z3jm 全向轮 全向轮程序”是对主题的关键词提炼,强调了使用Action!语言编写全向轮控制程序的要点。 压缩包内的文件名列表包括:“多米诺骨牌、满天星、尖刀前进、贪吃蛇、卫星、双子星、倒车入库、疲劳测试”,...
总体而言,HBase in Action不仅为读者提供了使用HBase所需的技术知识,而且通过实例和最佳实践帮助读者理解如何有效地将HBase应用于实际问题解决中。通过阅读本书,开发者可以获得设计、构建和运行基于HBase的应用...
设计模式是一种在特定情况下解决常见问题的模板,它描述了一个清晰的解决方案,可以在不同的场合下重复使用。以下是几种常见的设计模式及其应用场景: 1. **策略模式**:定义了一系列算法,并将每一个算法封装起来...
在《Java Reflection In Action》一书中,作者深入探讨了这一主题,提供了丰富的示例和源代码来帮助读者理解并熟练运用反射机制。这本书的源代码包含在名为"JRIA_listings"的压缩包中,为学习和实践反射提供了一个...
6. 应用场景:字体设计适用于各种场合,如电影海报、宣传册、网站设计、游戏界面等。Lhfactionmovie可能特别适合电影相关的项目,为作品增添特定的情感或氛围。 7. 设计工具:设计师通常使用专业软件如Adobe ...
在实际开发中,掌握如何利用ActionScript3 SVG Render库,可以极大地提升Flash项目的图形表现力和跨平台适应性,尤其是在需要高质量图形和互动体验的场合。同时,了解SVG的基本语法和结构也有助于更好地利用这个库,...
NDEF是NFC标准的一部分,用于封装各种类型的数据,如文本、URL、智能海报等。开发者可以使用`NdefFormatable`接口来格式化标签,并使用`Ndef`类来读取和写入数据。 2. **卡片模拟模式**:在这一模式下,Android设备...
但在某些场合,比如开发者使用模拟器或者在支持USB鼠标连接的Android设备上,了解如何处理鼠标悬停事件(Mouse Over)会很有帮助。 首先,我们要知道在Android中,鼠标事件通常被转换为触摸事件进行处理。当一个非...
**ognl-2.6.11.jar源码解析** ognl(Object-Graph Navigation Language)是一种强大的表达式语言,广泛应用...同时,这也有助于我们拓展对Java表达式语言的理解,以及在其他需要动态表达式解析的场合中应用这些知识。
在现代电子设计领域中,可编程逻辑器件(PLDs)被广泛应用于各种应用场合。其中,复杂可编程逻辑器件(CPLD)和现场可编程门阵列(FPGA)是两种非常重要的类型。Altera公司(现已被Intel收购)作为该领域的领先企业...
然后,创建一个Intent,设置其ACTION为ACTION_VIEW,Data为视频的Uri,Type为视频的MIME类型(例如"video/mp4")。最后,使用startActivity()方法启动Intent,这样系统会自动选择合适的播放器来处理这个请求。 2. ...
通过分析触摸事件的ACTION_DOWN、ACTION_MOVE和ACTION_UP,我们可以实现滚动效果。同时,需要确保滚动时的边界检查,防止超出设定的范围。 为了实现Dialog中的`WheelView`,我们需要使用`AlertDialog`或`...
2. **调试器升级版JTAG说明**:JTAG(Joint Test Action Group)是一种国际标准的硬件测试接口,EC6调试器通过JTAG接口与C8051F单片机建立连接,实现在线编程(In-Circuit Programming, ICP)和调试。JTAG接口通常由...
ESS HD28D和HD24D是两款先进的数字...总的来说,ESS HD28D和HD24D数字音频处理器及D.A.S的Action系列音箱都是专业音频领域的出色产品,它们提供了高效、可靠且具有灵活性的音频解决方案,满足了不同场合和应用的需求。
因此,在开发时,我们应尽量使用显式广播,或者考虑使用其他通信方式,如Service、ContentProvider或使用WorkManager等。 五、总结 Android中的广播机制是实现组件间通信的重要手段,无论是显式还是隐式广播,都有...
这种功能在很多场合都非常实用,比如在待办事项列表、日程安排或者文件管理器等应用中,用户可以通过拖动来重新排列项目顺序。 首先,实现这个功能的关键是监听用户的触摸事件,并根据这些事件来更新ListView的布局...
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 SSH框架...
在实际使用中,JLink可以通过SWD(Serial Wire Debug)或JTAG(Joint Test Action Group)接口与目标板通信,这两种接口都提供了对MCU的调试能力。SWD通常更节省引脚资源,适合小型开发板。JTAG则提供了更多的引脚,...