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_Action学习笔记、通配符{1},{2}......
我的笔记:Struts构架中action的跳转大全
struts2学习笔记,拦截器,action,所需jar包,从零开始
Namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action、/xxx/index.action、或者/xxx/yyy/index.action. Namespace最好也用模块来进行命名。 namespace :对应与项目名称后面的"/"(例如...
建立一个Java Web项目,提取最少运行Struts2应用的包集合,目标:实现一个简单的用户登录 包括内容: 一、先实现登录页面 二、实现处理页面的Action 三、配置Web.xml 四、配置Action处理结果和资源资源之间的映射关系 ...
详细讲解struts2中单个action中多个处理逻辑的配置方法, 以及默认Action的配置.
01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...
允许POJO(Plain Old Java Objects,简单javabean对象,没有继承,没有实现,getter,setter方法)对象 作为Action,没有耦合 Action的execute 默认方法不再与Servlet API耦合,更易测试 支持更多视图技术(JSP(转译java...
Struts 1.3 备忘笔记 【资源特点】 1、以项目形式组织,包含所有的源代码 2、内含详细的注释说明 3、知识点较全面 【内容目录】 01 Struts_01HandworkApply : 手工配置Struct应用程序,演示用户提交数据后服务器的...
建立一个Struts2 工程,用Action的属性接收参数,使用Domain Model (实体模型) 接收参数,Struts2_2.1.6版本的中文问题,Struts模块包含,Struts简单数据验证 ,Struts ValueStack(值栈) Debug,Value Stack ...
SSH笔记-Spring整合Struts2,作用是使用 IOC 容器来管理 Struts2 的 Action
当客户端向action发送请求并且最后跳转到另外一个页面的时候,在跳转的同时,struts2框架会帮我们自动把需要传到页面的值放这两个对象当中去,然后我们在页面就可以使用固定的方式把值从这个两个对象里面取出来了。...
struts.action.extension The URL extension to use to determine if the request is meant for a Struts action 用URL扩展名来确定是否这个请求是被用作Struts action,其实也就是设置 action的后缀,例如login....
struts2.2学习笔记总结,action,拦截器,过滤器,国际化,struts.xml解析等的总结。
struts1.2学习笔记了解struts工作流程: 首先struts基于MVC模式, 用户发送的请求讲被ActionServlet处理,转发,但是它是怎样实现的了??
Struts 读书笔记,一小段内容摘抄: ...... Struts的ActionForm 对象是框架用来在用户和业务层之间来回传递数据的。框架会自动收集请求的输入,然后使用from bean 将数据传递给Action,最后再传递给业务层。 对于...
struts2学习笔记!因为还没有全部学完,所以分部分分享!主要内容:struts.xml配置,web.xml配置 Action要点!全局类型转换,部分类型转换,类型转换文件 类型装换错误的处理问题局部使用,把中文汉字转换为编码 struts2对...
当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...
Struts高级部分(2)(常用Action、验证框架、动态Form)笔记Struts高级部分(2)(常用Action、验证框架、动态Form)笔记
struts入门笔记、解决重复提交、常用Action等。。