初識Struts2

ZYXS發表於2019-05-26

  今天來總結一下Struts2的知識點,學習程式設計我的思路一般是這樣的:

    ① why ?為什麼要學這個技術(有什麼優秀的地方,可以解決哪些問題?)。

    ②what ? 這個技術是什麼玩意?有什麼牛逼的地方值得我們學習,這個技術的核心是什麼。

    ③How ?  怎麼學?基本技術都是自己自學的,我的學習思路就是,看視訊,拿例子來學習知識,在敲程式碼的過程中理解問題。在此期間如果遇到不懂得或者是感覺很模糊的地方,及時的上網找相應的部落格進行理解。基本上就是在敲程式碼中學習技術。並且對技術要及時的進行總結,但是我不推薦一個知識點總結一次,這樣根本沒有那麼多的時間,最好的是看完之後,從全域性出發,對整個知識進行積累和總結,在總結的過程中,多看一下其他人的部落格,集思廣益,收穫會很大。

    ④Do !  做!做是什麼?是理論到實踐的必經之路,是你成為大牛的必經之路,找個專案,認真的做完,對一些常用的技巧和方法進行歸納整理,釋出到自己的部落格上,在做專案的時候,有很多的途徑,我最喜歡 的是看視訊了,只要你前面沒偷懶,認真的學習了,在這個時候你就會發現都是so easy的事情。在做專案的時候,要注意的是,遇到不會的,或者是有新的理解一定要去探索,這樣會知道的越來越多,同時為了防止遺忘,及時的對部落格進行更新,或許你遇到的問題也可能是別人遇到的,這樣你的人氣值就上來了!

  比如對Struts2 的學習。其實大約一週前就學完了,但是懶癌犯了,懶得動,一直拖著沒整理。因此提醒大家:當日事,當日畢!當日事,當日畢!當日事,當日畢!因為明天還有很多事情要做......

  在沒有進行Struts2 的學習之前,我用jsp+Servlet+javaBean+mysql+Jdbc+(bootStrap/EasyUi/Layui)開發了5個說大不大說小不小的狗屁專案,那tm寫的叫一個累啊......但是很爽啊,哈哈哈,因為要實現一個方法比如說分頁,那基本上就可以從底幹到頂,熟悉整個流程。印象很深的一個功能是檔案上傳和下載,如果使用Struts那簡直簡單的.....超級爽啊。但是沒學這個之前,我tm累的和狗一樣,還是學習了別人的部落格,自己加以改造,成功實現了資料庫mysql存檔名,伺服器儲存檔案,對檔案能夠進行上傳和下載。雖然累但是對這部分功能還是瞭解的比較好了。框架確實好,用起來很爽。但是我還是喜歡研究基礎的東西,這樣在學別的框架那就是輕車熟路了。話不多說我們開始對Struts2進行剝皮抽筋的解剖整理。我接下來將主要從以下幾個方面進行總結:

  1. Struts2是什麼玩意?核心?主要的功能?
  2. Struts2的核心知識;
  3. Struts2牛逼的攔截器,臥槽這才是最牛的核心!
  4. Struts2的值棧和OGNL牛逼啊!
  5. Struts2的標籤三大類是什麼?
  6. Struts2的國際化有哪些東西啊?
  7. Struts2的驗證框架簡單嗎?
  8. Struts2檔案上傳和下載為什麼如此簡單?
  9. Struts2防止重複提交做的努力?
  10. Struts2的小技巧(持久跟新......

          一  Struts2是什麼玩意?核心?主要的功能?                 

Struts2在使用者請求、模組化處理方面、頁面展示表現的很牛逼。

 

  應用基本處理流程Web容器在接收到HttpServletRequest請求傳遞給一個過濾器ActionContextCleanUp,之後經過Otherfiters。接下來呼叫FilterDispatcher核心控制器,其通過呼叫ActionMapper確認請求的是哪一個Action.ActionMapper返回一個收集Action詳細資訊的ActionMaping物件。

之後ActionProxy獲得FliterDispatcher傳遞來的控制權,ActionProxy呼叫配置管理器(Configuration Manager)從配置檔案struts.xml讀取到配置資訊。之後建立ActionInvocation物件,ActionInvocation在呼叫Action之前依次的呼叫所用的配置攔截器(Interceptor N),一旦執行結果返回結果字串ActionInvocation負責查詢結果字串對應的(Result)然後執行Result,同時Result可以呼叫一些模板(Jsp,FreeMarker,Velocity或者是其他的)來呈現頁面。

  在呼叫攔截器之後,我們進入攔截器(Interceptor N)會被執行(順序與Action執行之前相反)。之後響應(HttpServletResponse)被返回在web.xml中的配置的那些過濾器和核心控制器(FilterDispatcher)。

 

 

 

 

 

  下面我們以一個實際的例子進行講解。首先我們進行Struts2版本的HelloWorld的實現過程。

一 新建一個Dynamic web Project專案

第一步:File->New->Other->在搜尋框裡面搜尋Dynamic Web Project.

 

 

 

 

 

 

 

 

 

 

 

第二步:之後新建一個Web的專案(選擇Dynamic web module Version2.5) 完成之後finish

 

二  引入必須的jar包

對於使用Struts2需要引入一些核心的jar包,其中的所需的jar包如圖1-1所示:

  

1-1 核心jar包(放在lib資料夾中)

三 配置過濾器(web.xml檔案中)

  web.xml進行配置,主要是配置過濾器,將所有的請求全部交給org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter核心控制器處理。配置內容如下;

 

 1 <filter>
 2     <filter-name>Struts2</filter-name>
 3     <filter-class>
 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
 5 </filter-class>
 6 </filter>
 7 <filter-mapping>
 8     <filter-name>Struts2</filter-name>
 9     <url-pattern>/*</url-pattern>
10 </filter-mapping>

 

  通過配置攔截器地址(<filter-mapping></filter-mapping),<url-pattern>/*</url-pattern>將所有的HttpServletReqeust請求全部交給了名字叫做Struts2的攔截器(<filter-name>Struts2</filter-name>)進行處理,在前面的<filter></filter>攔截器,定義的名為Struts2攔截器(<filter-name>Struts2</filter-name>)被捕獲,進而呼叫了定義的攔截器類<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>進行處理。

四  配置Struts.xml檔案

   struts.xml檔案中必須的內容:

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
將struts.xml檔案放在預設的src下。如圖1-2所示:

1-2 struts檔案存放

 

五、建立HelloWorldAction類,並在struts中進行配置。

建立一個HelloWorldAction類,放在yxs.Action包下。在HelloWorldAction類中生成預設的 execute()方法。具體程式碼如下:

 1  public class HelloWorldAction implements Action{
 2           /* (non-Javadoc)
 3            * @see com.opensymphony.xwork2.Action#execute()
 4 */
 5           @Override
 6           public String execute() throws Exception {
 7               // TODO Auto-generated method stub
 8               System.out.println("執行了Action的預設構造方法!");
 9               return SUCCESS;
10          }
11  }

