Struts 2検証学習ノート(一)


最近Struts 2の入力チェックを勉強して、自分でまとめて、後で自分の学習チェックを振り返って、復習の準備をしているかもしれません.
入力チェックに対して、Struts 2は2つの方式を提供し、1:手書きコードで実現する;2:XML構成に基づく実装.
1:手書きコードで実現.
ActionSupportクラスを継承し、vlidateメソッドを書き換えてデータ検証を行います.あるデータ検証に失敗した場合、addFieldError()またはaddActionError()を呼び出してシステムのFieldErrorに情報を追加する必要があります.検証に失敗した場合、Struts 2はinputというresultという結果ページに自動的に転送されます.失敗情報はinputビューでというラベルで取得できます.これにより、検証が完了します.
 
index.jsp:ユーザー入力のインタフェースを提供する
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

      <script type="text/javascript">
       
             function validate(){
             		  return true;
             }
      
      </script>

 </head>

	<body>
	  <!--validate="true"     struts2          -->
		<s:form method="post" action="validation" onsubmit="return validate();">
			<s:textfield name="username" label="  " />
			<s:password name="password" label="  " />
			<s:password name="repassword" label="    " />
			<s:textfield name="age" label="  " />
			<s:textfield name="birth" label="    " />
			<s:textfield name="graduation" label="    " />
			<s:textfield name="phone" label="    " />
			<s:textfield name="email" label="    " />
			
        <s:submit></s:submit>
      </s:form>
	</body>
</html>

 
  success.jsp------------------------検査に成功した後、このページに移動してユーザーの情報を出力します.
 
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>My JSP 'register.jsp' starting page</title>

		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

	</head>

	<body>
		<form action="" method="post">
			<table algin="center" width="60%" boder="1">
				<tr>
					<td>
						  :
					</td>
					<td>
						${username }
					</td>
				</tr>

				<tr>
					<td>
						  :
					</td>
					<td>
						${password }
					</td>
				</tr>

				<tr>
					<td>
						    :
					</td>
					<td>
						${repassword }
					</td>
				</tr>


				<tr>
					<td>
						  :
					</td>
					<td>
						${age }
					</td>
				</tr>


				<tr>
					<td>
						    :
					</td>
					<td>
						${birth }
					</td>
				</tr>


				<tr>
					<td>
						    :
					</td>
					<td>
						${graduation}
					</td>
				</tr>

				<tr>
					<td>
						    :
					</td>
					<td>
						${phone}
					</td>
				</tr>

				<tr>
					<td>
						    :
					</td>
					<td>
						${email}
					</td>
				</tr>

				<tr>
					<td>
						    :
					</td>
					<td>
						${url}
					</td>
				</tr>


			</table>

		</form>
	</body>
</html>

 
 
ユーザーが入力したフィールドタイプが正しくないことを防止するために、例えば、年齢ユーザーがabcを入力したので、struts 2タイプの変換に失敗したときにユーザーにヒントを与えるファイルを構成します(struts 2タイプの変換は私が書いた学習ノートを見てください)
 Validation.properties
 
invalid.fieldvalue.age = \u5E74\u9F84\u7C7B\u578B\u8F6C\u6362\u5931\u8D25
invalid.fieldvalue.birth = \u51FA\u751F\u65E5\u671F\u8F6C\u6362\u683C\u5F0F\u5931\u8D25
invalid.fieldvalue.graduation = \u6BD5\u4E1A\u65E5\u671F\u683C\u5F0F\u8F6C\u6362\u5931\u8D25

 
struts.xml
 
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.custom.i18n.resources" value="Validation"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="validation"
			class="cn.validation.test.Validation">
			<result name="success">/success.jsp</result>
			<result name="input">/index.jsp</result>
		</action>
	</package>
</struts>

 
 
  Validation.java
   
package cn.validation.test;

import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;

public class Validation extends ActionSupport {

	//   
	private int age;
	//   
	private Date birth;
	//   
	private String email;
	//     
	private Date graduation;
	//   
	private String password;
	//     
	private String phone;
	//     
	private String repassword;
	//    
	private String username;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getGraduation() {
		return graduation;
	}

