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=方法名來指定要調(diào)用的方法。
新建一個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,主要內(nèi)容如下:::
<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>
根據(jù)用戶名刪除。
在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中有兩個方法,對應(yīng)兩個jsp頁面、具體為對應(yīng)兩個表單、兩個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隱藏域的作用。
再就是驗證的問題:
一般流程是如果表單數(shù)據(jù)未通過ActionForm的驗證,則會返回struts-config.xml中該Action對應(yīng)的input指定的路徑。
但在繼承的DispatchAction類中,多個Action指向同一個配置文件,舉個小例:
現(xiàn)有兩個頁面(用戶注冊頁面、用戶資料修改頁面)指向同一Action(繼承自DispatchAction)和ActionForm(驗證信息基本相同),當(dāng)ActionForm驗證失敗時,分別需要返回到注冊頁面和修改頁面,但struts-config.xml中的input只能設(shè)置一個值,這時怎么辦?
雖然你的XXXDispatchAction的class實例只有一個,例如com.xyh.emp.EmployeeAction, 但是在struts-config.xml的ActionMappings里面可以映射為多個 <action> 標(biāo)記,例如:
<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里面就可以這么分別描述表單標(biāo)簽。
· <html:form action= "registerEmployee.do "/>
· <html:form action= "editEmployee.do "/>
這樣你不僅能為不同的行為指定不同的“action”, 自然就可以使用不同的input頁, 分別指定validate是true或者false, 甚至可以使用不同的ActionForm。
說白了就是DispatchAction的類實例只有一個, 但是可以通過不同的path映射為不同的“行為”, 這不是Struts的缺點,反而正好是它的優(yōu)點。
Validator框架對ActionFrom進行驗證的時候有兩種識別FormBean的方式, 一種是使用BeanName,就是action標(biāo)簽里面的name= "employeeForm ", 另一種是使用path,就是action標(biāo)簽里面的path= "/regEmployee ", 那么在使用了DispatchAction的情況下,如果使用Validator進行驗證的話, 你的XXXXForm只需要繼承ValidatorActionForm或DynaValidatorActionForm, 然后在validation.xml文件里面form標(biāo)簽里面的name屬性使用該映射action的path就可以了。