Struts2では、アクション部分、つまりコントローラー層が低い侵入方法を採用します。なぜそう言うのですか?これは、Struts2のアクションクラスでは、ベースクラスを継承したり、インターフェイスを実装したりする必要がないため、サーブレットAPIと直接結合する必要がないためです。通常、通常のpojoに似ており(通常はパラメーターのない実行方法を含める必要があります)、コンテンツ内の一連のメソッド(パラメーターメソッドなし)を定義でき、構成を通じて独立アクションとして使用でき、それによりコードの再利用を実現できます。
例えば:
パッケージの例; public class useraction {private string username;プライベート文字列パスワード。 public string execute()スロー例外{//……….. "success"を返します。 } public string getUsername(){return username; } public void setUsername(string username){this.username = username; } public string getPassWord(){パスワードを返します。 } public void setPassword(string password){this.password = password; }}アクションアクセスサーブレット
このアクションクラスのプロパティは、パラメーターをカプセル化して結果を処理できます。システムはそれらを厳密に区別しません。
ただし、ユーザー開発のアクションクラスをより標準化するために、Struts2は次のように定義されているインターフェイスアクションを提供します。
publicInterface Action {publicStaticFinal String error = "error"; publicStaticFinal string input = "input"; publicStaticFinal文字列なし= "なし"; publicStaticFinal String login = "login"; publicStaticFinal String success = "success"; public string execute()スロー例外;}ただし、アクションを作成する場合、通常はインターフェイスを実装しませんが、インターフェイスの実装クラスアクションサポートを継承します。
このクラスのコードは次のとおりです。
パブリッククラスのActionSupport Action、validatable、validationaware、textprovider、localeprovider、serializable {............. public void setactionerrors(collection errormessages){validationaware.setactionerrors(errormessages); } public collection getActionErrors(){return validationaware.getActionErrors(); } public void setActionMessages(Collection Message){validationAware.SetActionMessages(Messages); } public collection getActionMessages(){return validationAware.getActionMessages(); } public collection getErrorMessages(){return getActionErrors(); } public Map getErrors(){return getFielderRors(); } //フォームフィールド検証エラーpublic void setfielderrors(Map errormap){validationAware.setFielderRors(errormap); } public Map getFielderRors(){return validationaware.getFielderrors(); } public locale getLocale(){actionContext ctx = actioncontext.getContext(); if(ctx!= null){return ctx.getLocale(); } else {log.debug( "アクションコンテキストは初期化されていない"); nullを返します。 }} //国際情報を取得する方法public string getText(string atextName){return textProvider.getText(atextName); } public string getText(String atextName、String DefaultValue){return textProvider.getText(atextName、defaultValue); } public string getText(string atextName、string defaultValue、string obj){return textProvider.getText(atextName、defaultValue、obj); } ......... //国際リソースパッケージにアクセスするために使用される方法public resourcebundle getTexts(){return textProvider.getTexts(); } public resourceBundle getTexts(String AbnundLename){return textProvider.getTexts(anbundLename); } //アクションのエラーメッセージPublic void AddactionError(String AnerrorMessage){validationAware.AddActionError(AnerrorMessage); } //アクションの通常情報を追加public void addactionmessage(string amessage){validationaware.addactionmessage(amessage); } public void addfielderroror(string fieldname、string errormessage){validationaware.addfielderror(fieldname、errormessage); } public void validate(){} public object clone()throws clonenotsupportedexception {return super.clone(); } .........}前述のように、Struts2はサーブレットAPIと直接結合していないため、サーブレットAPIにどのようにアクセスできますか?
Struts2は、サーブレットAPIをシミュレートするActionContextクラスを提供することがわかります。主な方法は次のとおりです。
1)Object Get(Object Key):このメソッドは、httpservletrequest.getattribute(string name)メソッドをシミュレートします。
2)Map getApplication()ServletContextインスタンスをシミュレートするMAPオブジェクトを返します。
3)Static ActionContext getContext():システムのActionContextインスタンスを取得します。
4)Map Getsession():HTTPSESSIONインスタンスをシミュレートするMAPオブジェクトを返します。
5)Map getParameters():すべての要求パラメーターを取得し、シミュレートされたhttpservletrequest.getParametermap()
なぜこれらの方法が常にマップを返すのか疑問に思うかもしれません。これは主にテストを容易にするためです。 MAPオブジェクトを実際のサーブレットAPIインスタンスで変換する方法については、Struts2にはこの変換を完了するのに役立つインターセプターが組み込まれているため、これについてはまったく心配しません。
サーブレットAPIを直接使用するために、Struts2は次のインターフェイスを提供します。
1)ServletContextAware:このインターフェイスを実装するアクションは、ServletContextインスタンスに直接アクセスできます。
2)ServletRequestaware:このインターフェイスを実装するアクションは、httpservletrequestインスタンスに直接アクセスできます。
3)ServletResponseaware:このインターフェイスを実装するアクションは、httpservletResponseインスタンスに直接アクセスできます。
上記は主にアクションアクセスサーブレットについて説明しています。 Struts2のアクションがコードの再利用をどのように実装するかを見てみましょう。たとえば、ユーザーアクセスを確認してください。このアクションにユーザー登録とログイン(Longin)の両方を処理できる場合、このアクションをどのように書き直す必要がありますか?書き換えられたユーザーは次のとおりです。
パッケージの例; public class useractionはactionsupportを拡張します{private string username;プライベート文字列パスワード。 public String登録()スロー例外{//…………..成功を返す; } public string login()throws exception {//……….. return success; } public string getUsername(){return username; } public void setUsername(string username){this.username = username; } public string getPassWord(){パスワードを返します。 } public void setPassword(string password){this.password = password; }} struts.xmlのアクション構成
このように書いても大丈夫ですか?もちろん、うまくいきません。また、struts.xmlファイルで構成する必要があります。 2つの構成方法があります。
1)通常の方法を使用して、アクション要素のメソッド属性を指定します。
<アクションname =” loginaction” class =” example.useraction” method =” login”> <result name =” success”>/success.jsp </result.jsp </result> </action> <action name =” registaction” class =” class = "regist" regist "> <result name =” success.jsp </result> </</act
2)ワイルドカードを使用して、アクション要素のメソッド属性を指定します。
<アクションname =”*action” class =” example.useraction” method =” {1}”> <result name =” success ">/success.jsp </result> </action>ワイルドカードを使用する方法は柔軟性が高すぎ、以下はより複雑な構成の状況です。
<アクションname =”*_*” class =” example。{1} action” method =” {2}”>………。</action>プレースホルダー{1}は、_の前の *と一致し、{2}は次の *と一致します。
注釈方法に基づくアクション構成:
以下で説明したいアクションの構成はSRC/struts.xmlではありませんが、注釈を使用して構成するための前提条件は、基本的な6つの瓶パッケージに加えて、struts-2.1.8.1/lib/struts2-convention-plugin-2.1.8.1.
ただし、struts.xmlには具体的な例が必要です
login.jsp
<%@ページ言語= "java" import = "java.util。*" pageencoding = "utf-8"%> <!doctype html public " - // w3c // dtd html 4.01 transitional // en"> <html> <head> <title> struts2log in visification content = "keyword1、keyword2、keyword3"> <meta http-equiv = "description" content = "this is my page"> <! - <link rel = "styleSheet" type = "text/css" href = "styles.css"> - > </head> <body> <h3> action = "$ {pagecontext.request.contextpath}/user/login.qqi" method = "post"> <table> <tr> <td> username </td> <td> <入力タイプ= "テキスト" name = "loginname"/>> </td> </tr <td> <td> <td> <td> <td> <td> <pussd> <pussd> <pussd> < name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <input type = "submit" value = "login"/> </td> </tr> </table> </form> </body> </html> </html> src/struts.xml
<span style = "font-size:large;"> <?xml version = "1.0" encoding = "utf-8"?> <!doctype struts public " - // apacheソフトウェア財団// dtd struts構成2.1.7 // enエンコード要求パラメーターのメソッド - > <定数名= "struts.i18n.encoding" value = "utf-8"/> <! - struts2で処理されたリクエストサフィックスタイプを指定します。コンマで区切られた複数 - > <constant name = "struts.action.extension" value = "action、do、go、qqi"/> <! - struts.xmlが変更されたとき、リロードするかどうか。デフォルト値はfalse(生産環境で使用されています)、開発段階を開くことが最適です - > <constant name = "struts.configuration.xml.reload" value = "true"/> <! - strutsの開発モードを使用するかどうか。開発モデルには、より多くのデバッグ情報があります。デフォルト値はfalse(生産環境で使用)であり、開発段階を開くことが最適です - > <constant name = "struts.devmode" value = "false"/> <! - ブラウザが静的コンテンツをキャッシュするかどうかを設定します。デフォルト値は真(生産環境で使用されています)、開発段階を閉じるのが最善です - > <constant name = "struts.serve.static.browsercache" value = "false" /> <! - スプリングはアクションオブジェクトの作成に責任があることを指定します<constant name = "struts.objectory" value = "spring" /> - > <> < name = "struts.enable.dynamicmethodinvocation" value = "false"/> </struts> </span>
loginaction.java
パッケージcom.javacrazyer.web.action; org.apache.struts2.convention.annotation.actionをインポートします。 org.apache.struts2.convention.annotation.exceptionMappingをインポートします。 org.apache.struts2.convention.annotation.exceptionMappingsをインポートします。 org.apache.struts2.convention.annotation.namespaceをインポートします。 org.apache.struts2.convention.annotation.parentPackageをインポートします。 org.apache.struts2.convention.annotation.result; org.apache.struts2.convention.annotation.resultsをインポートします。 com.opensymphony.xwork2.actionsupportをインポートします。 /** *アクションを使用してアクションを構成 * */@ParentPackage( "Struts-Default")// Parent Package @NamesPace( "/user")@Results({@Result(name = "success"、location = "/msg.jsp") "Java.lange.RuntimeException"、result = "error")})public class loginactionはactionsupportを拡張します{private static final long serialversionuid = -2554018432709689579L;プライベート文字列loginname;プライベート文字列PWD; @action(value = "login")public string login()throws exception {if( "qq" .equals(loginname)&& "123" .equals(pwd)){return success; } else {return error; }} @Action(value = "add"、results = {@result(name = "success"、location = "/index.jsp")})public string add()throws exception {return success; } public string getloginname(){return loginname; } public void setloginname(string loginname){this.loginname = loginname; } public string getpwd(){return pwd; } public void setPwd(string pwd){this.pwd = pwd; }}
success.jspとerror.jspを投稿しません
注釈設定の説明
1)@ParentPackage親パッケージを指定します
2)@namespaceネームスペースを指定します
3)@Results一連の結果
4)@result(name = "success"、location = "/msg.jsp")結果のマッピング
5)@Action(value = "Login")要求処理方法のリクエストURLを指定します。アクションクラス、メソッドに追加できないことに注意してください。
6)@exceptionMappings第1レベルの例外宣言の配列
7)@exceptionMappingマップ宣言の例外
この方法はあまり一般的に使用されていないため、理解することしかできません