該類實現了Action介面,execute方法返回SUCCESSstruts.xml中進行配置:

 1 <struts>
 2 <!-- 預設繼承自struts-default包 -->
 3     <package name="helloWorld" extends="struts-default">
 4 <!-- 如果前端訪問hello方法,就會呼叫yxs.Action.HelloWorldAction類 -->
 5         <action name="hello" class="yxs.Action.HelloWorldAction">
 6         <!-- HelloWorldAction類如果返回success引數(SUCCESS就是success),就會呼叫helloWorld.jsp模板進行顯示 -->
 7             <result name="success">helloWorld.jsp</result>
 8         </action>
 9     </package>
10 </struts>

六 建立helloWorld.jsp,部署tomcat實現HelloWorld

helloWorld.jsp檔案程式碼如下:

 1 </html>
 2 <%@ page language="java" contentType="text/html; charset=utf-8";pageEncoding="utf-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>struts2 HelloWorld!</title>
 8 </head>
 9 <body>
10     HelloWorld!struts2超級牛逼啊!
11 </body></html>

啟動tomcat,在位址列訪問localhost:8080/Struts2Chap01/hello即可顯示效果如圖1-3

1-3 顯示效果

七 抽絲剝繭,分析如何執行

  首先在web容器中,傳送HttpServletRequest請求(localhost:8080/Struts2Chap01/hello),通過web.xml配置檔案,我們的過濾器將所有的請求都交給了org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 核心控制器(期間經過了過濾器ActionContextCleanUp,FilterDispatcher...)處理,通過ActionProxy呼叫配置管理器(Configuration Manager),讀取配置檔案struts.xml的配置資訊。之後建立ActionInvocation物件,經過配置攔截器呼叫Action<action name="hello" class="yxs.Action.HelloWorldAction">)方法,讓HelloWorldAction類處理,HelloWorldAction類中的execute方法return SUCCESS,執行結果返回結果字串SUCCESS,ActionInvocation負責查詢結果字串對應的(Result)然後執行Result.<result name="success">helloWorld.jsp</result>,根據返回的結果為success,Result呼叫HelloWorld.jsp來呈現頁面。在頁面上顯示:   HelloWorld! struts2超級牛逼啊!

