需要对用户输入的信息在不同的页面进行校验时,常常会使用到Struts MPV(Multi Page Validation)机能。
假设有如下需求
用户在第一个name页面输入firstName和lastName,校验通过后点击next按钮,进入输入address的页面。
在address页面中,如果点击previous按钮,则不会对address页面进行校验,直接返回name页面。点击提交按钮,如果校验通过,则进入成功页面。
实现
要实现上述的需求,可以使用struts MPV机能来实现。
1.定义form-bean
将需要校验的所有属性都定义在此form(MPVTestForm)中,此需求中包括firstName,lastName,address。并且该form需要继承ValidatorForm或其子类
2.jsp页面
新做成两个jsp页面,name.jsp和address.jsp
name.jsp
<html:form action="/name">
<br/>
first name: <html:text name="MPVTestForm" property="firstName" maxlength="10"/><html:errors property="firstName" />
<br/>
last name: <html:text name="MPVTestForm" property="lastName" maxlength="10"/><html:errors property="lastName" />
<br/>
<html:hidden property="page" value="1"/>
<br/>
<html:submit value="Submit"/>
</html:form>
action为“/name”,form为MPVTestForm,输入firtName和lastName。
这里要注意的是:页面中定义了一个隐藏参数page,具体用法后面说明。
当点击submit按钮时,传入的page的值为1
address.jsp页面
<html:form action="/address">
Street address: <html:text name="MPVTestForm" property="streetAddress" maxlength="10"/><html:errors property="streetAddress" />
<br/> <br/>
<input type="hidden" name="previous" value="previous"/>
<input type="hidden" name="page" value="2"/>
<html:errors property="illegalpage"/>
<br/>
<html:submit value="previous" onclick="this.form.page.value='1'"/>
<html:submit value="submit"/>
</html:form>
action为“/address”,form为MPVTestForm,输入address。
当点击previous按钮时,传入的page的值为1
当点击submit按钮时,传入的page的值为2
3.multi page的实现
struts的定义文件
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="MPVTestForm" type="com.sjl.MPVTestForm"/> </form-beans> <action-mappings> <action path="/name" type="com.sjl.MPVTestAction" name="MPVTestForm" scope="session" input="/jsp/name.jsp"> <forward name="name" path="/jsp/name.jsp"/> <forward name="address" path="/jsp/address.jsp"/> </action> <action path="/address" type="com.sjl.MPVTestAction1" name="MPVTestForm" scope="session" input="/jsp/address.jsp"> <forward name="name" path="/jsp/name.jsp"/> <forward name="done" path="/jsp/done.jsp"/> <forward name="address" path="/jsp/address.jsp"/> </action> </action-mappings> <message-resources parameter="MessageResources" /> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/> </plug-in> </struts-config>
4.validation的实现
上面的name.jsp和address.jsp中都定义了一个隐藏的参数page。这个page的作用就是为了实现validation机能,首先看下struts的validation.xml文件的定义。
validation.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"> <form-validation> <formset> <form name="MPVTestForm"> <field property="firstName" depends="required1" page="1"/> <field property="lastName" depends="required2" page="1"/> <field property="streetAddress" depends="required3" page="2"/> </form> </formset> </form-validation>
name.jsp页面中点击submit按钮,传入的page值为1,等于此xml中firstName和lastNamefield的page的值,就会对name页面中的firstName和lastName进行required校验。
MPVTestAction
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
MPVTestForm testActionform = (MPVTestForm) form;
int page = testActionform.getPage();
ActionMessages errors = testActionform.validate(mapping, request);
if (errors != null && errors.isEmpty()) {
if (page == 1) {//页面上没有错,page为1,跳转到address.jsp
return mapping.findForward("address");
}
} else {
this.saveErrors(request, errors);
if (page == 1) {//页面上有错,page为1,停留在name.jsp
return mapping.findForward("name");
}
}
return mapping.findForward("name");
}
address.jsp页面中点击previous按钮,返回name页面,传入的page值为1,不等于此xml中streetAddress field的page的值(2),所以不会对此时的address页面的streetAddress进行required校验。
address.jsp页面中点击submit按钮,传入的page值为2,等于此xml中streetAddress field的page的值(2),就会对streetAddress进行required校验。
MPVTestAction1
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
MPVTestForm testActionform = (MPVTestForm) form;
int page = testActionform.getPage();
ActionMessages errors = testActionform.validate(mapping, request);
if (errors != null && errors.isEmpty()) {
if (page == 1) {//页面上没有错,page为1,跳转到name.jsp
return mapping.findForward("name");
}
if (page == 2) {//页面上没有错,page为2,跳转到done.jsp
return mapping.findForward("done");
}
} else {
if (page == 1) {//页面上有错,page为1,跳转到name.jsp
return mapping.findForward("name");
}
if (page == 2) {//页面上有错,page为2,仍停留在address.jsp
this.saveErrors(request, errors);
return mapping.findForward("address");
}
}
errors.add("illegalpage", new ActionMessage("The page property of this page is illegal!",false));
this.saveErrors(request, errors);
return mapping.findForward("address");
}