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 属性中给出:
<actionpath="/saveSubscription"type="org.apache.struts.actions.ForwardAction"name="subscriptionForm"scope="request"input="/subscription.jsp"parameter="/path/to/application/resource"/>
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);}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;
<actionpath="/dataRecord"type="app.recordDispatchAction"name="dataForm"scope="request"input="/data.jsp"parameter="method"/>
<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>
/* * 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 stubrequest.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 stubrequest.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;}}<html:submit property="action"><bean:message key="button.checkout"/></html:submit><html:submit property="action"><bean:message key="button.saveorder"/></html:submit>
<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>
<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>
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 stubreturn null;}}