1. 由於在覈心配置文件(Struts2.xml)中,若是存在不少須要配置的Action項目,會顯得代碼數量驟增,同時核心配置文件極其臃腫.安全
因爲Struts2提供了相應的帶入功能,故將struts.xml配置文件分解成多個配置文件,而後在struts.xml文件中包含其餘配置文件便可。session
2. 導入位置,將struts-others.xml文件放在struts.xml同級目錄,在主配置文件中app
添加 <include file="struts-others.xml"></include> ,便可。框架
(注:<include 標籤與 <package 標籤同級)dom
3. 此時在struts-others.xml配置相關信息便可。jsp
Example:ide
console輸出結果:模塊化
<package ····· 主要是爲了模塊化管理post
1. <package name="default" namespace="/" extends="struts-default" abstract=""/> 測試
name:包名,在整個應用中不能重複;沒有實際意義;
namespace:包命名空間;用於訪問該包中action時額外加的路徑;
extends:繼承(必定要繼承),繼承其餘包的配置文件,才能使用鎖提供的功能
(在Struts2中,繼承至關於把哪一個包的所有代碼拷貝過來)
abstract:表明是抽象的包,用來被繼承的(示例見struts-default.xml中的某些包)
http://ip:port/<appContextPath>/<packageNamespace>/<actionName>[.action]
http://ip:端口/<上下文路徑>/<包的命名空間>/<action的名稱>[.後綴名]
注意的問題:
1.同一個包下面的Action名稱是不能重複的(意思就是不一樣包下的Action能夠重複)
2. 包的名稱(name)與包的命名空間(namespace)不可以相等
例:/path1/path2/path3/someAction
- 在/path1/path2/path3/中找包,而後從path3向上一層一層找,直到找到
- 若是每隔path*中都沒有找到,就會去’/’根目錄尋找
- 若是找到了包,就會在這個包裏面去找someAction
- 注:namespace = 「/」 根目錄OR根包
namespace = 「」 默認包
若是Action找到了,就直接使用;
當Action找不到的時候,就會嘗試到默認包(Struts2中所提供的)中來尋找.
1. Struts2框架按照以下順序加載struts2配置
注:若是多個文件配置了同一個struts2 常量,則後一個文件中配置的常量值會覆蓋前面文件配置的常量值
2. default.properties 中能夠找到咱們的常量配置,咱們能夠在struts.xml中配置常量
3. <action>中常量配置
<action...>中 class 能夠不寫
由於咱們的 package 繼承了 struts-default 包,struts-default 包中定了 <action> 默認的 class 屬性;
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
<action>標籤method能夠不寫,使用默認值:execute
<result>標籤name能夠不寫,使用默認值:success
<result>標籤type能夠不寫,使用默認值:dispatcher
經過
Map<String, Object> sess = ActionContext.getContext().getApplication(); HttpSession session = ServletActionContext.getRequest().getSession();
注:儘可能使用第一種(ActionContext.getContext(),由於起徹底脫離了ServletAPI)
使用實現接口,訪問Action時完成注入,正常狀況不使用.
1. dispatcher(默認使用的):請求轉發
2. redirect:重定向
3. redirectAction:重定向到某一個Action中
(a) redirectAction這種類型是給程序看的,讓咱們一看這個代碼就知道究竟是跳轉的是Action仍是普通的頁面。
(b) 若是跳轉在同一個包,咱們直接寫Action的名稱就能夠了
(c) 若是是跳轉到不一樣的包中,就要使用完整的寫法,它是把namespace與actionName分開寫的
(d) redirectAction能夠完成的,redirect均可以完成
(e) redirectAction若是要跳轉到其它包
<result name="success" type="redirectAction"> <param name="namespace">/sys</param> <param name="actionName">result2</param> </result>
4. 有不少Action要用相同的結果視圖的時候,咱們能夠作一個全局視圖
注意:全局視圖只能在包裏面
若是Action標籤中有一個配置與全局同樣,使用Action標籤中的視圖
<global-results> <result name="success" type="dispatcher">/success.jsp</result> </global-results>
1. 普通類-->訪問普通對象(有一個公共無參的構造方法
就是在<action中配置的method = 「方法名」
<action name="userAction01" class="全限定名" method="execute"></action>
2. 實現一個Action的接口(覆寫方法)(有幾個能夠直接返回的常量)(SUCCESS等)
public class UserAction02 implements Action{ public void 「方法名」(){return SUCCESS;} }
<action name="userAction02" class="全限定名"></action>
3. 繼承ActionSupport類(一個ActionSupport類,其也實現了來自Action的接口)
public class UserAction03 extends ActionSupport{ public Stringexecute(){return 「」;} }
<action name="userAction03" class="全限定名"></action>
1. 動態方法調用(在地址後加感嘆號!)
a) 好比:http://localhost/demo02/curd!update
注:要開啓動態調用的 <constant name="struts.enable.DynamicMethodInvocation" value="true" />
動態調用的安全性不高,Struts2中也不推薦使用
b) 使用通配符(*)
<action name=" method01_*" class="全限定名" method="{1}" ></action>
method01_*:全部method01_開頭的都會找到這個Action
method="{1}" :表明的就是第一個*
若是我訪問的時候使用 method01_save ,如今這個save就代替的*
method="{1}" ,它的這個{1}表明的就是第一個*,它的值就會變成save
若是咱們訪問execute這個方法,就能夠直接寫 http://localhost/method01 這種路徑,不須要加上下劃線
c) 多個通配符(*_*)
不建議使用。
1. 接受普通參數(若是參數不少就比較麻煩)
a) 在Action中聲明此參數: private String params;
b) 在下面提供此參數的setParams()方法: public void setParams (String params){ this. params = params;}
c) 而後就能夠在[execute()]方法中使用.
d) 例子:
Java文件實現:
1 //接收參數 2 public class ParamsAction01 extends ActionSupport{ 3 private String name; 4 private String password; 5 private String age; 6 7 public String execute(){ 8 System.out.println(name); 9 System.out.println(password); 10 System.out.println(age); 11 return NONE; 12 } 13 public void setName(String name) { 14 this.name = name; 15 } 16 public void setPassword(String password) { 17 this.password = password; 18 } 19 public void setAge(String age) { 20 this.age = age; 21 } 22 }
XML配置:
<package name="default" namespace="/" extends="struts-default"> <action name="params" class="cn.itsource._06_params.ParamsAction01"></action> </package>
JSP頁面:
<form action="/params" method="post"> 姓名:<input type="text" name="name" /> <br /> 密碼:<input type="password" name="password" /> <br /> 年紀:<input type="number" name="age" /> <input type="submit" value="...提交..." /> </form>
2. 利用對象來接受
a) 準備一個和頁面對應的Object對象,你如User類
b) 在Action中講User實例化(既private User user = new User())
c) 在Action中必須提供getUser()方法(緣由見下)
若是不在Action中講User實例化,則必須提供setUser(方法) a) (緣由見下)
d) Jsp頁面中<input 的名字 name = 「user.username」(「對象.屬性」)(規範)
e) 關於利用對象接受的處理流程:
1. 前臺傳了一個 user.name過來
a) Struts2會把它分紅兩部分:第一部分 user ,第二部分name
b) 看到user以後,
i. 先經過getUser() 這個方法去拿這個User
ii. 若是拿不到user,它會經過反射建立一個user對象,建立好以後,執行setUser()將這個User放過來(如今User就存在了)
iii. 若是拿到了這個user,就直接拿來使用而後調用user對象的setName()方法,將前臺傳過來的值放進去(name就有值了)
User對象存在,name中有值
2. 重複以上步驟(前臺傳了一個 user.password...過來)
f) 例子:
1 <!-- 頁面內容: --> 2 <form action="/demo03/params2" method="post"> 3 用戶名:<input type="text" name="user.name" /><br /> 4 密碼:<input type="text" name="user.password" /><br /> 5 年紀:<input type="number" name="user.age" /><br /> 6 日期:<input type="text" name="user.bornDate" /><br /> 7 性別:<input type="radio" name="user.sex" value="true">男 8 <input type="radio" name="user.sex" value="false">女<br /> 9 <input type="submit" value="提交" /> 10 </form>
1 //Action內容: 2 private User user = new User(); 3 public User getUser() { 4 return user; 5 } 6 @Override 7 public String execute() throws Exception { 8 System.out.println(user); 9 return null; 10 }
1 //domain 2 public class User { 3 private String name; 4 private String password; 5 private Integer age; 6 private Date bornDate; 7 private Boolean sex; 8 //這裏必須提供getter,setter代碼 9 }
3. 在Action中實現ModelDriver<T>接口(T爲泛型),並在Action提供一個getModel()方法
a) 與第二種相比,好處在於,jsp頁面的時候,能夠不用在<input 的name中添加類名前綴,如:user.username 能夠改爲username.
b) 示例:
1 public class Requestrecept extends ActionSupport implements ModelDriven<User> { 2 User user = new User(); 3 @Override 4 public String execute() throws Exception { 5 System.out.println(user); 6 return NONE; 7 } 8 @Override 9 public User getModel() { 10 return user; 11 } 12 }
參數接受總結
a) 第一種能夠和第二種OR第三種配合使用,既1+2 OR 1+3 ;
b) 第三種只有肯定一個Action只封裝一個對象時,推薦使用.由於他只能封裝一個 Object.
c) 正常狀況使用第二種,配合第一種使用,代碼可維護性強,易於修改添加和測試.
另外,轉載請留言。多謝。