在配置struts攔截器時,如果除了核心攔截器外還有其他攔截器,其他攔截器需要放在覈心攔截器之前。
Struts2中action開發的幾種方式
1).繼承ActionSupport
package cn.test.user;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//Action中業務邏輯處理方法
public String
login(){
return "success";
}
}
2).實現Action接口,重寫execute()方法
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}
package cn.test.user;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action{
//Action中業務邏輯處理方法
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "success";
}
}
3).不實現任何接口,也不繼承類。
Struts的功能是通過攔截器來實現的,不實現接口或者類,也不會影響到其數據自動封裝的功能
package cn.test.user;
import com.opensymphony.xwork2.Action;
public class UserAction implements Action{
//Action中業務邏輯處理方法
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
// TODO Auto-generatedmethod stub
System.out.println(name);
return "success";
}
}
Struts2的通配符
在同一個Action中有多個業務方法返回同一個值或者頁面的配置方法
可以使用通配符來配置
<action name="user_*"class="cn.test.user.UserAction" method="{1}">
<result name="success">login.jsp</result>
</action>
*代表uer_之後輸入的字符串,被填充到{1}中進行查找,找不到則報錯
<action name="user_*"class="cn.test.user.UserAction" method="{1}">
<result name="{1}">{1}.jsp</result>
</action>
通配符可以在struts配置信息中用來優化配置,可以在action中任何一個地方使用。
Struts中路徑匹配原則:
訪問路徑 = 協議+主機名+端口號+應用程序名 + 名稱空間 + 對外訪問路徑
如果沒有名稱空間,默認爲/
Struts2訪問路徑解析
Struts2項目訪問路徑http://localhost:8080/struts02/user/a/b/user_login在服務器上的解析過程
服務器
查看協議:http
解析主機:localhost
解析端口號:8080
解析訪問的項目資源名稱:struts02
解析出要訪問的資源名稱:user_login
查看名稱空間:user/a/b是否存在,如果不存在這個名稱空間,則繼續向下找
如果存在,則在該名稱空間中查找名字爲user_login的action
查看名稱空間:user/a 是否存在,如果不存在這個名稱空間,則繼續向下找
如果存在,則在該名稱空間中查找名字爲user_login的action
查看名稱空間:user 是否存在,如果不存在這個名稱空間,則繼續向下找
如果存在,則在該名稱空間中查找名字爲user_login的action
查看名稱空間:/
如果還沒有找到,就報錯。
如果存在,則在該名稱空間中查找名字爲user_login的action
如果找到其中一個對應的名稱空間,則返回,並獲取類來響應用戶的請求。
Struts中的常量
Struts的默認訪問後綴名:
Struts1中默認訪問後綴名是:*.do;
Struts2中默認訪問後綴名是:*.action;
編碼之前,必須知道編碼規則。
修該struts的訪問後綴
1. struts2的.action後綴定義在哪裏?
Struts-core-2.3.4.1.jar/org.apache.struts/default.properties
2. 修改struts2的訪問後綴
<constant name="struts.action.extension"value="action,,"></constant>
多個訪問後綴名稱之間用英文逗號隔開
一般來說,任何一個框架的常用配置文件,都會放在其包文件的根目錄下或者第一個包目錄中。對於所有應用都是用的配置,一般會放在全局變量中。
其他常量:
指定默認編碼集,作用於HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的輸出
<constant name="struts.i18n.encoding"value="UTF-8"/>
自定義後綴修改常量
<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"/>
Struts2動態方法的調用:
<!—-開啓動態方法的調用-->
<constant name="struts.enable.DynamicMethodInvocation"value="true"></constant>
<!—-在總配置文件中引入其他struts文件-->
<include file="/cn/test/user/config/actionstruts.xml">
</include>
在struts訪問路徑中,如果出現兩個相同的訪問路徑,後面的訪問路徑會覆蓋前面的訪問路徑。
<!-- 動態方法調用
訪問方式:
http://localhost:8080/struts02/user!login
協議://主機名:端口號/項目名/actionName!需要訪問的方法
-->
<action name="user"class="cn.test.user.config.UserAction" >
<result name="success">login.jsp</result>
</action>
不建議使用動態方法調用
全局配置的常量,應該單獨放在一個struts文件中去配置和維護,在總配置文件中引入這個文件即可。
全局視圖
對於多個action返回同一個結果,也可以同過全局視圖的方式配置來跳轉結果。
<global-results>
<result name="success">/success.jsp</result>
</global-results>
在返回同一個結果的action中,不必再配置這個跳轉結果。如果在某一個action中配置了跳轉結果,則會覆蓋全局視圖配置的跳轉結果。在查找跳轉結果是,會先查找action中配置的跳轉結果,如果當前action沒有配置,則會到全局視圖中去查找對應的頁面,如果全局視圖中也沒有找到跳轉結果配置,則會報錯。
全局視圖的配置,必須在action配置之前。
配置各項默認值
1. 在struts的action中默認執行的業務邏輯方法是execute()方法
<action name="login"
class="cn.test.action.HelloAction" >
</action> 中method的默認值是execute
2.action中沒有配置class時,默認值爲com.opensymphony.xwork2.ActionSupport
<action name="login">
</action>
執行的是action在struts-default中的配置
<default-class-ref calss=”com.opensymphony.xwork2.ActionSupport”/>
默認執行的方法是execute()方法,返回值爲success,對應的頁面在全局視圖配置中去找。
重定向跳轉不到項目的web-inf目錄下的資源。但是轉發可以跳轉到web-inf目錄下的資源。
Web-inf中放置的是資源文件,一般不允許客戶直接訪問。
在action中可以通過type來配置轉發或者重定向。
什麼情況下不配置action的class?
答案:當只是需要跳轉到web-inf下的資源時,可以不配置class。type的默認值爲forward