English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Struts2データ入力検証の詳細なチュートリアル

一、前書き

1.1入力検証とは何か?なぜ入力検証が必要なのか?

前の記事で、データ型の変換について学びました。表示層のデータ処理の二つの方法について触れました。ユーザーが入力したデータをタイプ変換して、望むデータに変換する必要があることも述べました。では、タイプ変換後のデータが本当に望むデータかどうかをどう確かめるすればいいのでしょうか?少し複雑です。以下のように考えてみてください:成人男性の年齢は18歳、あなたが現在得たい18このデータですが、ユーザーが入力32文字変換が正しくても、データがあなたが望むものではない場合があります。その時、どうすればいいのでしょうか?そのため、入力検証がここで役立ちます。

文字変換と入力検証の関係は、文字変換は入力検証の前提となります。もし文字変換がすべて間違っていれば、入力検証は行う必要がありません。しかし、多くの場合、文字変換と入力検証は同時に完了します。

入力検証には二種類があります:

1クライアント側の検証;

2サーバー側の検証。ここでは主にサーバー側の検証(ValidateXxxメソッドのオーバーライドとxml設定ファイルの検証)について説明します。

1.2ValidateXxxメソッドの検証プロセスをオーバーライドします。

1文字変換器は、文字列のリクエストパラメータを変換し、これらの値をActionの属性値として設定する責任があります。

2、型変換の実行中に例外が発生する可能性があります。例外が発生した場合、例外情報は自動的にActionContextに保存され、conversionErrorインターセプタがそれをfieldErrorに包装します。

3、反射を使用してValidateXxx()メソッドを呼び出します。Xxxはユーザー要求を処理するためのロジックに対応するメソッド名です

4、ActionクラスのValidateメソッドを呼び出します

5、上記の手順でfieldErrorが発生しない場合、Action内のユーザー要求処理メソッドが呼び出されます。fieldErrorが発生した場合、システムはinputロジックビューで指定されたビューに移行します。

二、入力確認

2.1、入力確認には2つの方法があります:

1、ValidateメソッドをオーバーライドまたはカスタムValidateXxxメソッド(中のXxxは自定義名で、まずこのメソッドが実行され、その後Validateメソッドが実行されます)を作成します

2、新しいxmlを作成して確認を行います

2.2、Validateメソッドをオーバーライドします

MVCフレームワークでは、規範的なデータ確認部分を提供します。Struts2ここでは、Validateメソッドを提供しており、Validateメソッドをオーバーライドすることで入力確認を行うことができますが、Validateメソッドをオーバーライドする際には、以下の2点に注意してください:1、Validateメソッドはexecuteメソッドの前に実行されます;2、ValidateメソッドはすべてのActionに対して確認ルールを実行します。特定のActionを区別するために、ValidateXxxメソッドを使用できます。

注意:以下の例は、局所的な型変換と入力確認を同時に使用する例です。

シンプルな登録確認の例:

新しいエンティティクラスUser:

 User

新しいビュー:Register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
<title>ユーザー登録</title>
</head>
<body>
  <h2>validateXXX()メソッドを使用して確認</h2>
  <form action="register_test">
    ユーザー:<input type="text" name="user"><br/>
    パスワード:<input type="password" name="user"><br/>
    パスワード:<input type="password" name="user"><br/>
    <input type="submit" value="提出">
  </form> 
</body>
</html>

RegisterActionクラスをActionSupportが継承するように新規作成します

package com.validatexxx;
import com.opensymphony.xwork2.ActionSupport;
//validate()とvalidateXXX指定メソッドをオーバーライドして確認を行います
/*
 * struts.xmlでmethodメソッドをtest()に設定すると、まずValidateTest()メソッドが呼び出されます。
 * その後validateメソッドが呼び出されます
 * testメソッドが呼び出された後
 * */
public class RegisterAction extends ActionSupport {
  private User user;
  public User getUser() {
    return user;
  }
  public void setUser(User user) {
    this.user = user;
  }
  //2
  @Override 
  public void validate(){   
   System.out.println("Validateメソッドをオーバーライド");
   if (null == user.getPassword() || "".equals(user.getPassword()) || null == user.getRepassword() || "".equals(user.getRepassword())) { 
       this.addFieldError("repassword", "repassword should be same password"); 
      return; 
     } 
   if (!user.getPassword().equals(user.getRepassword())) { 
     //FieldErrorにデータがある場合、サーバーは自動的にinputの論理ビューに遷移します
     this.addFieldError("repassword", "repassword should be same password"); 
     } 
  }
  //1
  public void validateTest(){
    System.out.println("カスタムバリデーションメソッド:ValidateTest");
  }
  //3
  public String test(){
    System.out.println("test:メソッド");
    return SUCCESS;
  }
}

注意:ここでの属性はUserですので、jspページのパラメータ名はuserというインスタンス名を使用する必要があります。さらに、データが入ったクラスを返すタイプ変換器を作成する必要があります。

新しいstruts.xmlを作成し、WEBに保存します-INF/classes/struts.xml

注意:ここでのmethodは、あなたがValudateXxx()メソッドの後に定義したものを使用する必要があります。この場合はtestを使用しています。*の場合、struts2また、strictも設定する必要があります-method-invocation="false"、その理由はバージョンが高すぎるため、セキュリティが向上したため、使用するにはすべて追加する必要があります*

