一、Action配置中的各項預設值
<package name="csdn" namespace="/test" extends="struts-default">
<action name="helloworld" method="execute" >
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
1>如果沒有為action指定class,預設是ActionSupport。
2>如果沒有為action指定method,預設執行action中的execute() 方法。
3>如果沒有指定result的name屬性,預設值為success。
二、Action中result的各種轉寄類型
<action name="helloworld">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
result配置類似struts1中的forward,但struts2中提供了多種結果類型,常用的類型有: dispatcher(預設值)、 redirect 、 redirectAction 、 plainText。
以下是redirectAction 結果類型的例子,如果重定向的action中同一個套件下:
<result type="redirectAction">helloworld</result>
如果重定向的action在別的命名空間下:
<result type="redirectAction">
<param name="actionName">helloworld</param>
<param name="namespace">/test</param>
</result>
plaintext:顯示原始文件內容,例如:當我們需要原樣顯示jsp文件原始碼的時候,我們可以使用此類型。
<result name="source" type="plainText ">
<param name="location">/xxx.jsp</param>
<param name="charSet">UTF-8</param><!-- 指定讀取檔案的編碼-->
</result>
在result中也可以使用${屬性名}表達式存取action中的屬性,表達式裡的屬性名稱對應action中的屬性。如下:
<result type="redirect">view.jsp?id=${id}</result>
三、多個Action共享一個視圖--全域result配置
當多個action中都使用到了相同視圖,這時我們應該把result定義為全域視圖。 struts1中提供了全域forward,struts2中也提供了相似功能:
<package ....>
<global-results>
<result name="message">/message.jsp</result>
</global-results>
</package>
四、為Action的屬性注入值
Struts2為Action中的屬性提供了依賴注入功能,在struts2的設定檔中,我們可以很方便地為Action中的屬性注入值。注意:屬性必須提供setter方法。
public class HelloWorldAction{
private String savePath;
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
.....
}
<package name="csdn" namespace="/test" extends="struts-default">
<action name="helloworld" >
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
上面透過<param>節點為action的savePath屬性注入“/images”
五、指定需要Struts 2處理的請求後綴
前面我們都是預設使用.action後綴來存取Action。其實預設後綴是可以透過常數」struts.action.extension「進行修改的,例如:我們可以設定Struts 2只處理以.do為後綴的請求路徑:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
如果使用者需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。如:
<constant name="struts.action.extension" value="do,go"/>
六、細說常量定義
常數可以在struts.xml或struts.properties中配置,建議在struts.xml中配置,兩種配置方式如下:
在struts.xml檔中配置常數
<struts>
<constant name="struts.action.extension" value="do"/>
</struts>
在struts.properties中配置常數
struts.action.extension=do
因為常數可以在下面多個設定檔中定義,所以我們需要了解struts2載入常數的搜尋順序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如果在多個檔案中配置了同一個常數,則後一個檔案中配置的常數值會覆寫前面檔案中配置的常數值.
七、常用的常數介紹
<!-- 指定預設編碼集,作用於HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的輸出-->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 此屬性指定需要Struts 2處理的請求後綴,該屬性的預設值是action,即所有符合*.action的請求都由Struts2處理。
如果使用者需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。 -->
<constant name="struts.action.extension" value="do"/>
<!-- 設定瀏覽器是否快取靜態內容,預設值為true(生產環境下使用),開發階段最好關閉-->
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- 當struts的設定檔修改後,系統是否自動重新載入該檔,預設值為false(生產環境下使用),開發階段最好開啟-->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 開發模式下使用,這樣可以列印出更詳細的錯誤訊息-->
<constant name="struts.devMode" value="true" />
<!-- 預設的視圖主題-->
<constant name="struts.ui.theme" value="simple" />
<! 與spring整合時,指定由spring負責action物件的建立-->
<constant name="struts.objectFactory" value="spring" />
<!該屬性設定Struts 2是否支援動態方法調用,該屬性的預設值是true。如果需要關閉動態方法調用,則可設定該屬性為false。 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--上傳檔案的大小限制-->
<constant name="struts.multipart.maxSize" value=“10701096"/>
八、為應用程式指定多個struts設定文件
在大部分應用程式裡,隨著應用程式規模的增加,系統中Action的數量也會大量增加,導致struts.xml設定檔變得非常臃腫。為了避免struts.xml檔案太龐大、臃腫,提高struts.xml檔案的可讀性,我們可以將一個struts.xml設定檔分解成多個設定文件,然後在struts.xml檔案中包含其他設定檔。下面的struts.xml透過<include>元素指定多個設定檔:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-user.xml"/>
<include file="struts-order.xml"/>
</struts>
透過這種方式,我們就可以將Struts 2的Action按模組加入在多個設定檔中。
九、動態方法調用
如果Action中存在多個方法時,我們可以使用!+方法名稱來呼叫指定方法。如下:
public class HelloWorldAction{
private String message;
....
public String execute() throws Exception{
this.message = "我的第一個struts2應用程式";
return "success";
}
public String other() throws Exception{
this.message = "第二個方法";
return "success";
}
}
假設造訪上面action的URL路徑為: /struts/test/helloworld.action
要存取action的other() 方法,我們可以這樣呼叫:
/struts/test/helloworld!other.action
如果不想使用動態方法調用,我們可以透過常數struts.enable.DynamicMethodInvocation關閉動態方法呼叫。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
十、使用通配符定義action
<package name=“csdn” namespace="/test" extends="struts-default">
<action name="helloworld_*" method="{1}">
<result name="success">/WEB-INF/page/hello.jsp</result>
</action>
</package>
public class HelloWorldAction{
private String message;
....
public String execute() throws Exception{
this.message = "我的第一個struts2應用程式";
return "success";
}
public String other() throws Exception{
this.message = "第二個方法";
return "success";
}
}
要存取other()方法,可以透過這樣的URL來存取:/test/helloworld_other.action
十一、接收請求參數
採用基本型別接收請求參數(get/post)
在Action類別中定義與請求參數同名的屬性,struts2可自動接收請求參數並賦予同名屬性。
請求路徑: http://localhost:8080/test/view.action?id=78
public class ProductAction {
private Integer id;
public void setId(Integer id) {//struts2透過反射技術呼叫與請求參數同名的屬性的setter方法來取得請求參數值
this.id = id;
}
public Integer getId() {return id;}
}
採用複合型別接收請求參數請求路徑: http://localhost:8080/test/view.action?product.id=78
public class ProductAction {
private Product product;
public void setProduct(Product product) { this.product = product; }
public Product getProduct() {return product;}
}
Struts2首先透過反射技術呼叫Product的預設建構器建立product物件,然後再透過反射技術呼叫product中與請求參數同名的屬性的setter方法來取得請求參數值。
十二、類型轉換的意義
對於一個智慧的MVC框架而言,不可避免的需要實現類型轉換.因為B/S(瀏覽器/伺服器)結構應用的請求參數是透過瀏覽器發送到伺服器的,這些參數不可能有豐富的資料類型,因此必須在伺服器端完成資料型別的轉換
MVC框架是一個表現層解決方案,理應提供類型轉換的支援,Struts2提供了功能非常強大的類型轉換支援.
十三、表現層資料的處理
對於web應用而言,表現層主要用於與用戶互動,包括收集用戶輸入數據,向用戶呈現伺服器的狀態。因此表現層的資料的流向主要有兩個方向:輸入資料和輸出資料。
對於輸入資料:則需要完成由字串資料轉換為多種類型資料的工作。程式通常無法自動完成,需要在程式碼中手動轉化
對於輸出資料:不管是java或是jsp都支援多種資料型別的直接輸出。
表現層另外一個資料處理是:資料校驗,分為客戶校驗和伺服器端校驗.後邊會重點講解
十四、類型轉換
HTTP參數都是字串類型。 保存的資料可能是字串、數字、布林、日期時間等或JavaBean類型。 手工的類型轉換,例如將字串轉換為日期,透過: 透過request.getParameter方法取得字串; 檢查是否為空; 透過DateFormat.parse方法將字串轉換為Date對象
十五、Struts2型轉換
Struts2內建的型別轉換
String和boolean 完成字串與布林值之間的轉換
String和char 往常字串與字元之間的轉換
String與int、Integer 完成字串與整數之間的轉換
String與Long 完成字串與長整數值之間的轉換
String與double、Double 完成字串與雙精確度浮點值的轉換
String和Float 完成字串和單精確度浮點之間的轉換
String和Date 完成字串和日期類型之間的轉換,日期格式使用格式使用者請求所在Locale的SHORT格式
String和陣列在預設的情況,陣列元素是字串,如果使用者定義類型轉換器,也可以是其它複合資料類型
String和Map、List
十六、Struts類型轉換的API
Struts2的類型轉換器其實是基於OGNL實現的,在OGNL專案中有一個ognl.TypeConverter介面,這個介面就是實現類型轉換器必須實現的介面。此介面定義如下:
public interface TypeConverter {
public Object convertValue(Map arg0, Object arg1, Member arg2, String arg3,
Object arg4, Class arg5) {
return null;
}
實作型別轉換器必須實作上面的TypeConverter,不過上面的介面裡的方法過於複雜,所以OGNL專案也提供了一個該介面實作類別:ognl.DefaultTypeConverter,透過繼承該類別實作自己型別轉換器.該類別定義如下:
public class DefaultTypeConverter extends Object implements TypeConverter{
public Object convertValue(Map<String,Object> context, Object value, Class toType) {
}
……//其他的方法
}
ConvertValue方法的作用該方法完成類型轉換,不過這種類型轉換是雙向的,當需要把字符串轉化對象實例時,通過該方法實現,當把對象實例轉換成字符串時也通過該方法實現。這種轉換是透過toType參數類型是需要轉換的目標類型。所以可以根據toType參數來判斷轉換方向。
ConvertValue方法參數與回傳意義第一個參數:context是型別轉換環境的上下文第二個參數:value是需要轉換的參數,根據轉換方向的不同value參數的值也是不一樣的。
第三個參數:toType是轉換後的目標類型該方法的回傳值是型別轉換後的值。該值的類型也會隨著轉換的方向的改變而改變。由此可見轉換的convertValue方法接受需要轉換的值,需要轉換的目標類型為參數,然後傳回轉換後的目標值
Value為什麼是一個字串陣列?
對於DefaultTypeConverter轉換器而言,它必須考慮到最通用的情形,因此他把所有請求參數都視為字串陣列而不是字串。相當於getParameterValues()取得的參數值