據此我們可以總結一下:

在使用Struts2的時候,我們需要做的是

(1)實現Action類,完成struts.xml配置,主要是對前端請求方法安排響應的action處理,根據返回的結果跳轉到不同的頁面。

(2)攔截器的配置和使用。

(3)顯示模板的建立。

個人認使用struts的核心在於攔截器的操作,對攔截器進行配置和使用可以實現很牛逼的操作,而且struts本身預設的攔截器棧中就實現了很多牛逼的功能。

             二      Struts2的核心知識                           

一、Struts2 get/set自動獲取/設定資料

  比如說我們在Action類中設定了自己的屬性,生成了get/set方法。在頁面中,如果設定或者獲取屬性,struts2就會自動呼叫get()/set()方法對資料處理。例如:

HelloWorldAction.java檔案中程式碼如下:

 1 package com.java1234.Action;
 2 import com.opensymphony.xwork2.Action;
 3 public class HelloWorldAction implements Action{
 4     private String name;//設定自己的name屬性
 5 //生成get set方法
 6     public String getName() {
 7         return name;
 8     }
 9     public void setName(String name) {
10         this.name = name;
11     }
12     /* (non-Javadoc)
13      * @see com.opensymphony.xwork2.Action#execute()
14      */
15     @Override
16     public String execute() throws Exception {
17         // TODO Auto-generated method stub
18         System.out.println("呼叫了Action的預設方法!");
19         return SUCCESS;
20     }
21 }

②在struts.xml中的配置如下:

1 <struts>
2     <package name="helloWorld" extends="struts-default">
3         <action name="hello" class="com.java1234.Action.HelloWorldAction">
4             <result name="success">helloWorld.jsp</result>
5         </action>
6     </package>
7 </struts>

③helloWorld.jsp中程式碼如下:

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10   hello  ${name}
11 </body>
12 </html>

④在瀏覽器中訪問;

http://localhost:8080/Struts2Chap02/hello?name=java

⑤流程:

前端訪問hello?name=”java”,這個時候會呼叫HelloWorldAction.java中的setName()方法,將name的值設定為java.之後Jsp頁面訪問hello ${name},想要獲取name元素的值,會呼叫getName()方法,將name 的輸出。

二 Struts2  Action設定資料

基本資料型別屬性:見:   一、Struts2 get/set自動獲取/設定資料

JavaBean型別屬性:

  採用javaBean模式,可以很方便的進行設定資料。例如我們設定一個簡單的登入驗證系統。

 1 public class User {
 2     private String name;
 3     private String password;
 4     public String getName() {
 5         return name;
 6     }
 7     public void setName(String name) {
 8         this.name = name;
 9     }
10     public String getPassword() {
11         return password;
12     }
13     public void setPassword(String password) {
14         this.password = password;
15     }
16 }

