Struts 2ラーニング(3)Struts 2基本構成とコアビジネス

8549 ワード

1.ワイルドカード
アクションを構成するには、次の手順に従います.
<package name="registerAction" extends="struts-default">
    <action name="user_*" class="com.cityu.b_action.RegisterAction" method="{1}">
        <result name = "success">/{1}.jsp</result>
        <result name = "fail">/index.jsp</result>
    </action>
</package>

したがって、JSPページの次のフォーム項目はuser_にコミットされます.register.action(Register Action)のregisterメソッドは、resultが「success」を返すとregister.jspページに転送されます.
<form action="${pageContext.request.contextPath}/user_register.action" method = "post">

2.Strutsにおける定数構成/国際化の例
org.apache.struts 2パッケージdefault.propertiesファイルで構成
ユーザー定義struts.xmlファイルで定数構成でグローバル構成を完了できます.
例えば国際化:
手順:
書き込みリソースファイル->struts定数ロード->strutsラベル導入
まず、リソースファイルcom/cityu/b_を書くAction/msg.properties、国際化されたname-valueペア:login=u 767 Bu 9646のような形
  • Msg.properties:デフォルト言語環境
  • Msg_en_US.properties:英語
  • 次に、リソースファイルを定数でロードします.
    <constant name = "struts.custom.i18n.resources" value = "com/cityu/b_action/msg"></constant>
    

    最後に、JSPページに以下を導入します.
    <%@taglib uri = "/struts-tags" prefix = "s"%>
    <s:text name = "login"></s:text>
    

    注意:国際化リソースファイルはJSPでstrutsのi 18 nラベルで導入することもできますが、この方法は推奨されません.
    1)アクセス接尾辞の変更
    <constant name = "struts.action.extension" value = "action,,"></constant>
    

    2)動的メソッド呼び出し
    action name=”user”
    /user!login->userに対応するactionクラスのlogin()メソッドへのアクセス
    3.グローバル構成
    1)グローバルジャンプビュー
    <struts>
        <package name="helloaction" extends="struts-default">
            <global-results>
                <result name = "success">/data_test.jsp</result>
            </global-results>
            <action name="data" class="com.cityu.action.HelloActioin" method="execute">
            </action>
        </package>
    </struts>
    

    注意actionノードの前に配置する必要があります
  • "+"1つまたは複数;
  • 「?」は1つもありません.
  • "*"が1つまたは複数ない
  • 2)各項目のデフォルト設定
    クラスが指定されていない場合:
    <action name = "test"></action>
    

    デフォルトクラスcom.opensymphony.xwork 2.ActionSupportのexecuteメソッドが実行され、戻り値は「success」で、グローバルビューでsuccessに対応するページを探します.このメソッドは、ページ転送:デフォルト転送、WEB-INFディレクトリのリソースにジャンプできます.(redirectにリダイレクトし、WEB-INF下のリソースにアクセスできません.セキュリティ上の考慮があります!)
    4.コア業務
    4.1要求データ自動カプセル化
    プロセスはパラメータ・ブロッカーによって実現され、ユーザーがアクセスすると、Actionクラス・オブジェクトが作成され、Actionのプロパティ、メソッドが取得されます.フォーム・データがコミットされると、paramsブロッカーが通過します.
    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
    

    フォームから送信されたデータをカプセル化し(カプセル化プロセスでActionのプロパティ、メソッドが使用されます)、カプセル化された結果をActionのデータ・オブジェクトに返します.
    4.2タイプ変換
    jspがコミットしたデータ(一般的にStringタイプ)は、strutsがアクションで対応する属性タイプに自動的に変換されます.基本タイプでは文字列タイプが自動的にカプセル化され、他のタイプではカスタムタイプ変換器でカプセル化する必要があります.
    1)カスタムタイプ変換クラス、StrutsType Converterクラスを継承
    public class MyConverter extends StrutsTypeConverter{
        @Override
        public Object convertFromString(Map context, String[] values, Class toClass) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            try {
                return sdf.parse(values[0]);
            } catch (ParseException e) {
                throw new RuntimeException("converter failed!!");
            }
        }
        @Override
        public String convertToString(Map context, Object o) {
            return null;
        }
    }
    

    2)変換器クラスの構成
    タイプ変換が必要なActionクラスの同じパッケージパスの下に、次の名前のプロファイルを新規作成します.
    RegisterAction-conversion.properties変換するデータ型を構成します:コミットされた文字列->カプセル化タイプ
    user.birthday=com.cityu.b_Action.MyConverterは変換器クラスはグローバル共通であるが,このプロファイルのためRegisterActionにのみ変換を提供することができ,これをローカルタイプ変換器と呼ぶ.
    3)グローバルタイプ変換器
    タイプ変換器クラスは変更しなくてもいいです!
    構成、src/下:xwork-conversion.properties java.util.Date=com.cityu.b_action.MyConverter
    4)最適化変換器クラス:
    public class MyConverter extends StrutsTypeConverter{
    
        SimpleDateFormat[] df = {
            new SimpleDateFormat("yyyyMMdd"),   
            new SimpleDateFormat("yyyy-MM-dd"), 
            new SimpleDateFormat("yyyy MM dd ") 
        };
        @Override
        public Object convertFromString(Map context, String[] values, Class toClass) {
            if(values == null || values.length==0){
                return null;
            }
            if (toClass!=java.util.Date.class) {
                return null;
            }
            //             
            for (SimpleDateFormat sdf : df) {
                try {
                    return sdf.parse(values[0]);
                } catch (ParseException e) {
                    continue;
                }
            }
            return null;
        }
    
        @Override
        public String convertToString(Map context, Object o) {
            return null;
        }
    }
    

    4.3データ処理のいくつかの方式
    1)サーブレットApiを取得して操作を実行する
    <struts>
        <package name="helloaction" extends="struts-default">
            <global-results>
                <result name = "success">/data_test.jsp</result>
            </global-results>
            <action name="data" class="com.cityu.action.HelloActioin" method="execute">
            </action>
        </package>
    </struts>
    
    public class HelloActioin implements Action{
        @Override
        public String execute() throws Exception {
            HttpServletRequest request = ServletActionContext.getRequest();
            HttpSession session = request.getSession();
            ServletContext application = ServletActionContext.getServletContext();
            request.setAttribute("request_data", "hello_request");
            session.setAttribute("session_data", "hello_session");
            application.setAttribute("application_data", "hello_application");
            return SUCCESS;
        }
    }
    

    2)ActionContextクラスの使用
    public class HelloActioin implements Action{
        @Override
        public String execute() throws Exception {
            ActionContext ac = ActionContext.getContext();
            Map<String, Object> request = ac.getContextMap();
            Map<String, Object> session = ac.getSession();
            Map<String, Object> application = ac.getApplication();
            request.put("request_data", "hello_request2");
            session.put("session_data", "hello_session2");
            application.put("application_data", "hello_application2");
            return SUCCESS;
        }
    }
    

    この方式は、サーブレットのAPIを使う必要はなく、デカップリングの方式で、お勧めです!
    ただし、サーブレットのAPIを使用する必要がある場合(例えばrequestで現在のプロジェクトパスを取得するなど)、パッケージのmap形式を使用することはできません.
    3)実装インタフェースによるmapオブジェクトの注入
    public class HelloActioin extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
        private Map<String, Object> request;
        private Map<String, Object> session;
        private Map<String, Object> application;
        @Override
        public void setRequest(Map<String, Object> request) {
            this.request = request;
        }
    
        @Override
        public void setSession(Map<String, Object> session) {
            this.session = session;
        }
    
        @Override
        public void setApplication(Map<String, Object> application) {
            this.application = application;
        }
    
        @Override
        public String execute() throws Exception {
            request.put("request_data", "hello1");
            session.put("session_data", "hello2");
            application.put("application_data", "hello3");
            return SUCCESS;
        }
    }
    

    この方式では,デカップリングの効果もある.またactionの業務方法が多い場合は,その都度ActionContextコンテナからドメインオブジェクトを取り出す必要はない.この方式は,インタフェースを介してドメインオブジェクトをグローバルに注入し,複数のトラフィックメソッドで使用できるようになった.このようにドメインオブジェクトを取得する方法は,通常BaseActionを書き最適化処理を行う際に用いられる.
    4.4ファイルアップロード
    従来のJSP/サーブレットモデルの実装方法:
    フロント
  • 提出方式POST
  • フォームタイプmultipart/form-data
  • input type = file

  • バックグラウンド
    Apacheが提供するFileUploadコンポーネントコアAPI:FileItemFactory ServiceletFileUpload FileItem要するに、ファイルをservletにアップロードするのは面倒です!
    Strutsフレームワークは簡略化できます:フロントは簡略化できません(JSP仕様)、バックグラウンドはどのように簡略化しますか?
    4.5 Strutsファイルのダウンロード
    1)responseオブジェクトを介してブラウザにバイトストリームデータを書き込み、応答ヘッダを設定する.
    2)struts方式