`

Struts笔记(五)Action对象

 
阅读更多
5. Action对象

Action也是Struts框架中最灵活的类。这个家伙可以用来在你需要的时候创建你所想要的所有功能。
Struts Action的核心职责是:
访问业务层
为表现层准备数据对象
处理在其中出现的错误

但这个列表并没有包含Action可以做的所有事情。当ActionServlet将请求影射给Action时,它也“代表”了这个对象,以便它可以做通常一个servlet能做的事情。例如,一个Action 可以:
对请求创建它自己的响应
在 servlet 范围内访问或者创建其它对象
通过 RequestDispatcher 包含或者转发另一个Servlet

Action 象一个返回一个ActionForward 的小型servlet。

5.1. 线程安全

Actions 是多线程的;每个应用中对一个给定Action 子类仅有一个实例。这意味Action
的编写必须是线程安全的。在你写一个Action 子类的时候,最重要的事情是记住类属性不
能在成员方法间共享值。如果使用了成员方法,那么所有的方法都必须通过方法参数来传递。
这样就是通过stack 来传递值,是线程安全的。

5.2. Action调用

当需要Action 时,ActionServlet 是通过Action 的perform 或execute 方法来调用它的。Perform 或者 execute 方法是Action的唯一进入点。方法接受四个参数。

mapping:用来调用这个Action的ActionMapping

form: mapping 指定的ActionForm,如果有的话

Request: 请求上下文

response: 创建的响应

5.3. Action职责

一个典型的Action 的职责通常是:
校验前提条件或者声明

调用需要的业务逻辑方法

检测其它处理错误

将控制路由到相关视图

5.4. 标准Action

普通Action,桥Action,标准Base Action。

5.4.1. 桥Action

集成Struts和其它servlet。

ForwardAction 发出一个RequestDispatcher 转发
IncludeAction 发出一个RequestDispatcher 包含

5.4.1.1. ForwardAction

如其名,ForwardAction 只是简单地将控制转发到其它资源。这可能是另一个Action,一
个JSP,另一个servlet,或者具有URI 的其它应用资源。

ForwardAction 创建一个请求分派器,并根据ActionMapping 提供的上下文相关的URI
来转发控制。上下文相关的路径在ActionMapping 的parameter 属性中给出:

<action
path="/saveSubscription"
type="org.apache.struts.actions.ForwardAction"
name="subscriptionForm"
scope="request"
input="/subscription.jsp"
parameter="/path/to/application/resource"/>


ActionServlet 将沿着其正常路径实例化一些form bean 并校验它,如果适合就转发请求。ForwardAction 的绝大多数使用是作为Action 的占位符。许多 Struts 开发人员避免从一个页面直接连接到其他地方而是通过Action 或者 ActionForward 来传递控制。这保证了工作流在Struts 配置的控制之下,在这里可以进行集中管理。

5.4.1.2. IncludeAction

类似于ForwardAction,IncludeAction 也可帮助你集成其它应用组件到 Struts 框架中。但它不是转发到parameter 属性指定的路径,而是出一个include 指令。通过包含转发,你可以开始对客户的响应,同时发出一个 include 指令。当其它servlet 完成时,控制要返回。相反,一旦一个响应开始时候,就不能再发出一个转发了,而且控制也
不返回到发出的servlet。

Forward 一旦响应开始就不能再发出控制不返回

Include 在响应时也可以发出控制要返回

IncludeAction可以使用的地方是当一个Action对象开始一个响应并且希望其它一些servlet来完成它的时候。

5.4.2. 标准 base Action

标准的base Action 包括:
BaseAction (Scaffold)
DispatchAction
LookupDispatchAction
MappingDispatchAction

5.4.2.1. BaseAction (Scaffold)

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest Request,
HttpServletResponse Response)
throws Exception {
// 检查前提条件错误;如果发现,则失败
preProcess(mapping,form,Request,Response);
if (isErrors(Requset)) {
return findFailure(mapping,form,Request,Response);
}
//尝试逻辑,如果需要,调用catchException()
try {
executeLogic(mapping,form, Request,Response);
}
catch (Exception e) {
// 保存异常;调用扩展点
setException(Request,e);
catchException(mapping,form, Request,Response);
}
finally {
postProcess(mapping,form, Request,Response);
}
// 如果队列中有消息,则失败
if (isErrors(Request)) {
return findFailure(mapping,form, Request,Response);
}
// 否则,检查消息和succeed (仅对1_0)
if ((isStruts_1_0()) && (isMessages(Request))) {
saveErrors(Request,getMessages(Request,false));
}
return findSuccess(mapping,form, Request,Response);
}


这就是来自于附加Scaffold包的 Struts BaseAction
(org.apache.scaffold.http.BaseAction)的 execute 方法。这个 Action 在
Action工作流内为主要事件提供了一个热点方法。如果需要改变,其子类可以覆写这个热点
方法。

5.4.2.2. DispatchAction

一个action完成多个action的工作,比如新增,修改,删除。通过parameter决定执行哪一个方法。

DispatchAction 子类就可以包含这样的 “分派” 方法。

public ActionForward Create(
ActionMapping mapping,
ActionForm form,
HttpServletRequest Request,
HttpServletResponse Response)
throws IOException,ServletException;

public ActionForward read(
ActionMapping mapping,
ActionForm form,
HttpServletRequest Request,
HttpServletResponse Response)
throws IOException, ServletException;
public ActionForward update(
ActionMapping mapping,
ActionForm form,
HttpServletRequest Request,
HttpServletResponse Response)
throws IOException, ServletException;
public ActionForward delete(
ActionMapping mapping,
ActionForm form,
HttpServletRequest Request,
HttpServletResponse Response)
throws IOException, ServletException;


并且在Struts 配置中可以创建这样的配置条目
<action
path="/dataRecord"
type="app.recordDispatchAction"
name="dataForm"
scope="request"
input="/data.jsp"
parameter="method"/>


JSP中可以这样写

<TABLE CELLSPACING="10">
    <TR>
      <TD><html:radio property="operation" 
                      value="create"/>
          Create Account</TD>
      <TD><html:radio property="operation" 
                      value="update"/>
          Change Password</TD>
      <TD><html:radio property="operation" 
                      value="delete"/>
          Delete Account</TD>
    </TR>
  </TABLE>


5.4.2.3. LookupDispatchAction

选择分派方法的一个方便的方式是将它们连接到按钮。

LookupDispatchAction的子类可以这样写

/*
 * Generated by MyEclipse Struts
 * Template path: templates/java/JavaClass.vtl
 */
package com.linkage.struts.action;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.LookupDispatchAction;

public class CheckoutAction extends LookupDispatchAction {
		public ActionForward checkout(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		DynaActionForm checkoutForm = (DynaActionForm) form;// TODO Auto-generated method stub
		request.setAttribute("name", (String)checkoutForm.get("name"));
		return mapping.findForward("check");
	}
	
	public ActionForward saveorder(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		DynaActionForm checkoutForm = (DynaActionForm) form;// TODO Auto-generated method stub
		request.setAttribute("name", (String)checkoutForm.get("name"));
		return mapping.findForward("save");
	}

	protected Map getKeyMethodMap() {
		Map map=new HashMap();
		map.put("button.checkout","checkout");
		map.put("button.saveorder","saveorder");
		
		return map;
	}
	
	
}


在 JSP中, 按钮就应该这样来创建
<html:submit property="action">
				<bean:message key="button.checkout"/>
			</html:submit>
					<html:submit property="action">
				<bean:message key="button.saveorder"/>
			</html:submit>



5.4.2.4.MappingDispatchAction


通过提交路径进行转发。注意form的action路径
<body>
		<h1>使用MappingDispatchAction多表单示例:</h1>
		<html:form action="/a">
			口令 : <html:text property="password" value=""/><html:errors property="password"/><br/>
			姓名 : <html:text property="name" value="梁锦"/><html:errors property="name"/><br/>
			<html:submit value="提交"/><html:cancel value="取消"/>
		</html:form><br>
		
		<html:form action="/b">
			口令 : <html:text property="password"/><html:errors property="password"/><br/>
			姓名 : <html:text property="name" value="JinLiang"/><html:errors property="name"/><br/>
			<html:submit value="提交"/><html:cancel value="取消"/>
		</html:form><br>
		
		<html:form action="/c">
			口令 : <html:text property="password"/><html:errors property="password"/><br/>
			姓名 : <html:text property="name" value="锦梁"/><html:errors property="name"/><br/>
			<html:submit value="提交"/><html:cancel value="取消"/>
		</html:form><br>
	</body>



struts-config.xml配置

<action-mappings>
		<action attribute="abc" input="/jsp/register.jsp" name="abc"
			parameter="a" path="/a" scope="request" type="MapAction" />
		<action attribute="abc" input="/jsp/register.jsp" name="abc"
			parameter="b" path="/b" scope="request" type="MapAction" />
		<action attribute="abc" input="/jsp/register.jsp" name="abc"
			parameter="c" path="/c" scope="request" type="MapAction" />
		<action attribute="aaaForm" input="/form/aaa.jsp" name="aaaForm"
			path="/aaa" scope="request" type="com.yourcompany.struts.action.AaaAction" />

	</action-mappings>


MappingDispatchAction的子类结构没啥变化。
package com.yourcompany.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.MappingDispatchAction;

public class AaaAction extends MappingDispatchAction {
		public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		DynaActionForm aaaForm = (DynaActionForm) form;// TODO Auto-generated method stub
		return null;
	}
}
分享到:
评论

相关推荐

    struts2 学习重点笔记

    - **自动填充**:Struts2 自动从 request 中获取数据并填充到 Action 对象中。 - **原理**:通过拦截器实现,拦截器会查找与 Action 类中的 setter 方法相匹配的请求参数,并调用这些方法填充数据。 **3.3 数据传递...

    struts2综合笔记

    #### 五、深入理解 Struts2 - **灵活度**: - Struts2 的知识点虽然分散,但其灵活性和扩展性非常强。 - **开发实践**: - 了解 Struts2 如何与 Spring、Hibernate 等其他框架集成。 - 学习如何使用 Struts2 提供...

    张龙圣思园struts2学习笔记word

    笔记中可能详细讲解了Struts2的配置文件,如struts.xml,它是整个应用的配置中心,定义了Action的映射、结果类型、拦截器栈等。在Action配置中,我们可以指定Action类、方法以及对应的URL路径,实现请求与业务的关联...

    struts笔记

    与Struts1不同,Struts2每次请求都会创建一个新的Action对象。这提供了更好的线程安全性,并允许每个请求独立操作。Action是业务逻辑的入口点,其方法(通常称为execute)返回一个结果码,该结果码指示Struts2应...

    struts2学习笔记(完美总结)——转自OPEN经验库

    OGNL是Struts2中用于对象属性访问和表达式语言,它允许在Action、ValueStack和视图层之间传递数据。ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request...

    达内,tarena,struts笔记,strutsPPT课件,达内struts笔记

    在本套“达内,tarena,struts笔记,strutsPPT课件,达内struts笔记”资源中,我们重点关注的是Struts 1.x版本,这是一个较旧但仍然广泛使用的版本,尤其对于初学者来说,它是理解MVC设计模式和Web开发基础的良好...

    跃达创新struts 笔记

    Struts是Apache软件基金会 Jakarta项目下的一个...总结,跃达创新的Struts笔记全面涵盖了Struts框架的核心要素和实际开发中的应用技巧。通过深入学习和实践,开发者可以熟练掌握使用Struts构建高效、可维护的Web应用。

    struts2学习笔记总结

    在Struts2中,Model通常由业务对象(BO)或数据访问对象(DAO)组成,View负责展示数据,Controller(Action)处理用户请求并调用Model更新数据,再将结果传递给View。 三、配置与拦截器 1. 配置:Struts2的配置...

    struts笔记 hibernate笔记

    2. **Action类**:它是处理用户请求的核心,通常继承自Struts提供的抽象Action类或实现Action接口,负责接收请求、处理业务逻辑并返回结果。 3. **配置文件**:struts-config.xml是Struts的核心配置文件,用于定义...

    struts2课程笔记

    本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...

    STRUTS经典笔记

    在实际开发中,还会涉及到Action类的编写、JSP页面的设计、结果类型(Result Types)的设置以及各种拦截器的运用,这些都是Struts 2.0笔记中的重要内容。 总结来说,Struts 2.0是为了解决Struts 1.x的问题而诞生的...

    黑马程序员Struts2笔记

    本笔记主要涵盖了Struts2的基础知识,包括但不限于配置、Action、拦截器、结果类型以及异常处理等内容。 1. **Struts2框架简介** Struts2是Apache软件基金会的一个开源项目,它是Struts1的升级版,弥补了Struts1在...

    林信良struts笔记

    林信良的Struts笔记无疑为我们提供了一种深入理解Struts框架的途径,尤其对于初学者来说,是一份非常有价值的参考资料。 在Struts框架中,主要包含了以下几个核心组件: 1. **Action类**:Action是业务逻辑处理的...

    Struts2学习笔记

    根据给定的文件信息,以下是对Struts2学习笔记中涉及的关键知识点的详细解析: ### Struts2框架概览 #### MVC模式的理解与演进 Struts2是基于MVC(Model-View-Controller)模式设计的一种Java Web开发框架。在MVC...

    Struts2_Action学习笔记、通配符{1},{2}

    ### Struts2_Action 学习笔记与通配符配置详解 #### 一、Struts2简介及简单配置 Struts2是一个基于Java EE平台的开源Web应用框架,它继承了Struts1的优点,并在此基础上进行了大量的改进。Struts2的核心功能之一是...

    struts2学习笔记

    2. **模型驱动**:使用一个公共对象作为模型,Action类持有这个模型的引用,Struts2将请求参数填充到模型对象中,这种方式更便于数据管理和共享。 此外,Struts2还支持动态方法调用、国际化、主题和模板、AJAX集成...

    struts2 学习笔记 实战

    另外,域模型(Domain Model)的概念使得Action和表单数据的交互更加直观,将业务对象的实例作为Action的属性,可以方便地实现数据的封装和验证。 总的来说,Struts2的Namespace、标签和Action机制为Web应用提供了...

Global site tag (gtag.js) - Google Analytics