Action層的UserAction.java

 1 public class UserAction extends ActionSupport{
 2     private String userName;
 3     private String userPassword;
 4     UserService userService =new UserService();
 5     
 6     public void setUserName(String userName) {
 7         this.userName = userName;
 8     }
 9 
10     public void setUserPassword(String userPassword) {
11         this.userPassword = userPassword;
12     }
13 
14     private static final long serialVersionUID = 1L;
15 
16     @Override
17     public String execute() throws Exception {
18         // TODO Auto-generated method stub
19         User user=new User();
20         user.setName(userName);
21         user.setPassword(userPassword);
22         if(userService.login(user)){
23             return SUCCESS;
24         }else{
25             return ERROR;
26         }
27     }
28 }

 

  在這個類中,我們設定了和login.jspuserNameuserPassword一樣的屬性名,到Action中方便設定和獲取屬性值。

 

Servie驗證:

 

1 public class UserService {
2     public boolean login(User user){
3         if("java".equals(user.getName()) && "123456".equals(user.getPassword())){
4             return true;
5         }else{
6             return false;
7         }
8     }
9 }

Struts.xml配置:

1 <struts>
2     <package name="helloWorld" extends="struts-default">
3         <action name="user" class="com.java1234.Action.UserAction">
4             <result name="success">success.jsp</result>
5             <result name="error">error.jsp</result>
6         </action>
7     </package>    
8 </struts>

  根據返回的結果進行跳轉:如果成功進入success.jsp 否則進入error.jsp中。

Login.jsp檔案:

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10   <form action="user" method="get">
11       使用者名稱:<input type="text" id="userName" name="userName"></input>
12       密碼:  <input type="password" id="userPassword" name="userPassword">
13         <input type="submit" value="提交">
14   </form>
15 </body>
16 </html>

Success.jsp

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 登陸成功!
11 </body>
12 </html>

error.jsp

 1 <%@ page language="java" contentType="text/html; charset=utf-8"
 2     pageEncoding="utf-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 登入失敗!
11 </body>
12 </html>
13 另一種思路:
14 Login.jsp程式碼變為:
15  <form action="user2" method="get">
16       使用者名稱:<input type="text" id="user.name" ></input>
17       密碼:  <input type="password" id="user.password" >
18         <input type="submit" value="提交">
19 </form>

UserAction程式碼:

 1 public class UserAction2 extends ActionSupport{
 2 
 3     /**
 4      * javabean模式!
 5      */
 6     private User user;
 7     private UserService userService;
 8     public User getUser() {
 9         return user;
10     }
11 
12     public void setUser(User user) {
13         this.user = user;
14     }
15     private static final long serialVersionUID = 1L;
16 
17     @Override
18     public String execute() throws Exception {
19         // TODO Auto-generated method stub
20         if(userService.login(user)){
21             return SUCCESS;
22         }else{
23             return ERROR;
24         }
25     }
26 }

綜合以上的內容:   我們推薦使用物件名.屬性名的方式。可以節省Action中的複雜度。

三 Struts2 處理傳入多個值

(1)處理數目不定的字串;

一般來說我們直接在可以使用陣列來進行處理。以hobby(愛好來舉例子)例如:hobby.jsp中的我們可以選擇多個自己喜歡的愛好,那麼怎麼將這些資料傳到後臺呢?

 

基本流程:Action=hobby------>struts.xml-------->com.java1234.Action.HobbyAction

hobby.jsp

1 <form action="hobby" method="post">
2         愛好的語言:<input type="checkbox" name="hobby" value="java">java
3                 <input type="checkbox" name="hobby" value="C++">C++
4                 <input type="checkbox" name="hobby" value="C">C
5                 <input type="checkbox" name="hobby" value="javaScript">javaScript
6                 <input type="checkbox" name="hobby" value="scale">scale
7         <input type="submit" value="提交"> 
8     </form>

struts.xml

1 <struts>
2     <package name="hobby" extends="struts-default">
3         <action name="hobby" class="com.java1234.Action.HobbyAction">
4             <result name="success">success.jsp</result>
5         </action>
6     </package>
7 </struts> 

com.java1234.Action.HobbyAction程式碼如下:

 1 public class HobbyAction extends ActionSupport{
 2     private static final long serialVersionUID = 1L;
 3     public String[]hobby;
 4     public String[] getHobby() {
 5         return hobby;
 6     }
 7     public void setHobby(String[] hobby) {
 8         this.hobby = hobby;
 9     }
10     @Override
11     public String execute() throws Exception {
12         for(String h:hobby)  System.out.print(h+" ");
13         return SUCCESS;
14     }
15 }

