Struts2 框架使用 核心以及其餘詳細配置

 

由於在使用SSH框架的過程,關於struts2的配置比較繁瑣,因此作個總結。

 

1、導入而且關聯其餘XML

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輸出結果:模塊化

  

 

 

2、關於struts.xml中package包

   <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)不可以相等

 

3、Struts2包的查找過程OR相應規則

例:/path1/path2/path3/someAction

  1. /path1/path2/path3/中找包,而後從path3向上一層一層找,直到找到
  2. 若是每隔path*中都沒有找到,就會去’/’根目錄尋找
  3. 若是找到了包,就會在這個包裏面去找someAction
  4. 注:namespace = 「/」 根目錄OR根包

namespace = 「」  默認包

若是Action找到了,就直接使用;

當Action找不到的時候,就會嘗試到默認包(Struts2中所提供的)中來尋找.

 

4、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

 

 

5、SevletAPI的獲取

經過

 

Map<String, Object> sess = ActionContext.getContext().getApplication(); HttpSession session = ServletActionContext.getRequest().getSession();

 

注:儘可能使用第一種(ActionContext.getContext(),由於起徹底脫離了ServletAPI)

   使用實現接口,訪問Action時完成注入,正常狀況不使用.

 

6、Struts2的返回類型

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>

 

7、方法調用

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> 

 

 

8、Struts2多方法配置

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) 多個通配符(*_*)

    不建議使用。

 

9、Struts2接收參數

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) 正常狀況使用第二種,配合第一種使用,代碼可維護性強,易於修改添加和測試.

 

   另外,轉載請留言。多謝。

相關文章
相關標籤/搜索