	public void setGraduation(Date graduation) {
		this.graduation = graduation;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getRepassword() {
		return repassword;
	}

	public void setRepassword(String repassword) {
		this.repassword = repassword;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("execute");
		return "success";
	}

	@Override
	public void validate() {
		System.out.println(" validate ");
		if (null == username || username.length() < 6 || username.length() > 10) {

			this.addFieldError("username", "     6 10  ");
		}

		if (null == password || password.length() < 6 || password.length() > 10) {

			this.addFieldError("password", "    6 10  ");
		}

		else if (null == repassword || repassword.length() < 6
				|| repassword.length() > 10) {

			this.addFieldError("repassword", "      6 10  ");
		}

		else if (!password.equals(repassword)) {
			this.addFieldError("password", "          ");
		}

		if (age < 1 || age > 150) {

			this.addFieldError("age", "    1 150  ");
		}

		if (null == birth) {
			this.addFieldError("birth", "        ");
		}

		if (null == graduation) {
			this.addFieldError("graduation", "        ");
		}

		if (null != graduation && null != birth) {
			//               
			Calendar end = Calendar.getInstance();
			end.setTime(graduation);
			Calendar start = Calendar.getInstance();
			start.setTime(birth);
			if (!start.before(end)) {
				this.addFieldError("birth", "            ");
			}

		}

		if (null == phone) {
			this.addFieldError("phone", "        ");
		}
		// 14.....  3G          
		if (!Pattern.compile("^1[3,4,5,8]\\d{9}$").matcher(phone).matches()) {
			this.addFieldError("phone", "         ");
		}

		if (null == email) {
			this.addFieldError("email", "        ");
		}

		if (!Pattern
				.compile(
						"^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$")
				.matcher(email).matches()) {
			this.addFieldError("email", "         ");
		}

	}

}

 
以上は手動符号化の形式でデータ検証を行ったが,これにも欠点があり,我々は特有の方法を検証する必要がなく,他の方法を検証する必要がない場合がある.
また検証しなければなりません.どうすればいいですか.struts 2は私たちに良い解決策を提供してくれました.
メソッドを手動で書くこのメソッドの署名はvalidate()メソッドと同様です.たとえばabc()メソッドを検証する必要があります.----validateAbc()です.(注意:validate()メソッドは書かないが、execute()メソッドを検証する場合はvalidateExecut()と書きます.)
2:XMLで実現.
xml構成の実装では、xmlプロファイルをactionと同じパッケージに配置し、ルールActionName-validationを命名する必要があります.xml(これはAction全体を検証する)Actionの方法を検証する--』AcitonName-MthodName-validation.xml
 Validation-validation.xml
<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
	<!-- name="View name"  -->

	<field name="username">
		<!-- type              short-circuit="true"                  -->
		<field-validator type="requiredstring" short-circuit="true">
			<message key="       " />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>      ${minLength}  ${maxLength}   </message>
		</field-validator>
	</field>

	<!--       
		<validator type="requiredstring" short-circuit="true">
		<param name="fieldName">username</param>
		<message key="       "></message>
		</validator>
		<validator type="stringlength">
		<param name="fieldName">username</param>
		<param name="maxLength">10</param>
		<param name="minLength">6</param>
		<message>      ${minLength}  ${maxLength}   </message>
		</validator>
	-->

	<field name="password">

		<field-validator type="requiredstring" short-circuit="true">
			<message key="      " />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>     ${minLength}  ${maxLength}   </message>
		</field-validator>
	</field>

	<field name="repassword">
		<field-validator type="requiredstring" short-circuit="true">
			<message key="        " />
		</field-validator>
		<field-validator type="stringlength">
			<param name="maxLength">10</param>
			<param name="minLength">6</param>
			<message>       ${minLength}  ${maxLength}   </message>
		</field-validator>
		<field-validator type="fieldexpression">
			<param name="expression">repassword.equals(password)</param>
			<message>          </message>
		</field-validator>
	</field>

	<field name="age">

		<field-validator type="int" short-circuit="true">
			<param name="max">150</param>
			<param name="min">1</param>
			<message>      ${min}  ${max}  </message>
		</field-validator>
	</field>

	<field name="birth">
		<field-validator type="date" short-circuit="true">
			<param name="max">2010-12-31</param>
			<param name="min">1989-12-31</param>
			<message>      ${min}  ${max}  </message>
		</field-validator>
		<field-validator type="required">
			<message key="      " />
		</field-validator>
	</field>

	<field name="graduation">
		<field-validator type="date" short-circuit="true">
			<param name="max">2010-12-31</param>
			<param name="min">1989-12-31</param>
			<message>      ${min}  ${max}  </message>
		</field-validator>
		<field-validator type="required">
			<message key="      " />
		</field-validator>
		<field-validator type="fieldexpression">
			<param name="expression"><![CDATA[(birth < graduation)]]></param>
			<message>            </message>
		</field-validator>
	</field>

	<field name="email">
		<field-validator type="stringlength" short-circuit="true">
			<message key="        " />
		</field-validator>
		<field-validator type="email">
			<message>         </message>
		</field-validator>
	</field>

	<field name="url">
		<field-validator type="stringlength" short-circuit="true">
			<message key="      " />
		</field-validator>
		<field-validator type="url">
			<message>       </message>
		</field-validator>
	</field>

	<field name="phone">
		<field-validator type="stringlength" short-circuit="true">
			<message key="    " />
		</field-validator>
		<field-validator type="regex">
			<param name="expression"><![CDATA[^1[3458]\d{9}$]]></param>
			<message>         </message>
		</field-validator>

	</field>

</validators>