(2)處理數目不定的javaBean物件;  

我們一般使用物件集合處理:List  建立javaBean

Student.java程式碼如下:

 1 public class Student {
 2     private String name;   private String sex;    private int age;
 3     public String getName() {
 4         return name;
 5     }
 6     public void setName(String name) {
 7         this.name = name;
 8     }
 9     public String getSex() {
10         return sex;
11     }
12     public void setSex(String sex) {
13         this.sex = sex;
14     }
15     public int getAge() {
16         return age;
17     }
18     public void setAge(int age) {
19         this.age = age;
20     }
21     @Override
22     public String toString() {
23         return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
24     }
25 }

Student.jsp程式碼:

 1 <form action="student"method="post">
 2     <table><tr>
 3                 <th>姓名</th>
 4                 <th>性別</th>
 5                 <th>年齡</th>
 6     </tr>
 7 <tr>
 8     <td><input type="text" name="students[0].name"></input></td>
 9     <td><input type="text" name="students[0].sex"></input></td>
10     <td><input type="text" name="students[0].age"></input></td>
11 </tr>
12 <tr>
13     <td><input type="text" name="students[1].name"></input></td>
14     <td><input type="text" name="students[1].sex"></input></td>
15     <td><input type="text" name="students[1].age"></input></td>
16 </tr>
17 <tr>
18     <td colspan="3">
19         <input type="submit" value="提交">
20     </td>
21 </tr>
22 </table>
23 </form>

struts.xml檔案:

1 <struts>
2     <package name="hobby" extends="struts-default">
3         <action name="student" class="com.java1234.Action.StudentAction">
4             <result name="success">success.jsp</result>
5         </action>
6     </package>
7 </struts>

com.java1234.Action.StudentAction程式碼如下:

 1 public class StudentAction extends ActionSupport{
 2     private static final long serialVersionUID = 1L;
 3     public List<Student>students;
 4     public List<Student> getStudents() {
 5         return students;
 6     }
 7     public void setStudents(List<Student> students) {
 8         this.students = students;
 9     }
10     @Override
11     public String execute() throws Exception {
12             for(Student student:students) { 
13                 System.out.println(student);
14             }
15         return SUCCESS;
16     }
17 }

四、struts.xml 配置

這部分主要是對struts.xml檔案進行配置,主要內容:

(1) pageckage 配置 

name 包名 (可以用來區分不同的模組,在前後端分離的時候可以實現不同的包下面存放不同的類)

 1 <struts>
 2   <package name="foregroud" namespace="/fore" extends="struts-default">
 3     <action name="studentList" class="com.java1234.Action.ForeAction">
 4       <result  name="success"> ${pageContext.request.contextPath}/success.jsp</result>
 5     </action>
 6   </package>
 7   <package name="backgroud" namespace="/back" extends="struts-default">
 8     <action name="studentList" class="com.java1234.Action.BackAction" method="show">
 9         <result name="success">${pageContext.request.contextPath}/success.jsp</result>
10     </action>
11   </package>
12 </struts>

extends 繼承

  extends="struts-default" 預設繼承自struts-default包

namespace 包名稱空間

  用來在前臺訪問地址的的時候進行區分。

abstract 抽象包

  主要是用作攔截器,讓其他的包去繼承,實現功能! <package name=”xxx”,abstract=”true”>

(2) action 配置 

  name action 名  方法名

  class 處理類   處理的類名從包名開始寫

  method 方法     規定的處理的方法

(3) 分模組配置方法 

  可以設定不同的xml檔案處理不同的請求。

 1 Struts.xml檔案程式碼:
 2 <struts>
 3         <include file="cheliang.xml"></include>
 4 <include file="zichan.xml"></include>
 5 </struts>
 6 Cheliang.xml 
 7 <struts>
 8 <package name="cheliang" namespace="/cheliang" extends="struts-default">
 9 <action name="cheliang" class="com.java1234.Action.CheLiangAction">
10     <result name="success">
11 ${pageContext.request.contextPath}/success.jsp
12 </result>
13 </action>
14 </package>
15 </struts>

