English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、前書き
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(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がとりあえず、本サイトは侵害された内容をすぐに削除します。)