Struts2 注解零配置方法(convention插件使用)

jopen 9年前發布 | 86K 次閱讀 Struts2 Web框架

最近接觸到一個新的項目,是做一個使用S2SH的電子商務商城的二次開發。之前使用過S2SH,在此之前的項目中,Struts2 使用的是XML配置而這個項目是使用注解。在這個項目中,注解還不需要使用Action注解,struts會自動識別了指定包下的所有action文件, 我只需要配置result和過濾器就可以了。剛開始接觸的時候,有點不習慣,但卻覺得這樣蠻好用的,后來了解了一下,這個是使用了Struts 2的convertion配置,主要的是要實現“約定優于配置”這個說法,這樣做,只需要在配置文件進行少量的配置,然后接下來的開發過程中,開發人員可 以不再需要去配置xml,需要的是進行編碼,一切的規則按照前期配置和convertion制定來執行。

 

關于

首先說明一下convention插件,它是Struts 2中進行注解的時候必須導入的包,提供的是注解功能,同時在Struts2的官方文檔中說了,它還提供了實現開發零配置的功能,可以使開發者專注于編碼,不用一邊編寫java一邊編寫xml。

當Struts 2啟動的時候,convention插件會進行一次Action的查找,然后按照指定的規則,生成namespaces和Action 的名字,當用戶訪問的時候,只需要根據對應的規則進行訪問,就能訪問到指定的Action了。

生成規則

在此說明一下convention插件對Action的查找規則和URL的生成規則

Convention 插件默認掃描繼承了action類的子類和文件名以Action結尾的文件

默認找的包是struts, struts2, action or action的包

如:

com.example.actions.MainAction

com.example.actions.products.Display (implements com.opensymphony.xwork2.Action)

com.example.struts.company.details.ShowCompanyDetailsAction

 

找到對應的類后,Convention 插件會根據包名生成namespaces地址

com.example.actions.MainAction -> /

com.example.actions.products.Display -> /products

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details

 

然后根據類名,去除Action后綴,然后取其余部分小寫,若有大小寫混合,以-進行連接生成最終訪問地址

com.example.actions.MainAction -> /main

com.example.actions.products.Display -> /products/display

com.example.struts.company.details.ShowCompanyDetailsAction -> /company/details/show-company-details

 

對于返回值,Convention 插件會根據Action的名字+分隔符+返回值.jsp 的結果去指定目錄下查找對應的結果文件。

 

配置

配置convention插件的主要方式,是在Struts.xml文件中添加相應的配置。說是零配置,實際上是一次配置便不再需要做其他的配置了。

 

要實現如我所說的這種方式,需要添加配置如下

<!-- 不進行掃描的包,用,分割,被包含的包,將不會被掃描成為action -->
    <constant name="struts.convention.exclude.packages" value="com.sean.service" />
    <!-- 進行掃描的根包,該包會被掃描成action -->
    <constant name="struts.convention.action.packages" value="com.sean.action" />
    <!-- 返回頁面地址 -->
    <constant name="struts.convention.result.path" value="/WEB-INF/content/" />
    <!-- 用于進行action查找的后綴 -->
    <constant name="struts.convention.action.suffix" value="Action" />
    <!--用于生成action名字時的分隔符,比如DemoCustAction會被映射成為demo_cust,同時用于形成返回文件,比如訪問DemoAction,return的值為input,插件會去指定不睦下,查找demo_input.jsp文件 -->
    <constant name="struts.convention.action.name.separator" value="_" />
    <!-- 指定的包會被進行掃描 -->
    <constant name="struts.convention.package.locators" value="action,actions,struts,struts2" />
    <!-- 返回頁面類型 -->
    <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker" />
    <!-- 開啟動態調用函數,這個方法在struts2里面不推薦,可是在這里卻可以實現動態方法的調用,不用自寫action了 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!-- 開發模式 -->
    <constant name="struts.devMode" value="true" />

實例

按照上述的配置配置,創建好項目后,我們進行創建兩個Action進行測試,這兩個Action除了繼承了ActionSupport外,其他什么都不添加。

package com.sean.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ActionSupport;


public class DemoAction extends ActionSupport{

    public String index(){
        return "index";
    }

    public String index2(){
        return SUCCESS;
    }

    public String index3(){
        return INPUT;
    }

    public String index4(){
        return "test";
    }
}

package com.sean.action;

import com.opensymphony.xwork2.ActionSupport;

public class MyDemoAction extends ActionSupport{

    public String index(){
        return "index";
    }
}

同時創建對應的jsp文件:

Struts2 注解零配置方法(convention插件使用)

 

當我們的Action名中含有多個大小寫的時候,我們需要按照分隔符的規則進行訪問

Struts2 注解零配置方法(convention插件使用)

 

插件會根據返回值,查找到對應的jsp,比如DemoAction的index返回的字符串是index,我們設置的分隔符是_,那么他找到的是demo_index.jsp

Struts2 注解零配置方法(convention插件使用)

進過測試,如果函數返回的值,找不到與其對應的文件的時候,插件會以action名去查找對應的文件,如果還查找不到的話,就會報錯。比 如,index4函數返回的是test,按道理應該查找demo_test.jsp,但是因為沒有,插件會去查找demo.jsp來返回,如果還是沒有, 則報錯。

Struts2 注解零配置方法(convention插件使用)

 

最后,說一下這種配置方法的優劣。這種方法,之前說了,就是實現“約定由于配置”這個說法,這樣做,在項目開發之初制定好相應的規則,開發人員就可 以按照對應的規則進行開發,使項目更加規范。不過這里面也有一些劣勢,因為這是Struts提供的插件,大部分的規則還是得順著插件來,規則的制定者還是 要收到插件的規則約束的。

 來自:http://www.cnblogs.com/Seanit/p/4620743.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!