(4)使用萬用字元     

我們以學生和成績為例,進行分析:

Struts.xml配置檔案:

 1  <struts>
 2     <package name="manage"  namespace="/" extends="struts-default">
 3     <action name="student_*" class="com.java1234.Action.StudentAction" method="{1}">
 4             <result name="success">success.jsp</result>
 5     </action>
 6     <action name="grade_*" class="com.java1234.Action.GradeAction" method="{1}">
 7             <result name="success">success.jsp</result>
 8     </action>    
 9 //合併以上兩個操作!需要將位址列中href=“student_list”首字母大寫,因為是//{1}Action.
10 <!-- <action name="*_*" class="com.java1234.Action.{1}Action" method="{2}">
11             <result name="success">success.jsp</result>
12     </action>
13  -->
14     </package>
15 </struts>

前端頁面index.jsp

 1 <body>
 2     <h1>萬用字元</h1>
 3         <a href="student_list" target="_blank">學生資訊查詢</a>&nbsp;
 4         <a href="student_add" target="_blank">學生資訊新增</a>&nbsp;
 5         <a href="student_update" target="_blank">學生資訊修改</a>&nbsp;
 6         <a href="student_delete" target="_blank">學生資訊刪除</a>&nbsp;
 7     <br/><br/>
 8         <a href="grade_list" target="_blank">班級資訊查詢</a>&nbsp;
 9         <a href="grade_add" target="_blank">班級資訊新增</a>&nbsp;
10         <a href="grade_update" target="_blank">班級資訊修改</a>&nbsp;
11         <a href="grade_delete" target="_blank">班級資訊刪除</a>&nbsp;
12 </body>
13 </html>

GradeAction程式碼:

 1 public class GradeAction extends ActionSupport{
 2     private String name;
 3     public String getName() {
 4         return name;
 5     }
 6     public void setName(String name) {
 7         this.name = name;
 8     }
 9     private static final long serialVersionUID = 1L;
10     public String list() throws Exception {
11         System.out.println("班級查詢!!");
12         name="班級查詢";
13         return SUCCESS;
14     }
15     public String add()throws Exception{
16         System.out.println("班級新增");
17         name="班級新增";
18         return SUCCESS;
19     }
20     public String update()throws Exception{
21         System.out.println("班級修改");
22         name="班級修改";
23         return SUCCESS;
24     }
25     public String delete()throws Exception{
26         System.out.println("班級刪除");
27         name="班級刪除";
28         return SUCCESS;
29     }
30 }

StudentAction程式碼:

 1 public class StudentAction extends ActionSupport{
 2     private static final long serialVersionUID = 1L;
 3     private String name;
 4     public String getName() {
 5         return name;
 6     }
 7     public void setName(String name) {
 8         this.name = name;
 9     }
10     public String list()throws Exception{
11         System.out.println("學生查詢!");
12         name="學生查詢";
13         return SUCCESS;
14     }
15     public String add()throws Exception{
16         System.out.println("學生新增");
17         name="學生新增";
18         return SUCCESS;
19     }
20     public String update()throws Exception{
21         System.out.println("學生修改");
22         name="學生修改";
23         return SUCCESS;
24     }
25     public String delete()throws Exception{
26         System.out.println("學生刪除");
27         name="學生刪除";
28         return SUCCESS;
29     }
30 }

五、動態方法呼叫

Struts.xml配置

 1 <struts>
 2     <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>//啟用動態方法
 3     <package name="manage"  namespace="/" extends="struts-default">
 4         <action name="student" class="com.java1234.Action.StudentAction">
 5             <result name="success">success.jsp</result>
 6         </action>
 7         <action name="grade" class="com.java1234.Action.GradeAction" >
 8             <result name="success">success.jsp</result>
 9         </action>
10     </package>
11 </struts>

