この記事では、参照用のStruts2 MVCフレームワークをカスタマイズする方法を共有しています。特定のコンテンツは次のとおりです
カスタムMVC :(最初にModel1とModel2の概念を理解します)
Model1およびModel2:
Model1:これは、ビジネスロジックコードとレンダリングコードを表示する純粋なJSSP開発テクノロジーです。
Model2:Model2はModel1に基づいており、ビジネスロジックコードを分離し、サーブレットのみを形成します。 Model2はMVCに基づいて開発されています。
MVCの特性は次のように要約されています。
(1)データ収集と表示分離
(2)コントローラーは、さまざまなモデルとビューを結合します
(3)アプリケーションは3つの部分に分割され、ゆるく結合されて連携して、アプリケーションのスケーラビリティと保守性を向上させます
(4)各レイヤーは異なる機能を担当し、独自の義務を果たします。各レイヤーのコンポーネントには同じ特性があり、エンジニアリングとツールを通じてプログラムコードの生成を容易にします。
MVCの考えとその利点(非常に強い)
MVCはアーキテクチャモデルであり、目的はモデル(ビジネスロジック)とビュー(プレゼンテーションレイヤー)を分離することであり、モデルとビューを互いに影響を与えることなく独立して変更できます。ほとんどのソフトウェアは、アーキテクチャを設計する際にこのパターンを採用しています。 MVCモードを使用するには多くの方法があります。ブラウザを介してブラウジングするシステムがモバイルバージョンの開発を必要とする場合、ビューを再開発するだけで、モデルパーツのビジネスロジックを再利用できます。多くのソフトウェアは、B/SバージョンとC/Sバージョンを同時に起動する必要があり、MVCモードを採用し、モデルパーツを再利用でき、異なるビューのみを開発する必要があります。 MVC Ideaは、アプリケーションを3つの基本パーツに分割します:m(モデル、モデル)V(ビュー、ビュー)C(コントローラー、コントローラー)。 Mはビジネスロジックを処理する部分を表します。Vはデータを表示してユーザー入力を取得する部分を表し、Cは仲介者に似ており、MとVが直接相互作用しないようにします。
基本的な手順は次のとおりです。
1. XML Document Framework.xmlを作成します
2。アクションインターフェイスを定義します
3.アクションマッピングクラスを定義し、アクションノードとして扱う
4.アクションマッピングクラスを管理するActionMappingManageクラスを定義します(アクションノード)
5.反射メカニズムを使用してActionManagerクラスを定義して、文字列タイプのクラス名に基づいて特定のクラスを取得します(web.xmlタグの書き込み)
6。ランニング時間コントロールのためにサーブレットを書きます
7.テスト用のログニクションクラスを定義します
1. XML Document Framework.xmlを作成します
<! - ?xml version = "1.0" encoding = "utf-8"? - > <! - 定義制約ファイル - >(note)<! - 要素は要素を示します - > <! - attlistは属性を示します - > <! - cdataは文字列タイプを示します - > <! - 必要です。転送 - > <! - 要素アクション(アクション) - > <! - 要素アクション(result*) - >(* MEANSMULTING) name = "success"> success.jsp </result> <result name = "login"> index.jsp </result> </action> </action> </framework>
注:スペースと<>の執筆仕様。
ノードの階層。
2。アクションインターフェイスを定義します
注:エクスパートパラメーターは、書き込まれ、要求され、応答されます。
3.アクションマッピングクラスを定義し、アクションノードとして扱います(アクションノードのラベルを書きます)
フィールドと結果コレクションへのデータをカプセル化します。
注:執筆にデータを追加します。 (マップコレクション)
4.アクションマッピングクラスを管理するActionMappingManageクラスを定義します(アクションノード)
/**アクションマッピングクラスの管理に使用されるアクションノードが複数あります*/public classmappingmanager {//アクションマッピングクラスのコレクションプライベートマップ<文字列、アクションマッピング>マップ= new Hashmap <string、actionmapping>(); public ActionMapping getActionMapping(string name){return maps.get(name); } // srcプロジェクトの下ですべての構成ファイルを解析する//インスタンス化後のparse public actionmappingmanager(string [] file){for(string filename:file){init(filename); }} // init initialization method // xml document public void init(string path){try {inputstream is = this.getClass()。getResourceasStream( "/"+path); // XML Document doc = new Saxreader()。読み取り(is); //ルートノード要素root = doc.getRootelement()を取得します。 //アクションノード要素アクション=(要素)root.Elementiterator( "actions")。next(); // for loopを使用して、アクションノードの[iterator <element> action = action.elementiterator( "action"); action.hasnext();){// <comaction> node element actionnext = action.next.next.next()を取得します。 //アクションノードでそれぞれ名前属性とクラス属性を取得しますstring name = actionnext.attributevalue( "name"); string classname = actionnext.attributevalue( "class"); //アクションマッピングクラスのactionMapping map = new ActionMapping()に上記の2つの属性を保存します。 MapApp.setClassName(className); mapapp.setname(name); //アクションの下ですべての結果ノードを通過するアクションノードの下に複数の結果ノードがあるため(iterator <lement> result = actionnext.elementiterator( "result"); result.hasnext();){// result node要素resultnext = result.next(); //結果ノードの名前属性値と結果ノード文字列resultNext.attributevalue( "name"); string resultValue = resultNext.getText(); //アクションマッピングのダブルコラムセットに保存して、アクションマッピングクラス(ActionMappingクラスにデータがあります!)mapp.addResult(resultName、resultValue)を呼び出すことを容易にします。 System.out.println(mapp.getName()); } //すべてのアクションノードのコレクションを取得します。 }} catch(例外e){// dodo:例外を処理}}}}まとめ:
dom4jを介してframework.xml構成ファイルを解析します。これにより、ルートノードとアクションノードが取得され、名前とクラスの属性値を取得するためにループのアクションノードの下でアクションノードをトラバースします。 1つのアクションノードの下に複数の結果ノードがあり、すべての結果ノードがアクションの下にあるため、アクションマッピングのダブルコラムセットに保存され、最後にすべてのアクションノードのセットを取得します。
注:initメソッドの執筆、およびパラメーターグループを使用したActionMappingManagerの執筆。
5.反射メカニズムを使用してActionManagerクラスを定義して、文字列タイプのクラス名に基づいて特定のクラスを取得します。
パブリッククラスActionManager {public static Action getActionClass(String className){class clazz = null;アクションアクション= null; //現在のスレッドのクラスローダーを取得しますtry {//スレッドにクラスがある場合、クラス名に従ってクラスのタイプを直接取得しますclazz = thread.currentthread()。 } catch(classNotFoundException e){// todo auto-enerated catch block e.printstacktrace(); } if(clazz == null){try {//スレッドにない場合は、class.fornameメソッドを使用してclazz = class.forname(classname); } catch(classNotFoundException e){// todo auto-enerated catch block e.printstacktrace(); }} if(action == null){try {//取得したタイプをアクションに変換し、パラメーターのないコンストラクターを呼び出します。 } catch(instantiationexception e){// todo auto-fenated catch block e.printstacktrace(); } catch(Illegalaccessexception e){// todo auto-enerated catch block e.printstacktrace(); }}アクションを返します。 }}web.xmlのノード構成:
6。ランタイムを制御するためのサーブレットを書きます(サーブレット、すべてのクラスを初期化)
パブリッククラスmyServletはhttpservlet { / ***あなたはとてもいたずら* / public void doget(httpservletrequest request、httpservletresponse応答)を拡張します。 } <br> / ***懸命に働き続ける* / actionmappingmanager man = null; public void dopost(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {// actionmapping offactmapps actionmapping = man.getActionMapping(getPath(request)); //アクションインターフェイスの反射メカニズムを取得するアクション= ActionManager.getActionManager(actionMapping.getClassName()); try {string message = action.execute(request、response);文字列results = actionmapping.getResults(メッセージ); Response.sendredirect(results); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); }} /**リクエストのパス名を取得* /public String getPath(httpservletrequest request){// project + requestアドレス文字列requesturi = request.getRequesturi(); //プロジェクト名String ContextPath = request.getContextPath(); //特定の要求文字列= requesturi.substring(contextpath.length()); string filename = path.substring(1、path.lastindexof( "。"));ファイル名を返します。 } / * * init、プログラムはすべてのクラスを実行およびロードします * * /@Override public void init(servletconfig config)servletexception {// configオブジェクトはjavax.servlet.servletconfigのオブジェクトです。関数は、初期化構成情報//config.getInitParameterを取得することです。 string [] filenames = null; if(filename == null){//空の場合、filenames = new String [] {"framework.xml"}; } else {//他の構成パラメーター情報がある場合、filenames = filename.split( "、"); } //初期化にinitメソッドを使用= new ActionMappingManager(filenames); }}注:コードのレベルとコメント。
7.テスト用のログニクションクラスを定義します
パブリッククラスのログニクションはアクションを実装します{@Override public String execute(httpservletrequest request、httpservletResponse応答)スロー{文字列name = request.getParameter( "name");文字列pwd = request.getParameter( "pwd"); if(name.equals( "1")&& pwd.equals( "1")){return success; } else {return login; }}}JSPコード:
効果を実現します:
道路がどれほど長くても、ステップごとに歩くことができます。道路がどれほど短いかに関係なく、ステップを踏むことなく到達することはできません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。