新建Usertypeconverter类继承StrutsTypeConverter(创建一个类型変換器)

package com.validatexxx;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
//型変換のクラス
public class Usertypeconverter extends StrutsTypeConverter {
  @Override
  public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
    System.out.println("Usertypeconverter:型変換!");
    User user = new User();
    user.setUsername(arg1[0]);
    user.setPassword(arg1[1]);
    user.setRepassword(arg1[2]);
    return user;
  }
  @Override
  public String convertToString(Map arg0, Object arg1) {
    User u = (User)arg1;
    return u.getUsername();+"!";
  }
}

注意:この型変換器が作成された後は、RegisterActionを新しいものとして作成する必要があります-conversion.properties、同じ階層に配置されています

このファイルの内容は以下の通りです:

左側はRegisterActionの属性名であり、右側は型変換器の具体的なパスです。

 新しい成功ビュー:success.jsp

 success.jsp

新しいエラービュー:input.jsp

 input.jsp

コードの実行成功の効果は以下の通りです:

Register.jspページ 

成功でジャンプしたページはsuccess.jspです

コンソールテスト結果は以下の通りです:

データはUsertypeconverterにジャンプして型変換を行い、その後RegisterActionにジャンプしてValidateTestメソッド()、Validate、testを実行し、SUCCESSに戻り、resultのビューを実行。

コードの実行失敗の順序を見てみよう:

Register.jspページ

input.jspページ

コンソールテスト効果:

Validateメソッド内で、筆者のコードはthis.addFieldError()であり、前述の通り、エラーを追加すると、サーバーが自動的にエラーのインターフェースにジャンプしてくれる。それはinputを返し、inputはstruts.xmlで設定されているため、input.jspインターフェースに戻る。

2.3、新しいxmlを入力検証に使用

新しいビューページ:Test.jspを新規に作成します

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
<title>XMLでの検証</title>
</head>
<body>
  <s:form action="empinfo" method="post">
   <s:textfield name="name" label="Name" size="20" />
   <s:textfield name="age" label="Age" size="20" />
   <s:submit name="submit" label="Submit" align="center" />
  </s:form> 
</body>
</html>

EmployeeクラスをActionSupportが継承するように新規に作成します

このクラスはValidateメソッドのオーバーライドとXml設定を使用しており、そのうちの1つを選択して検証を行うことができます

package com.validatexxx;
import com.opensymphony.xwork2.ActionSupport;
//使用validate()メソッドを検証します、これはサーバー側の検証です!
public class Employee extends ActionSupport {
  private String name;
  private int age;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  //第2歩として、このメソッドを実行します。
  public String execute(){
    System.out.println("execute:"+this.age);
    return SUCCESS;
  }
/*  サーバーサイドのバリデーションを使用して:validateメソッド();をオーバーライドします。
  //第1歩として、このメソッドを実行します。
  //validateメソッドをオーバーライドする方法には欠点があります:validateメソッドが常に使用されるため、非常に多くのリソースが浪費されます。
  public void validate(){
    System.out.println("validate");
     if (name == null || name.trim().equals(""))
     {
       //データをこのメソッドに追加するとき、サーバーはinputを返し、その後input.jspページにジャンプします。
       addFieldError("name","The name is required");
     } 
     if (age < 28 || age > 65)
     {
       addFieldError("age","Age must be in between 28 および 65");
      }
  }
*/
}

Struts.xmlで設定を行います:

ここでのsuccess.jspとinput.jspは上記のものを使用します。

次に、Employeeを作成する必要があります。-validation.xml、パスはEmployeeと同じ階層のディレクトリに配置してください。注意:-validation.xmlは固定されています。

内容为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
    "-//Apache Struts//XWork Validator 1.0.3//EN" 
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 <validators>
  <field name="name">
   <field-validator type="required">
     <message>
      The name is required.
     </message>
   </field-validator>
  </field>
  <field name="age">
   <field-validator type="int">
     <param name="min">29</param>
     <param name="max">64</param>
     <message>
      Age must be in between 28 および 65
     </message>
   </field-validator>
  </field>
</validators>

重要:このファイルのdtd制限は必須であり、そうでないとエラーが返されます:

ERROR DefaultDispatcherErrorHandler リクエスト処理中に例外が発生しました: [接続タイムアウト: connect - [不明の場所], null]


次に、以下を使用しますhttp://localhost:8080/LearStruts2/ValidateJSP/Test.jspアクセスを行います。

テスト成功:

Test.jsp インターフェース:

success.jsp

テスト失敗例:

input.jsp インターフェース:

例は正しいです。

実際にはStruts2中には複数の内蔵検証器があります:必須検証器、必須文字列検証器、整数検証器、日付検証器、表現検証器、文字長検証器、正規表現検証器など、必要であれば、筆者が順次説明します。

以上は編集者が皆様に紹介するStrutsです。2データ入力検証教程の詳細を説明し、皆様に役立つことを願っています。何かご不明な点がございましたら、コメントを残してください。編集者は皆様の質問に迅速に回答します。また、皆様の呐喊教程サイトへのサポートに感謝します。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を有しない、人間による編集は行われていない、および関連する法的責任を負いません。著作権に抵触する内容がある場合は、メールを送信して:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりあえず、本サイトは侵害された内容をすぐに削除します。)

おすすめ