首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

DispatchAction的运用

2012-12-04 
DispatchAction的使用DispatchAction的使用:* DispatchAction中的execute方法,如果覆盖必须显示调用super.

DispatchAction的使用
DispatchAction的使用:
* DispatchAction中的execute方法,如果覆盖必须显示调用super.execute()
* parameter参数值不能是execute和perform
* <action>标签中的parameter的含义
:parameter="method"
* 了解DispatchAction中的unspecified方法的含义
:在没有指定方法名的时候采用

public class LoginAction extends DispatchAction {    public ActionForward loginValidate(ActionMapping mapping, ActionForm form,                                       HttpServletRequest request,                                       HttpServletResponse response) {        LoginForm loginForm = (LoginForm) form;        ActionForward forward = new ActionForward();        ...        return forward;    }    public ActionForward deleteUser(ActionMapping mapping, ActionForm form,                                    HttpServletRequest request,                                    HttpServletResponse response) {        LoginForm loginForm = (LoginForm) form;        ActionForward forward = new ActionForward();        ...        return forward;    }}


一个验证信息正确性loginValidate,一个删除一个记录deleteUser方法,
用method=方法名来指定要调用的方法。
新建一个jsp页面login.jsp,注意:form表单的action的值:::
<html:form action="/loginAction.do?method=loginValidate" method="POST">      用户名:      <html:text property="au_lname"/>      <br>      <html:submit property="submit" value="Submit"/>      <br>      <html:reset value="Reset"/>    </html:form>
验证信息。

再建一个jsp页面delete.jsp,主要内容如下:::
<html:form action="/loginAction.do?method=deleteUser" method="POST">      用户名:      <html:text property="au_lname"/>      <br>      <html:submit property="submit" value="Submit"/>      <br>      <html:reset value="Reset"/>    </html:form>

根据用户名删除。
在struts-config.xml配置一个parameter="method"属性键值对:
<action-mappings>    <action name="loginForm" parameter="method" path="/loginAction" scope="request" type="com.aptech.dispatchactiondemo.action.LoginAction">      <forward name="error" path="/error.jsp" />      <forward name="success" path="/success.jsp" />      <forward name="deletesuccess" path="/deletesuccess.jsp" />    </action></action-mappings>

第二种
这一种的struts-config.xml与第一种的相同,也要有parameter=""属性。
分析以下第一种方式:Action中有两个方法,对应两个jsp页面、具体为对应两个表单、两个action="/loginAction.do"路径,
而第二种方法是只有一个jsp页面、即一个表单,具体如下:

...<h1>下面表单中的“添加”和“修改”按钮都可以提交表单,但不是JSF</h1><p>    <html:form action="/demoAction.do" method="POST">      <%--提交的路径还是*.do --%>      userName:      <html:text property="userName"/>      <br>      password:      <html:password property="password"/>      <br>      <input type="hidden" name="method" value="add"/>      <%--        添加了一个hidden隐藏文本域,name的值method与        struts-config.xml里面的parameter的值method相同      --%>      <input type="submit" onclick="method.value='add'" value="添加"/>      <input type="submit" onclick="method.value='modify'" value="修改"/>      <%--两个sumbit按钮,在onclick方法上更改method的值--%>    </html:form>...


上面的表单有两个提交按钮,特别的是有一个hidden隐藏域的作用。
再就是验证的问题:
一般流程是如果表单数据未通过ActionForm的验证,则会返回struts-config.xml中该Action对应的input指定的路径。
但在继承的DispatchAction类中,多个Action指向同一个配置文件,举个小例:
现有两个页面(用户注册页面、用户资料修改页面)指向同一Action(继承自DispatchAction)和ActionForm(验证信息基本相同),当ActionForm验证失败时,分别需要返回到注册页面和修改页面,但struts-config.xml中的input只能设置一个值,这时怎么办?

虽然你的XXXDispatchAction的class实例只有一个,例如com.xyh.emp.EmployeeAction, 但是在struts-config.xml的ActionMappings里面可以映射为多个 <action> 标记,例如:

<action path= "/registerEmployee " input= "/registerEmployee.jsp " parameter= "method " name= "employeeForm " attribute= "employeeForm " scope= "request " validate= "true " type= "com.xyh.emp.EmployeeDispatchAction "> <forward name= "detail " path= "/detailEmployeeInfo.jsp " /> </action> <action path= "/editEmployee " input= "/editEmployee.jsp " parameter= "method " name= "employeeForm " attribute= "employeeForm " scope= "request " validate= "true " type= "com.xyh.emp.EmployeeDispatchAction "> <forward name= "detail " path= "/detailEmployeeInfo.jsp " /> </action> 


那么在JSP里面就可以这么分别描述表单标签。
? <html:form action= "registerEmployee.do "/>
? <html:form action= "editEmployee.do "/>

这样你不仅能为不同的行为指定不同的“action”, 自然就可以使用不同的input页, 分别指定validate是true或者false, 甚至可以使用不同的ActionForm。

说白了就是DispatchAction的类实例只有一个, 但是可以通过不同的path映射为不同的“行为”, 这不是Struts的缺点,反而正好是它的优点。
Validator框架对ActionFrom进行验证的时候有两种识别FormBean的方式, 一种是使用BeanName,就是action标签里面的name= "employeeForm ", 另一种是使用path,就是action标签里面的path= "/regEmployee ", 那么在使用了DispatchAction的情况下,如果使用Validator进行验证的话, 你的XXXXForm只需要继承ValidatorActionForm或DynaValidatorActionForm, 然后在validation.xml文件里面form标签里面的name属性使用该映射action的path就可以了。

热点排行