<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-126  評論-247  文章-5  trackbacks-0

    convention-plugin 可以用來實現 struts2 的零配置。

    零配置的意思并不是說沒有配置,而是通過約定大于配置的方式,大量通過約定來調度頁面的跳轉而使得配置大大減少。

    考慮到某種因素,這里采用 myeclipse 作為示例 IDE,環境 :

    JDK 1.6
    myeclipse 8.6.1
    struts 2.1.8

    web.xml
      <filter>
          
    <filter-name>struts2</filter-name>
          
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      
    </filter>
      
    <filter-mapping>
          
    <filter-name>struts2</filter-name>
          
    <url-pattern>/*</url-pattern>
      
    </filter-mapping>

    struts.xml
    <struts>

      
    <constant name="struts.devMode" value="true"/>                                                                     <!-- 開發模式 -->
      
    <constant name="struts.i18n.encoding" value="UTF-8"/>                                                       <!-- Web運用編碼 -->
      
    <constant name="struts.convention.result.path" value="/view/" />                                  <!-- 搜索視圖資源的路徑 -->
      
    <constant name="struts.convention.action.name.separator" value="_" />                     <!-- Action類名分隔符 -->
      
    <constant name="struts.convention.classes.reload" value="true" />                                 <!-- convention類重加載 -->
      
    <constant name="struts.convention.action.suffix" value="Action" />                               <!-- Action后綴名 -->
      
    <constant name="struts.action.extension" value="action,do,html,htm,php,aspx" /> <!-- Action擴展名 -->
      
    <constant name="struts.convention.package.locators" value="action,actions" />       <!-- 搜索Action資源的包路徑 -->
      
    </struts>

    convention 幾項重要配置 :

    Action 類后綴名 : <constant name="struts.convention.action.suffix" value="Action" />

    繼承了 struts2 的 ActionSupport 類的類不是一個普通的類,它具有能夠處理請求和對請求作出響應的能力,

    通常,開發者常常為這種特殊的類起一個后綴名,以區分一般普通的類。例如,xxAction,xxController,

    這里的類名的后綴 Action,Controller 就是對應上面配置中的 value 的值,這個值會在發起 URL 請求的時候被截去。例如 : TestAction ---> test

    Action類擴展名 [多項以逗號隔開]    <constant name="struts.action.extension" value="action,do,html,htm,php,aspx" />

    與文件的擴展名相似的,例如 : TestAction ---> test.action 或 test.do 或 test.html 或 test.php 或 test.aspx 或 ...

    注意 : 若該項被配置,則,訪問所有的 Action 都需帶上 Action 的擴展名,否則客戶端將拋出 404 ERROR

    Action類名分隔符 : <constant name="struts.convention.action.name.separator" value="_" />

    若 Action 類名中出現駝峰標識的串,則用分隔符來切割串,如 HelloWorldAction ---> hello_world

    搜索 Action 資源的包路徑 [多項以逗號隔開] : <constant name="struts.convention.package.locators" value="action,actions" />

    只有當包名含有以上配置中 value 值中至少一項時,convention plugin 才能搜索找得到該 Action,

    否則就算訪問的 Action 是存在的,convention plugin 也無法找得到該 Action

    注意 : 若包名不是以上列出現過的串結束,則后面的串相當于該包下所有 Action 訪問的命名空間 ( 以下面的 LoginAction 作為示例 )。

    搜索視圖資源(JSP,freemarker,等)的路徑 : <constant name="struts.convention.result.path" value="/view/" />

    所有的視圖資源都需放在配置指定的文件夾路徑下,否則,就算結果視圖是真實存在的,convention plugin 也無法找得到該視圖。默認值是 /WEB-INF/content/


    demo 結構圖 :



    convention 約定 :

    1. [ Action 不存在的情況 ] 若 convention plugin 在包搜索路徑中搜索不到與請求的 URL 相匹配的 Action,則會到視圖的搜索路徑下搜索

    與請求的 URL 相匹配的視圖資源,若還搜索不到,則拋出 no Action mapped Exception

    示例 :

    view/hello_world.jsp [ 沒有與之匹配的 Action 類 ]
    <html>
     
    <body>
      
    <h2>Hello World!!</h2>
     
    </body>
    </html>



    2. [ Action 的 execute 方法或動態方法調用的情況 ] 如請求 name!method.action,若 NameAction 存在,且 NameAction 中存在 method 這樣一個方法,

    則根據 method 方法返回的字符串,結果的視圖資源名稱規則 ( 視圖以 JSP 文件為例 ) :

    ① success  ----->  name.jsp 或 name_success.jsp ; 若這兩個視圖同時存在,則 convention plugin 會選擇 name_success.jsp 作為視圖來展示

    ② 非 success 的任意串 string  ----->  name_string.jsp

    示例 :

    package net.yeah.fancydeepin.action;

    import com.opensymphony.xwork2.ActionSupport;
    /**
     * -----------------------------------------
     * @描述  TODO
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-26 <BR>
     * -----------------------------------------
     
    */
    public class SayHelloAction extends ActionSupport{

        
    private static final long serialVersionUID = 1L;

        
    private String message;
        
        
    public String execute(){
            
            message 
    = "Hello struts2 convention plugin!";
            
    return SUCCESS;
        }
        
        
    public String say(){
            
            message 
    = "SayHelloAction, say";
            
    return "world";
        }
        
        
    public String sayHello(){
            
            message 
    = "SayHelloAction, sayHello";
            
    return "conventionPlugin";
        }

        
    public String getMessage() {
            
    return message;
        }
        
    }

    view/say_hello.jsp
    <html>
     
    <body>
      
    <h2>say_hello.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>

    view/say_hello_world.jsp
    <html>
     
    <body>
      
    <h2>say_hello_world.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>

    view/say_hello_conventionPlugin.jsp
    <html>
     
    <body>
      
    <h2>say_hello_conventionPlugin.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>










    convention 注解 :

    @ParentPackage : 對應于 struts.xml 常量配置項的 <constant name="struts.convention.default.parent.package" value="xx"/> 默認值是 convention-default

    @ResultPath : 對應于 struts.xml 常量配置項的 <constant name="struts.convention.result.path" value="xx" /> 默認值是 /WEB-INF/content/

    @Namespace : Action 訪問的命名空間,該注解一旦聲明,結果的視圖資源需放在 : 視圖搜索目錄/命名空間 ( 如 : view/simple/demo.jsp )


    package net.yeah.fancydeepin.action;

    import org.apache.struts2.convention.annotation.Namespace;
    import org.apache.struts2.convention.annotation.ParentPackage;
    import org.apache.struts2.convention.annotation.ResultPath;
    import com.opensymphony.xwork2.ActionSupport;
    /**
     * -----------------------------------------
     * @描述  TODO
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-26 <BR>
     * -----------------------------------------
     
    */
    @ParentPackage(
    "convention-default")
    @Namespace(
    "/simple")
    @ResultPath(
    "/view/")
    public class DemoAction extends ActionSupport{

        
    private static final long serialVersionUID = 1L;
        
    private String message;
        
        
    public String execute(){
            
            message 
    = "DemoAction";
            
    return SUCCESS;
        }

        
    public String getMessage() {
            
    return message;
        }
    }

    view/simple/demo.jsp
    <html>
     
    <body>
      
    <h2>demo.jsp &rarr; Hello World ${message}!</h2>
     
    </body>
    </html>



    @Action

    package net.yeah.fancydeepin.action;

    import org.apache.struts2.convention.annotation.Action;
    import com.opensymphony.xwork2.ActionSupport;
    /**
     * -----------------------------------------
     * @描述  TODO
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-26 <BR>
     * -----------------------------------------
     
    */
    public class ActionannotationAction extends ActionSupport{

        
    private static final long serialVersionUID = 1L;
        
    private String message;
        
        @Action(
    "invoke")
        
    public String invokeMethod(){
            
            message 
    = "ActionannotationAction, invokeMethod";
            
    return SUCCESS;
        }

        
    public String getMessage() {
            
    return message;
        }
    }

    view/invoke.jsp
    <html>
     
    <body>
      
    <h2>invoke.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>




    @Result,@Results

    package net.yeah.fancydeepin.action;

    import java.util.Random;
    import org.apache.struts2.convention.annotation.Action;
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    import com.opensymphony.xwork2.ActionSupport;
    /**
     * -----------------------------------------
     * @描述  TODO
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-26 <BR>
     * -----------------------------------------
     
    */
    @Results({@Result(name 
    = "success", location = "result.jsp")})
    public class ResultAction extends ActionSupport{

        
    private static final long serialVersionUID = 1L;
        
    private String message;
        
        
    public String execute(){
            
            message 
    = "ResultAction, execute";
            
    return SUCCESS;
        }
        
        @Action(value 
    = "doIt"
            results 
    = {
                @Result(name 
    = "isTrue", location = "result_true.jsp"),
                @Result(name 
    = "isFalse", location = "result_false.jsp")
            }
        )
        
    public String doExecute(){

            message 
    = "doExecute isFalse.";
            
    if(new Random().nextBoolean()){
                message 
    = "doExecute isTrue.";
                
    return "isTrue";
            }
            
    return "isFalse";
        }

        
    public String getMessage() {
            
    return message;
        }
    }

    view/result.jsp
    <html>
     
    <body>
      
    <h2>result.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>

    view/result_true.jsp
    <html>
     
    <body>
      
    <h2>result_true.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>

    view/result_false.jsp
    <html>
     
    <body>
      
    <h2>result_false.jsp &rarr; Message : ${message}</h2>
     
    </body>
    </html>







    The last example


    package net.yeah.fancydeepin.action.admin;

    import com.opensymphony.xwork2.ActionSupport;
    /**
     * -----------------------------------------
     * @描述  TODO
     * @作者  fancy
     * @郵箱  fancydeepin@yeah.net
     * @日期  2012-10-26 <BR>
     * -----------------------------------------
     
    */
    public class LoginAction extends ActionSupport{

        
    private static final long serialVersionUID = 1L;
        
    private String username;
        
    private String password;

        
    public String log(){
            
            username 
    = username.intern();
            password 
    = password.intern();
            
    if(username == "admin" && password == "fancy"){
                
    return SUCCESS;
            }
            
    return ERROR;
        }

        
    public void setUsername(String username) {
            
    this.username = username;
        }

        
    public void setPassword(String password) {
            
    this.password = password;
        }
    }

    view/admin/login_success.jsp
    <html>
     
    <body>
      
    <h2>Welcome!!</h2>
     
    </body>
    </html>

    view/admin/login_error.jsp
    <html>
     
    <body>
      
    <h2>Login Failed!!</h2>
     
    </body>
    </html>









      
    posted on 2012-10-26 11:16 fancydeepin 閱讀(12016) 評論(6)  編輯  收藏

    評論:
    # re: Struts2 Convention Plugin ( struts2 零配置 ) 2012-10-26 13:04 | BlogJava_Net_332
    好強大,啊!111  回復  更多評論
      
    # re: Struts2 Convention Plugin ( struts2 零配置 ) 2013-01-26 14:45 | tomwills
    看了幾遍才慢慢參透,其實還是自己去實踐下比較好,真的很不錯!  回復  更多評論
      
    # re: Struts2 Convention Plugin ( struts2 零配置 )[未登錄] 2013-01-27 23:34 | 1
    不愧是大神,我終于會convension了。  回復  更多評論
      
    # re: Struts2 Convention Plugin ( struts2 零配置 )[未登錄] 2013-09-24 17:36 | 小菜
    能發一份源碼么?  回復  更多評論
      
    # re: Struts2 Convention Plugin ( struts2 零配置 )[未登錄] 2013-09-24 17:37 | 小菜
    1240927198@qq.com  回復  更多評論
      
    # re: Struts2 Convention Plugin ( struts2 零配置 ) 2015-03-23 19:29 | yqysrc
    求源碼 393434042@qq.com   回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 中文字幕乱码一区二区免费| 亚洲最新中文字幕| 亚洲AV无码专区在线观看成人| 69视频在线观看免费| 亚洲av之男人的天堂网站| 久久免费99精品国产自在现线| 国产亚洲av人片在线观看| 国产一级黄片儿免费看| 久久久影院亚洲精品| 久久这里只精品国产免费10| 亚洲AV中文无码乱人伦下载| 91老湿机福利免费体验| 亚洲av无码专区在线| 成人免费毛片视频| 激情小说亚洲色图| 亚洲伊人久久综合影院| 免费无码又爽又刺激网站| 亚洲日韩图片专区第1页| 免费观看无遮挡www的视频| 99热亚洲色精品国产88| 卡一卡二卡三在线入口免费| 阿v免费在线观看| 国产亚洲精久久久久久无码77777| a级成人毛片免费图片| 久久久亚洲欧洲日产国码是AV| 日韩版码免费福利视频| 亚洲精品中文字幕无码A片老| 亚洲?v女人的天堂在线观看| aa在线免费观看| 亚洲av产在线精品亚洲第一站 | 国产精品亚洲va在线观看| 亚洲欧洲自拍拍偷精品 美利坚 | 亚洲一本之道高清乱码| 国产又粗又长又硬免费视频| 国产精品极品美女自在线观看免费| 亚洲精品无码午夜福利中文字幕| xxxx日本免费| 九九久久精品国产免费看小说| 久久99国产亚洲精品观看| 四虎在线免费播放| 曰批全过程免费视频在线观看无码|