ActionSupportクラスを継承することにより、アクション開発が完了します。 ActionSupportクラスは、アクションインターフェイスを単に実装するだけでなく、検証とローカリゼーションのサポートも追加します。実際の開発におけるカスタムアクションこのクラスを継承する必要があります。フォーム検証関数をユーザーログインに追加します
ActionSupportクラスの役割:
Struts2は、Struts Base ClassまたはStrutsインターフェイスを継承するように設計されたアクションクラスを必要としませんが、独自のアクションの実装を促進するために、ほとんどの場合、com.opensymphony.xwork2.actionsupportクラスを継承し、このクラスのパブリックストリングエグゼット()スローをオーバーライドします。このクラスには多くの実際的な言い訳があるため、国際情報方法、ユーザー要求の処理のデフォルトの方法など、アシオンの開発を大幅に簡素化できる多くのデフォルトの方法が提供されています。 Struts2では、通常、アクションはHTTP要求パラメーターをカプセル化するために直接使用されます。したがって、アクションクラスには、要求パラメーターに対応する属性も含め、属性に対応するゲッターおよびセッターメソッドを提供する必要があります。
では、アクションインターフェイスとActionSupportクラスの違いは何ですか?
アクションインターフェイスには次のようなものがあります。
public static final string success = "success"; public static final string none = "none"; public static final string error = "error"; public static final string login = "login"; public string execute()throws execute;
5つの静的定数とexecute()があることがわかります。
アクションインターフェイスの実装に基づいて、ActionSupportツールクラスはValidate()メソッドも定義します。メソッドがオーバーライドされている場合、execute()メソッドの前に実行されます。検証が失敗した場合、入力に転送されます。アクションを構成するときに入力属性を構成する必要があります。
さらに、ActionSupportはGetText(String Key)メソッドも提供し、リソースファイルから国際化情報を取得する国際化を実現します。
このようにして、タグをカスタマイズするときに、変数を新しいActionSupportオブジェクトとして定義して、国際化を達成できます。
ActionSupportクラスには(ソースコード)があります。
パブリッククラスActionSupportアクション、有効化可能、VALIDATIONAWARE、TEXTPROVIDER、LOCALEPROVIDER、SERIALIZABLE {Protected Static Logger log = LoggerFactory.getLogger(ActionSupport.Class);プライベート最終検証AWARESUPPORT VALIDATIONAWARE =新しいValidationAwareSupport( setactionerrors(collection <string> errormessages){validationaware.setactionerrors(errormessages);} public collection <string> getActionErrors(){return validationaware.getActionErrors();} public void setactionMessages(collection <string>メッセージ){validationaware.setactionmessages(メッセージ);}パブリックコレクション< validationaware.getActionMessages();}@DepRecatedPublic Collection <String> getErrormessages(){return getActionErrors();}@DepRecatedPublic Map <String、list <String >> getErrors(){return getFielderrors();} public void setfielderors(Map <String> {validationaware.setFielderRors(errorMap);} public Map <string、list <string >> getFielderRors(){return validationaware.getFielderRors();} public locale getLocale(){actionContext ctx = actionContext.getContext(); {if(log.isdebugenabled()){log.debug( "action context not initionized");} public boolean haskey(string key){return gettextprovider()。 getText(string atextName、string defaultValue){return getTextProvider()。getText(atextName、defaultValue);} public string getText(string atextName、string defaultValue、string obj){return getTextProvider()。 {return getTextProvider()。getText(atextName、args);} public string getText(string key、string [] args){return getTextProvider()。 args);} public string getText(string key、string defaultValue、string [] args){return getTextProvider()。getText(key、defaultValue、args);} public string getText(string key、string defaultValue、list <? getText(string key、string keyand defaultValue、string [] args、valuestack stack){return getTextProvider()。getText(key、defaultValue、args、stack);} public string getFormatted(string key、string expr){map <string、object> object> conversionerrors = actioncontext.getContext()。 (ConversionErrors.ContainsKey(expr)){string [] vals =(string [])conversionerrors.get(expr); return vals [0];} else {final valuestack valuestack = actioncontext.getContext()。 arrays.aslist(val));}} public resourcebundle getTexts(){return getTextProvider()。getTexts();} public resourcebundle getTexts(string anubundlename){return getTextProvider()。 {validationaware.addactionerror(anerrormessage);} public void addactionmessage(string amessage){validationaware.addactionmessage(amessage);} public addfielderror(string fieldname、string errormessage){balidationaware.adddfielderor(returtname(out upprectname);} input;} public string dodefault()throws exception {return success;} public string execute()throws {return success;} public boolean hasactionerrors(){return validationaware.hasactionerrors();} public boolean hasactionmessages(){return validationaware.hasactionmesages(); validationaware.haserrors();} public boolean hasfielderrors(){return validationaware.hasfielderrors();} public void clearfielderrors(){validationaware.clearfielderrors();} public void clearactionerrors(){validationaware.clearactionerors();} {validationaware.clearmessages();} public void clearerrors(){validationaware.clearerrors();} public void clearerrorsandmessages(){validationaware.clearerrorsandmessages();} public void validate(){} @overrideadexedexecoptedex clone( super.clone();} public void pause(string result){} private textProvider getTextProvider(){if(textProvider == null){textProviderFactory TPF = new TextProviderFactory(); if(container!= null){containter.inject(tpf);} provider = tpf.createinstance(getClass()、this);} return textProvider;}@indectpublic void setContainer(container container){this.container = container;}その中には多くの方法があることがわかりますが、非常によく知っている方法、検証()、およびデータ検証があることが明らかにあります。この方法を通して、ログインするときにユーザー名とパスワードが空か、またはその他の場合にプロンプトが表示されます...
ここで簡単な例を挙げてください:ユーザー名とパスワードが空の場合は、顧客に友好的なプロンプトを与えます。
以下は、Struts 2のデータ検証機能を説明する2つの方法です。
1。コーディング方法検証
1)ActionSupportからアクションを継承する必要があります
2)要求処理メソッドをチェックするためのpublic void validatexxx()メソッドを記述し、メソッド内でフォームデータ検証を実行します。
3)すべての要求処理方法について、public void validate()メソッドを記述することもできます。
4)検証方法では、AddFielDerror()メソッドを介してフィールド検証エラーメッセージを追加できます。
5)検証が失敗した場合、Strutsフレームワークは、名前入力で結果ページに自動的にジャンプします。検証障害ページで、<s:fielderror/>を使用してエラーメッセージを表示できます
6)シンプルで柔軟です。しかし、それはあまり再利用できません
検証メソッドを書き直します
1.私たちが書いたアクションは、一般に継承およびアクションサポートを継承し、アクションサポートするアクションインターフェイスを実装するだけでなく、有効なインターフェイスを実装し、データ検証機能を提供します。検証可能なインターフェイスで検証メソッドを定義し、メソッドをオーバーライドします。検証フォーム入力フィールドでエラーが発生した場合、ActionSupportクラスのFielderrorフィールドにエラーを追加し、OGNL式を介して出力します。
以下は、ユーザーログイン検証インターフェイスです。
<Body> <% - 出力検証情報 - %> <% - 単一のプロンプトが必要な場合<s:fielderror fieldname = "uname"/> - %> <% - <s:プロパティ値= "/> - %> <div style =" color:red "> <s:s:fielderror/>> </div> <s:form =" form1 "/"/"pos Action = "LoginValidateAction"> <s:div> username:<s:textfield name = "user.uname"> </s:textfield> </s:div> <s:div> div> div> div> div> div> <s:suls.upwd ">/s:password> </s:div> <s:submun"> </s:< - %> <s:debug> </s:debug> </body>
ユーザーがデータを入力したら、それをloginvalidateactionに送信します。
パブリッククラスのloginvalidateActionはアクションサプポート実装アクション{public user user; public user map <string、object> map; //すべてのアクション@override public void validate(){if(user.getuname()。length()== 0){addfielderror( "uname"、 "user name nage nage ve veaty!" if(user.getupwd()。length()== 0){addfielderror( "upwd"、 "パスワードは空にすることはできません!") {system.out.println(user.getuname()); if(user.getuname()。equals( "admin")&& user.getupwd()。 ErrorReturn入力; //これは入力する必要があります}}/*** @return the user*/public user getuser(){return user;}/*** @paramユーザーを設定するユーザー*/public void setuser(user user){this.user = user;}上記のLoginValidateActionクラスは、Excuteメソッドを実行する前に実行される検証メソッドをオーバーライドします。メソッドを実行した後、アクションクラスのFileDerrorにデータ検証エラーが含まれている場合、リクエストは入力論理ビューに転送されます。
struts.xmlは次のように構成されています。
<! - データ検証 - > <アクションname = "loginvalidateAction"> <! - 結果が「成功」になったら、success.jsp pageにジャンプします。jsp page-> <result name = "success"> success.jsp </result> <! - 結果が「エラー」、JSPページにジャンプするか、login.jspにジャンプします。 name = "login"> fail.jsp </result> <result name = "error"> fail.jsp </result> </action>
クライアントへの影響:
しかし、エラーがプロンプトされたとき、それが私たちが望む効果ではないことに気づきましたか。
これは私たちが望むものではないので、どうすればそれを変えることができますか?実際、これは主にStruts2のテーマスタイルを示しています。
もう一度見てみましょう:
スタイルを自動的に追加します。 Struts2は、Ajax、Simple、XHTMLの3つのテーマを提供します。デフォルトでXHTMLテーマになります。もちろん、カスタムテーマと呼ばれる独自のテーマを書くことができます。上記の問題は、それらを設定することで解決できます
それを解決するには2つの方法があります。
1。シンプルな方法(すべてのstruts2タグについても実用的です)、struts.xmlの次のコード行を追加します。
<constant name = "struts.ui.theme" value = "simple" />
これは、すべてのページが単純なテーマを使用することを意味します。現時点では、テーブルTDなどの不要なコードを出力しないページは、他の編集ページのようにページのスタイルを編集できます。
エラープロンプト形式を見てみましょう
このようなタグを設定できます。
<s:プロパティ値= "errors.uname [0]"/>
このタグをコメントしてください:
<div style = "color:red"> <s:fielderror/> </div>
しかし、このように設定すると、この効果が発生します。
この効果は、通常エラーを入力するとプロンプトに少し似ており、他の属性値があるため、1つずつリストする必要はありません。
struts2を使用した検証フレームワーク
XML構成検証。
エンコードする前に実行します。
1)アクションクラスを検証するには、同じパッケージの下に、アクションクラスname-validation.xmlという名前の確認ルールファイルを書き込みます。
2)検証ルールを検証ルールファイルに追加する:特定の検証デバイス名については、struts2の参照またはstruts2のAPIを参照してください。
a)フィールド検証:アクションクラスの各非カスタムタイプフィールドを検証するためのルール。
<field name = "field name to bififient"> <field-validator type = "Ruler name" short path visification(default is false) "> <param name ="パラメーター名= "パラメーター名"> value </param> <メッセージ>検証が失敗した場合のプロンプトメッセージ
b)非フィールド検証:アクションクラスの特定のフィールドの組み合わせ検証にOGNL式を使用します。
<validator type = "fieldExpression"> <param name = "fieldname"> pwd </param> <param name = "fieldname"> pwd2 </param> <param name = "expression"> <![pwd == pwd2]]
c)訪問者の確認:主にアクションクラスのカスタムタイプフィールドを検証するために使用されます。 (モデル駆動型モードの使用)
i)アクションクラスの検証ルールファイルで、カスタムタイプフィールドの訪問者検証ルールを使用します。
<この訪問者の確認の名前 - > <param name = "appendprefix"> true </param> <! - 検証障害メッセージのプレフィックスを追加するかどうか - > <message> ussage </message> <! - message prefix-> </field-validator> </field>
ii)訪問者のフィールドに確認ルールファイルを書きます。ファイル名は次のとおりです。訪問者フィールドタイプ名[-visitor検証コンテキスト名] -validation.xml。たとえば、この例のファイル名はuser-usercontext-validation.xmlです
注:このファイルは、訪問者フィールドタイプが配置されているパッケージに保存する必要があります。
iii)訪問者のフィールド検証ルールファイルで検証するフィールドの検証ルールを追加します。
検証メソッドを書き換えずに検証構成ファイルを追加することにより、データ検証を実行することもできます。この検証構成ファイルは、struts2の既存の検証デバイスを使用して、フォームフィールドの検証を完了します。ここでは、必要なストリング検証デバイスを例として使用します。この検証装置は、特定のフォームフィールドを入力する必要があることを指定する必要な検証デバイスです。
以下は、この検証構成ファイルのloginvalidateaction-validation.xmlを書き込む方法です。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype validators public " - // apache struts // xwork validator 1.0.2 // en" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtdtdotdo> <validator> type = "rebusestring"> <sessage> usernameは空にすることはできません</message> </field-validator> </field> <field name = "upwd"> <field-validator type = "rebystring"> <message>パッセージは空になりません</メッセージ> </field-validator> <field-validator type = "stringlength"> <param name> <param name = "minlength"> 6 </param> <message>パッセージ長は$ {minlength} - $ {maxlength}ビット</message> </field-validator> </field> </validators>です注:この検証構成ファイルは、次の2つのルールに準拠する必要があります。
1。ファイルのFate形式は、アクションクラス名-Validation.xmlでなければなりません。たとえば、この例では、ファイル名は次のとおりです。LoginValidateAction-Validation.xml
2。ファイルは、アクションクラスのクラスファイルと同じパスにある必要があります。この例では、ファイルはにあります
LoginValidateActionクラスのコードは同じです。
パブリッククラスのloginvalidateActionはアクションサプポート実装アクション{public user user; public user map <string、object> map; //すべてのアクション@override public void validate(){if(user.getuname()。length()== 0){addfielderror( "uname"、 "user name nage nage ve veaty!" if(user.getupwd()。length()== 0){addfielderror( "upwd"、 "パスワードは空にすることはできません!") {system.out.println(user.getuname()); if(user.getuname()。equals( "admin")&& user.getupwd()。 ErrorReturn入力; //これは入力する必要があります}}/*** @return the user*/public user getuser(){return user;}/*** @paramユーザーを設定するユーザー*/public void setuser(user user){this.user = user;}上記は、編集者によって導入された検証問題に対するStruts 2のデータ検証関数と解決策です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!