前端頁面index.jsp

 1 <body>
 2     <h1>動態方法呼叫!</h1>
 3         <a href="student!list" target="_blank">學生資訊查詢</a>&nbsp;
 4         <a href="student!add" target="_blank">學生資訊新增</a>&nbsp;
 5         <a href="student!update" target="_blank">學生資訊修改</a>&nbsp;
 6         <a href="student!delete" target="_blank">學生資訊刪除</a>&nbsp;
 7     <br/><br/>
 8         <a href="grade!list" target="_blank">班級資訊查詢</a>&nbsp;
 9         <a href="grade!add" target="_blank">班級資訊新增</a>&nbsp;
10         <a href="grade!update" target="_blank">班級資訊修改</a>&nbsp;
11         <a href="grade!delete" target="_blank">班級資訊刪除</a>&nbsp;
12 </body>

  使用action名!方法名格式可以簡化很多操作。

六  Result配置

  

結合例項我們觀察一下: 前端index.jsp程式碼:

index.jsp程式碼:

1 <body>
2     <a href="hello?name=struts2" target="_blank">預設內部轉發!</a>//可以取得引數
3     <a href="hello!r?name=struts2" target="_blank">redirect重定向轉發!</a>//引數丟失
4     <a href="hello!c?name=struts2" target="_blank">chain鏈條轉發</a>
5     <a href="hello!ra?name=struts2" target="_blank">重定向到Action</a>
6     <a href="hello" target="_blank">全域性result資訊</a>
7 </body>

Struts.xml程式碼:

 1 <struts>
 2  <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
 3     <package name="manage"  namespace="/" extends="struts-default">
 4         <global-results>
 5             <result name="error">error.jsp</result>
 6         </global-results>
 7         <action name="hello" class="com.java1234.Action.HelloAction">
 8             <result name="success">success.jsp</result>
 9             <result name="r" type="redirect">success.jsp</result>
10             <result name="c" type="chain">hello2</result>
11             <result name="ra" type="redirectAction">hello2</result>
12         </action>
13         <action name="hello2" class="com.java1234.Action.HelloAction2">
14             <result name="success">success.jsp</result>
15         </action>
16     </package>    
17 </struts>

HelloAction程式碼:

 1 public class HelloAction extends ActionSupport{
 2     private String name;
 3     private String error;
 4     public String getName() {
 5         return name;
 6     }
 7     public void setName(String name) {
 8         this.name = name;
 9     }
10     public String getError() {
11         return error;
12     }
13     public void setError(String error) {
14         this.error = error;
15     }
16     private static final long serialVersionUID = 1L;
17     public HelloAction() {
18         System.out.println(this);
19     }
20     @Override
21     public String execute() throws Exception {
22         // TODO Auto-generated method stub
23         if("".equals(name)||name==null){
24             this.error="name為空!";
25             return ERROR;
26         }
27         return SUCCESS;
28     }
29     public String r()throws Exception{
30         return "r";
31     }
32     public String c()throws Exception{
33         return "c";
34     }
35     public String ra()throws Exception{
36         return "ra";
37     }
38 }

HelloAction2程式碼:

 1 public class HelloAction2 extends ActionSupport{
 2     private String name2;
 3     public String getName2() {
 4         return name2;
 5     }
 6     public void setName2(String name2) {
 7         this.name2 = name2;
 8     }
 9     private static final long serialVersionUID = 1L;
10 
11     public HelloAction2() {
12         this.name2="你好啊!我是Action2";
13     }
14 
15     @Override
16     public String execute() throws Exception {
17         // TODO Auto-generated method stub
18         return SUCCESS;
19     }
20 }

success.jsp程式碼:

1 <body>
2     Name:${name}<br/>
3     <h4>驗證chain和redirectAction,其他的方法不必關注Name2的值</h4>
4     Name2:${name2}
5 </body>

error.jsp程式碼:

1 <body>
2     錯誤資訊: ${error}<br/>
3 </body>

觀察結果:

訪問index.jsp

 

 

  其中預設內部轉發:引數可以被獲取;

 

  Redirect重定向轉發!引數不能被獲取 ;

           

Chain鏈條轉發,引數可以被帶過去,並且name2的值也可以被顯示。

 

重定向Action,引數不會被傳遞過去,但是name2的值可以被獲取。

全域性result,不帶任何引數,或呼叫error.jsp檔案。  <global-results>                     <result name="error">error.jsp</result>                     </global-results>       結果: