この記事では、主にStrutsの要求転送機能を実装しています。 他の機能はゆっくりと補われます。
最近、私はJavassistの内容を学び、誰もが主にMVCのワークフローを説明する記事を見ました。
簡単なStruts2フレームワークがあります。同時に、あなた自身の理解の一部を追加します。
この記事では、主にStrutsの要求転送機能を実装しています。 他の機能はゆっくりと補われます。
まず、Struts2フレームワークでは、リクエストの実装とジャンプは主にstruts.xmlによって構成されています。 <アクション>リクエストの定義は、リクエストの「名前」を含む「クラス」を設定します。 <result "ラベルは、「成功」、「なし」、「ログイン」、「入力」、「エラー」、「ディスパッチャー(デフォルト)」を含む「タイプ」タイプ「タイプ」を含む、結果のタイプ「名前」を定義します。 ''、 'Chain'、 'Redirect'、 'Redirectaction'、 'Stream'。 struts.xmlを構成した後、インターフェイス内のフォームは、対応するクラスと実行方法を見つけるために、アクションプロパティによって定義された名前属性値を介して対応するアクションタグを見つけることができます。次に、実行方法によって返された文字列を一致させて、結果タグの名前を一致させ、定義された型タイプに従って次の要求操作を実行します。
まあ、Struts2が同じプログラム関数を要求するインターフェイスをどのように接続するかを理解した後、独自のコードを使用して関数のこの部分を実装できます。
では、どのように始めますか?
単純な関数を持つ2つの部分に分割されます。
アクションパーツ
interfaceインターフェイスの要求に応じて、対応するクラスと実行方法を見つける必要があります
結果部分
"「成功」、「なし」、「ログイン」、「入力」、および「エラー」のタイプ文字列を返す必要があります
②さまざまな種類の返品に異なるタイプのリクエストアドレスを指定する必要があります
"「ディスパッチャー(デフォルト)」、「チェーン」、「リダイレクト」、「リダイレクト」、「ストリーム」など、定義する必要があるタイプ。
この記事では、結果の種類は2種類の「成功」と「ログイン」のみを実現し、当面はデフォルトのディスパッチャーリクエストの転送タイプを実装していません。完全な関数は後で補充されます。
次に、コードを介して上記の機能を達成する方法を見てみましょう。
まず、ActionAnnotationとresultAnnotationの2つのカスタムアノテーションは、2つのカスタムアノテーションによって返される文字列の対応するメソッドと方法を要求します
/ ** *アクションノート:ActionNameはurl -pattern * @author linlingに相当します */ @retention(retentionpolicy.runtime) @targettype.method blic @interface actionnotation {string actionname()default "; ()default {};} /***アノテーションオブジェクトに戻ります:名前は、「成功」、「なし」、「エラー」、「入力」を含むStruts構成の結果に相当します。 login '; struts構成の対応するリターンジャンプコンテンツ * @authoring(retentionpolicy.runtime) ()デフォルト "index.jsp";}
次に、リクエストに必要なコンテンツを保存するようにActionContextクラスを定義します
/***シミュレーションストラットを実装して、構成ファイルに従って対応するメソッドを実行するために必要なコンテンツへのジャンプ*@Author linling **/public classcontext {/*** web.xmlのurl -patternに相当します。 * /private string url。例:キー:「成功」: 'index.jsp' / private <resulttype、string> results <?> classtystypプライベートオブジェクトアクション。 * / private string [] actionparamsname;
AnalysePackageは、ActionContextのアセンブリに必要な方法です
/** * scan_packageパッケージパッケージの下でクラスファイルをトラバースしました。これは、ActionAnnotationの方法を使用してそれを分析し、アクションコンテキストオブジェクトに組み立てて、@param real_path scan_package * @thro ws classnotfoundexception * @throws instantiationexception *に配置しました。 @Throws IllegAlaccessexception * @Trows NotFoundException */ public Static void AnalysePackage(String Real_Path、String Scan_Package FoundException、InstantificationException、Illegalaccessexception、notfoundException {file file = new file(real_path); if(file.isdirectory()){file [] f(] f( ] files.listfiles(); classstype = class.forname(filename); method = classStype.getMethods(); .getAnnotation(actionnotation.class);メソッドアニテーションエラー! " + method +"、actionname: " + url +"、result.length: " + results.lengts.lengt h);} actioncontext.seturl(url); actionText.setMethod(method.getName()) ; Map <res)new Hashmap <res); null ");} map.put(result.name()、value);} actionContext.setResults(map); act ioncontext.setclasStype(clasStype);actionContext。Setaction(classtype.newinstance()); actionContext.setParamstype( method.getParametertypes());
getParamsは、httpservletrequestリクエストのリクエストコンテンツに基づいたリクエストパラメーター配列です。
/** *パラメーターのタイプに基づいて、パラストタイプとパラメーター名ActinParamsNameに基づいてリクエストリクエストを分析してパラメーターオブジェクトを作成します[] * @paramStype * @param ActionParamsName * @retourn * @@Throws InstantiationCeption * Illegalargumentexception * @ @ @ @ @ @ @ @ @ throws invotutionantargetexception * @throws nosuchmedhodexception * @throws securityexception */ public staticオブジェクト[]クエストリクエスト、クラス<? Invocat iontargexception、nosuchmethodexception、securityexception {objects = new object [paramstype.length]; Parampe Style [i]){objects [i] = paramsutils.getParam(paramStype [i]、actionparamsname [i]);} classStype.getDetDeclardFields(); ){string key = iterator.next();長さ!= 2){続行;} if(!actionParamsName [i] .equals(strs [0])){continue;} if(!field.getName()。 string value.get(key)[0]; } return objects;}
さて、次は。アクションメソッドを実装できます
public class loginaction {@actionname = "login.action"、results = {@resultanitation(name = resulttype.success、value = "i ndex.jsp")、@resulttype.login、value = "login 。 (actionname = "loginforuse.action"、results = {@resannotation(name = resulttype.success、value = "indexp")otary(name = resulttype.login、value = "login.jsp")})})public resulttype loginforuserer (int number、loginpojo loginpojo){if( "hello" .equals(loginpojo.getusername())&& "world" .equojo.getpa ssword()){return resulttype.success;} return resulttype.login;}}}}
次に、開始時にプログラムがワーキングディレクトリ内のすべてのメソッドを通過することを許可し、ActionContextに組み立てるためにActionAnnotationメソッドを使用することです。このようにして、リクエストが届くと、リクエストアドレスに従って対応するActionContextを見つけて、反射メカニズムでメソッドを呼び出すことができます。
2つのサーブレットを設定します。 1つは初期化プログラムを実行するために使用されます。 1つはすべてのアクションリクエストをフィルタリングするために使用されます
<Servlet> <Servlet> strutsinitservlet </servlet-name> <servlet-class> com.bayern.struts.servletsinitservlet </servlet-class> <par am-name> scan_package </param-name> <param-value> com .bayern.struts.one </param-value> </init-param> <load-on-startup> 10 </load-startup >> <servet-name> dispatcherservlet </servlet-name> <servlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet-mapping </servet-name> dispatcherservlet </servet-name> <url-pattern>*。サーブレットマッピング>
DispatcherServletは、使用されるアクション要求のフィルタリングを実装し、対応するアクションメソッドを実行し、次のジャンプを行うことができます
ublic void dopost(httpservletrequestリクエスト) (ActionContext.getParamStype()、actionCparamsStype = ActionContext.getClasStype(); .getAction()、params);
さて、今では、最も単純なStrut2フレームワーク要求転送機能を実装しました。この機能は非常に荒れており、多くの場合、誰もがそれをより多くのポインターを与えることを願っています
上記は、この記事のすべての内容です。