﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-rfy520</title><link>http://www.blogjava.net/rfy520/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 10:46:06 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 10:46:06 GMT</pubDate><ttl>60</ttl><item><title>Struts 学习笔记之Action</title><link>http://www.blogjava.net/rfy520/archive/2008/05/02/197792.html</link><dc:creator>飞阳跋色</dc:creator><author>飞阳跋色</author><pubDate>Fri, 02 May 2008 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/rfy520/archive/2008/05/02/197792.html</guid><wfw:comment>http://www.blogjava.net/rfy520/comments/197792.html</wfw:comment><comments>http://www.blogjava.net/rfy520/archive/2008/05/02/197792.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rfy520/comments/commentRss/197792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rfy520/services/trackbacks/197792.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
下面是Struts中的一些常用Action如DispatchAction/LookupDispatchAction/MappingDispatchAction/ForwardAction/IncludeAction的总结 <br />
<br />
<br />
<br />
1 ．DispatchAction extends BaseAction <br />
<br />
一般的Action如<action type="examples.UserAction" path="/createUser">，在这里UserAction只需要继承父类（extends Action类），然后重写父类的execute方法，在execute中实现具体的控制转向。 <br />
<br />
对于同一个formbean上进行的新增、修改、删除等，我们需要分发不同的Action，这里有两种做法。 <br />
<br />
① 一种是通过在execute方法中if判断进行不同的转向： <br />
<br />
㈠ UserAction 类的execute方法中 <br />
<br />
String method = request.getParameter("method"); <br />
<br />
if (method.equals("create")) { <br />
<br />
&#8230;&#8230; <br />
<br />
return mapping.findForward("createUser"); <br />
<br />
} <br />
<br />
if (method.equals("save")) { <br />
<br />
&#8230;&#8230; <br />
<br />
return mapping.findForward("saveUser"); <br />
<br />
} <br />
<br />
<br />
<br />
㈡ struts-config.xml 中： <br />
<br />
<action type="examples.UserAction" path="/createUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request"&gt; <br />
<br />
<forward name="createUser" path="/pages/listUser.jsp"  /><br />
<br />
</action><br />
<br />
<action type="examples.UserAction" path="/saveUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request"&gt; <br />
<br />
<forward name="saveUser" path="/pages/saveUser.jsp"  /><br />
<br />
</action><br />
<br />
<br />
<br />
㈢ 可以在页面中定义一个隐藏变量来指明相应的操作 <br />
<br />
// 这里最好不要使用<html:hidden property="method">
</html:hidden>
<br />
<br />
// 因为这种写法需要在formbean中定义相应的property，我们可以采用普通隐藏域 <br />
<br />
<input type="hidden" name="method" /> <br />
<br />
然后定义一个javascript函数，我们可以在通过点击提交按钮的时候，在函数中修改它的值。 <br />
<br />
<script> <br /><br />    function set(operation) { <br /><br />        with (document.forms[0]) { <br /><br />            method.value = operation; <br /><br />        } <br /><br />    } <br /><br /></script><br />
<br />
点击提交按钮时，通过set方法设置提交的method属性值： <br />
<br />
<html:submit onclick="set('create');">
CREATE
</html:submit>
<br />
<br />
<html:submit onclick="set('save');">
SAVE
</html:submit>
<br />
<br />
<br />
<br />
<br />
<br />
② 第二就是使UserAction继承DispatchAction，不需要重写execute方法: <br />
<br />
public ActionForward create(ActionMapping mapping, <br />
<br />
ActionForm form, <br />
<br />
HttpServletRequest request, <br />
<br />
HttpServletResponse response) <br />
<br />
throws Exception { <br />
<br />
// 進行一些create的逻辑 <br />
<br />
// &#8230;&#8230; <br />
<br />
return mapping.findForward("createUser"); <br />
<br />
} <br />
<br />
public ActionForward save(ActionMapping mapping, <br />
<br />
ActionForm form, <br />
<br />
HttpServletRequest request, <br />
<br />
HttpServletResponse response) <br />
<br />
throws Exception { <br />
<br />
// 進行一些save的逻辑 <br />
<br />
// &#8230;&#8230; <br />
<br />
return mapping.findForward("saveUser"); <br />
<br />
} <br />
<br />
<br />
<br />
㈡ DispatchAction 在配置上和一般Action稍有不同，就是要在Action配置中多一个parametr属性，这个属性可以指定执行DispatchAction中对应的方法。 <br />
<br />
struts-config.xml 中： <br />
<br />
<action type="examples.UserAction" path="/processUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request" <br />
<br />
parameter="method"&gt; <br />
<br />
<forward name="createUser" path="/pages/listUser.jsp"  /><br />
<br />
<forward name="saveUser" path="/pages/saveUser.jsp"  /><br />
<br />
</action><br />
<br />
<br />
<br />
㈢ 我们在这里指定了parameter的值为method，则页面提交时我们必须指定提交时action的method参数来确定去我们想要调用哪个Action方法。 <br />
<br />
<script> <br /><br />    function submitForm(operation) { <br /><br />        with (document.forms[0]) { <br /><br />            action = action + '?method = '+ operation; <br /><br />            submit(); <br /><br />        } <br /><br />    } <br /><br /></script><br />
<br />
点击提交按钮时，通过submitForm方法设置提交时action的method参数： <br />
<br />
<html:form method="get" action="/processUser">
<br />
<br />
<html:button onclick="submitForm('create');">
CREATE
</html:button>
<br />
<br />
<html:button onclick="submitForm('save');">
SAVE
</html:button>
<br />
<br />
</html:form>
<br />
<br />
<br />
<br />
2 ． LookupDispatchAction extends DispatchAction <br />
<br />
LookupDispatchAction 继承DispatchAction, 在上面的 ② ㈢ 中对于同一个页面上的多个submit按钮，不需要那么多复杂的js函数来指定提交时action的method参数，即上面的submitForm(operation)方法可以省去，LookupDispatchAction其用法为： <br />
<br />
① 用MessageResource将按钮的文本和ResKey相关联，例如button.save=保存； ② ㈢ 中用LookupDispatchAction代替就是: <br />
<br />
<html:form method="get" action="/processUser">
<br />
<br />
<html:submit property=" method ">
<br />
<br />
<bean:message key=" button.create "></bean:message><br />
<br />
</html:submit>
<br />
<br />
<html:submit property=" method ">
<br />
<br />
<bean:message key=" button.save "></bean:message><br />
<br />
</html:submit>
<br />
<br />
</html:form>
<br />
<br />
<br />
<br />
② 在Action配置中多一个parametr属性，属性值与submit按钮的property属性值相同，这个属性可以指定执行LookupDispatchAction中对应的方法。 <br />
<br />
struts-config.xml 中： <br />
<br />
<action type="examples.UserAction" path=" /processUser "  <br />
<br />
name="userForm" <br />
<br />
scope="request" <br />
<br />
parameter=" method "&gt; <br />
<br />
<forward name="createUser" path="/pages/listUser.jsp"  /><br />
<br />
<forward name="saveUser" path="/pages/saveUser.jsp"  /><br />
<br />
</action><br />
<br />
<br />
<br />
③ <br />
<br />
使UserAction继承LookupDispatchAction，重写getKeyMethodMap()方法, 将ResKey和MethodName对应起来, 如下： <br />
protected Map getKeyMethodMap() { <br />
<br />
Map map = new HashMap(); <br />
<br />
map.put("button.create", "create"); <br />
<br />
map.put("button.save", "save"); <br />
<br />
return map; <br />
<br />
} <br />
<br />
<br />
<br />
注： DispatchAction 类使用请求参数的值确定调用哪种方法，而LookupDispatchAction类利用请求参数值，反向查询资源绑定，并将它与类中的一种方法匹配，实际上这两种方法有异曲同工之处。 <br />
<br />
<br />
<br />
3 ． MappingDispatchAction extends DispatchAction <br />
<br />
DispatchAction 指定了parameter的值为method，则页面提交时我们必须指定提交时action的method参数来确定去我们想要调用哪个Action方法,而MappingDispatchAction直接通过struts-config.xml将多个action-mapping映射到同一个Action类的不同方法: <br />
<br />
<action type="examples.UserAction" path="/createUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request" <br />
<br />
parameter="create"&gt; <br />
<br />
<forward name="createUser" path="/pages/listUser.jsp"  /><br />
<br />
</action><br />
<br />
<action type="examples.UserAction" path="/saveUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request" <br />
<br />
parameter="save"&gt; <br />
<br />
<forward name="saveUser" path="/pages/saveUser.jsp"  /><br />
<br />
</action><br />
<br />
<br />
<br />
然后UserAction继承MappingDispatchAction即可： <br />
<br />
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception <br />
<br />
public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception <br />
<br />
<br />
<br />
注： 查看MappingDispatchAction的源码： <br />
<br />
protected String getMethodName(ActionMapping mapping, ActionForm form, <br />
<br />
HttpServletRequest request, HttpServletResponse response, <br />
<br />
String parameter) throws Exception { <br />
<br />
// Return the unresolved mapping parameter. <br />
<br />
return parameter; <br />
<br />
} <br />
<br />
可以看到它调用的方法是直接返回struts-config.xml中parameter的值。 <br />
<br />
<br />
<br />
4 ． ForwardAction extends BaseAction <br />
<br />
相当于<jsp:forward>功能，不需要配置formbean和action，可以直接进行跳转，只需要在struts-config.xml中配置： <br />
<br />
<action path="/listUser"  <br />
<br />
type="org.apache.struts.actions.ForwardAction" <br />
<br />
scope="request" <br />
<br />
parameter="/pages/listUser.jsp"&gt; <br />
<br />
</action><br />
<br />
parameter 属性用于指定forward到哪个页面，path、type、parameter三个属性为必须，其他可省略。 <br />
<br />
<br />
<br />
5 ． IncludeAction extends BaseAction <br />
<br />
相当于<jsp:include>功能，需要在struts-config.xml中配置： <br />
<br />
<action type="org.apache.struts.actions.IncludeAction" path="/listUser"  <br />
<br />
name="userForm" <br />
<br />
scope="request" <br />
<br />
parameter="/pages/includepage.jsp"&gt; <br />
<br />
</action><br />
<br />
<br />
</jsp:include></jsp:forward>
<img src ="http://www.blogjava.net/rfy520/aggbug/197792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rfy520/" target="_blank">飞阳跋色</a> 2008-05-02 22:15 <a href="http://www.blogjava.net/rfy520/archive/2008/05/02/197792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>