`

Struts MPV(Multi Page Validation)的使用方法

阅读更多

需要对用户输入的信息在不同的页面进行校验时,常常会使用到Struts MPVMulti Page Validation)机能。

 

假设有如下需求

用户在第一个name页面输入firstNamelastName,校验通过后点击next按钮,进入输入address的页面。

address页面中,如果点击previous按钮,则不会对address页面进行校验,直接返回name页面。点击提交按钮,如果校验通过,则进入成功页面。

 

实现

要实现上述的需求,可以使用struts MPV机能来实现。

 

1.定义form-bean

将需要校验的所有属性都定义在此formMPVTestForm)中,此需求中包括firstName,lastName,address。并且该form需要继承ValidatorForm或其子类

 

2.jsp页面

新做成两个jsp页面,name.jspaddress.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,formMPVTestForm,输入firtNamelastName

这里要注意的是:页面中定义了一个隐藏参数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,formMPVTestForm,输入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.jspaddress.jsp中都定义了一个隐藏的参数page。这个page的作用就是为了实现validation机能,首先看下strutsvalidation.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,等于此xmlfirstNamelastNamefieldpage的值,就会对name页面中的firstNamelastName进行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,不等于此xmlstreetAddress  fieldpage的值(2),所以不会对此时的address页面的streetAddress进行required校验。

 

address.jsp页面中点击submit按钮,传入的page值为2,等于此xmlstreetAddress  fieldpage的值(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");

	}
 

 

 

 

1
1
分享到:
评论
1 楼 syw2452 2015-02-02  
LZ这篇文章解开了我多年的心结

相关推荐

Global site tag (gtag.js) - Google Analytics