国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Struts 2 實現Action的幾種方式

Struts 2 實現Action的幾種方式

2021-01-16 10:39謝隨安 Java教程

本篇文章主要介紹了Struts 2 實現Action的幾種方式,Struts 2框架下實現Action類有三種方式,有興趣的可以了解一下

Action用于處理用戶的請求,因此也被稱為業務控制器。每個Action類就是一個工作單元,Struts 2框架負責將用戶的請求與相應的Action匹配,如果匹配成功,則調用該Action類對用戶請求進行處理,而匹配規則需要在Struts 2的配置文件中聲明。

Struts 2框架下實現Action類有以下三種方式:

  1. 普通的POJO類,該類通常包含一個無參數的execute()方法,返回值為字符串類型。
  2. 實現Action接口
  3. 繼承ActionSupport類

POJO實現方式

以用戶登錄為例,創建LoginAction類。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.qst.chapter03.action;
 
public class LoginAction {
  /* 用戶名 */
  private String userName;
  /* 密碼 */
  private String password;
 
  public String getUserName() {
    return userName;
  }
 
  public void setUserName(String userName) {
    this.userName = userName;
  }
 
  public String getPassword() {
    return password;
  }
 
  public void setPassword(String password) {
    this.password = password;
  }
 
  /**
   * 調用業務邏輯方法,控制業務流程
   */
  public String execute() {
    System.out.println("----登錄的用戶信息-----");
    System.out.println("用戶名:" + userName);
    System.out.println("密碼:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功頁面
      return "ok";
    } else {
      // 返回失敗頁面
      return "error";
    }
  }
 
}

登錄頁面:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<title>用戶登錄</title>
</head>
<body>
  <form action="login.action" method="post" name="logForm">
    <table>
      <tr>
        <td>用戶名</td>
        <td><input type="text" name="userName" size="15" /></td>
      </tr>
      <tr>
        <td>密碼</td>
        <td><input type="password" name="password" size="15" /></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="登錄"></td>
      </tr>
    </table>
  </form>
</body>
</html>

錯誤頁面:

?
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 
<title>錯誤頁面</title>
</head>
<body>
     登錄失?。?/code>
</body>
</html>

成功頁面:

?
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 
<title>顯示用戶信息</title>
</head>
<body>
登錄成功!歡迎用戶${param.userName} !
</body>
</html>

struts.xml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
 
<struts>
  <!-- 指定Struts2處于開發階段,可以進行調試 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
 
  <!-- Struts2的Action都必須配置在package里,此處使用默認package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定義一個名為user的Action,實現類為com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值與視圖資源之間的映射關系 -->
      <result name="ok">/ok.jsp</result>
      <result name="error">/error.jsp</result>
    </action>
  </package>
 
</struts>

這樣就以POJO方式實現了一個Action,當單擊“登錄按鈕時”,表單中的數據會提交給login.action,Struts 2框架將自動調用LoginAction的setter方法將請求參數值封裝到對應的屬性中,并執行execute()方法。

實現Action接口方式

為了讓Action類更規范,使各個開發人員編寫的execute()方法返回的字符串風格是一致的,Struts 2提供一個Action接口,該接口定義了Acitoin處理類應該實現的通用規范:

?
1
2
3
4
5
6
7
8
9
10
public abstract interface Action {
 
 public static final java.lang.String SUCCESS = "success";
 public static final java.lang.String NONE = "none";
 public static final java.lang.String ERROR = "error";
 public static final java.lang.String INPUT = "input";
 public static final java.lang.String LOGIN = "login";
 
 public String execute() throws Exception;
}

下面代碼使用Action接口來創建Action類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.qst.chapter03.action;
 
import com.opensymphony.xwork2.Action;
 
public class LoginAction2 implements Action{
  /* 用戶名 */
  private String userName;
  /* 密碼 */
  private String password;
 
  public String getUserName() {
    return userName;
  }
 
  public void setUserName(String userName) {
    this.userName = userName;
  }
 
  public String getPassword() {
    return password;
  }
 
  public void setPassword(String password) {
    this.password = password;
  }
 
  /**
   * 調用業務邏輯方法,控制業務流程
   */
  public String execute() {
    System.out.println("----登錄的用戶信息-----");
    System.out.println("用戶名:" + userName);
    System.out.println("密碼:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功頁面
      return SUCCESS;
    } else {
      // 返回失敗頁面
      return ERROR;
    }
  }
 
}

struts.xml:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<struts>
  <!-- 指定Struts2處于開發階段,可以進行調試 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
 
  <!-- Struts2的Action都必須配置在package里,此處使用默認package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定義一個名為user的Action,實現類為com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值與視圖資源之間的映射關系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
    </action>
  </package>
 
</struts>

繼承ActionSupport類方式

Struts 2框架為Action接口提供了一個實現類ActionSupport,該類提供了許多默認方法,寫Action類時繼承ActionSupport類會大大簡化Action的開發。ActionSupport類是Struts 2默認的Action處理類,如果配置Action類時沒有指定class屬性,系統自動默認使用ActionSupport類作為Action的處理類。

下面代碼通過繼承ActionSupport類來創建Action類,并重寫validate()驗證方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.qst.chapter03.action;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class LoginAction3 extends ActionSupport {
  /* 用戶名 */
  private String userName;
  /* 密碼 */
  private String password;
 
  public String getUserName() {
    return userName;
  }
 
  public void setUserName(String userName) {
    this.userName = userName;
  }
 
  public String getPassword() {
    return password;
  }
 
  public void setPassword(String password) {
    this.password = password;
  }
 
  /**
   * 調用業務邏輯方法,控制業務流程
   */
  public String execute() {
    System.out.println("----登錄的用戶信息-----");
    System.out.println("用戶名:" + userName);
    System.out.println("密碼:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 返回成功頁面
      return SUCCESS;
    } else {
      // 返回失敗頁面
      return ERROR;
    }
  }
 
  // 重寫validate()方法
  public void validate() {
    // 簡單驗證用戶輸入
    if (this.userName == null || this.userName.equals("")) {
      // 將錯誤信息寫入到Action類的FieldErrors中
      // 此時Struts 2框架自動返回INPUT視圖
      this.addFieldError("userName", "用戶名不能為空!");
      System.out.println("用戶名為空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密碼不能為空且密碼長度不能小于6");
      System.out.println("密碼不能為空且密碼長度不能小于6!");
    }
  }
 
}

上述代碼增加了一個對表單提交的數據進行驗證的validate()方法,該方法會在執行execute()方法之前運行,如果發現表單提交數據不符合要求,則執行addFieldError()方法,將錯誤信息寫入Action類的字段錯誤列表FieldErrors中,并且將自動返回到INPUT輸入視圖,讓用戶重新輸入表單并提交。

在struts.xml配置文件中增加INPUT輸入視圖:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
 
<struts>
  <!-- 指定Struts2處于開發階段,可以進行調試 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
 
  <!-- Struts2的Action都必須配置在package里,此處使用默認package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定義一個名為user的Action,實現類為com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值與視圖資源之間的映射關系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
      <result name="input">/login.jsp</result>
    </action>
  </package>
 
</struts>

當表單提交的數據驗證不通過時,則會返回到輸入頁面,程序會依然“停留”(看起來是這樣,但其實是一個新的輸入頁面)在輸入頁面login.jsp。

訪問ActionContext

相對于Struts1,Struts 2的一個重要改進是使Action不再和任何Servlet API耦合,但有些時候Action類不訪問Servlet API是不能實現業務邏輯的(例如跟蹤HTTP Session的狀態)。此時Action就需要訪問Servlet API中的HttpSession。

Struts 2提供了一種更加輕松的方式來訪問Servlet API。在Struts 2框架中,Action可以通過ActionContext類來訪問Servlet API,ActionContext提供了讀寫Servlet API中的HttpServletRequest、HttpSession和ServletContext中數據的方法。

常用方法如下表所示:

 

方法 功能描述
Object get(Object key) 獲取屬性值,與HttpSevletRequest的getAttribute(String name)類似
Map getApplication() 返回一個Map對象,該對象模擬了Web應用對應的ServletContext對象
static ActionContext getContext() 靜態方法,用于獲取系統的ActionContext對象
Map getParameters() 獲取所有的請求參數,類似于調用HttpSevletRequest對象的getParameterMap()方法
Map getSession() 返回一個Map對象,該對象模擬了HttpSession實例
void setApplication(Map application) 直接傳入一個Map對象,并將該Map對象中的鍵/值對轉換成application的屬性名和屬性值
void setSession(Map session) 直接傳入一個Map對象,并將該Map對象中的鍵/值對轉換成session的屬性名和屬性值

 

下面代碼演示Action訪問ActionContext的使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.qst.chapter03.action;
 
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
 
public class ClickNumAction extends ActionSupport {
  public String execute() {
    // 獲取ActionContext對象,通過該對象訪問Servlet API
    ActionContext ctx = ActionContext.getContext();
    // 獲取ServletContext里的num屬性
    Integer num = (Integer) ctx.getApplication().get("num");
    // 如果num屬性為null,設置num屬性為1
      if (num == null) {
        num = 1;
      } else {
        // 將num加1
        num++;
      }
    // 將加1后的num值保存在application中
    ctx.getApplication().put("num", num);
    return SUCCESS;
  }
}

上面代碼先使用ActionContext.getContext()靜態方法獲取系統的ActionContext對象,再調用ActionContext對象的getApplication()方法獲取ServletContext對應的Map對象,然后調用get()/put()方法進行數據的讀/寫操作。最后將num值保存到ServletContext中。

編寫clickNum.jsp 頁面,對application進行訪問:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<html>
<head>
<title>點擊次數統計</title>
</head>
<body>
<form action="clicknum.action" method="post">
  <input type="submit" value="點擊!" />
</form>
  <!--輸出點擊次數 -->
  點擊按鈕,已點擊了
  <!-- 通過表達式訪問ServletContext對象的屬性 -->
  ${empty applicationScope.num?0:applicationScope.num} 次
</body>
</html>

上述代碼創建了一個表單,表單的action屬性值為clicknum,action,當單擊“提交”按鈕時會將表單提交給CounterAction進行處理。

在struts.xml配置文件中增加CounterAction的配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  "http://struts.apache.org/dtds/struts-2.3.dtd">
 
<struts>
  <!-- 指定Struts2處于開發階段,可以進行調試 -->
  <constant name="struts.devMode" value="true" />
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
 
  <!-- Struts2的Action都必須配置在package里,此處使用默認package -->
  <package name="default" namespace="/" extends="struts-default">
    <!-- 定義一個名為user的Action,實現類為com.qst.chapter03.action.LoginAction -->
    <action name="login" class="com.qst.chapter03.action.LoginAction3">
      <!-- 配置execute()方法返回值與視圖資源之間的映射關系 -->
      <result name="success">/ok.jsp</result>
      <result name="error">/error.jsp</result>
      <result name="input">/login.jsp</result>
    </action>
    <action name="clicknum" class="com.qst.chapter03.action.ClickNumAction">
      <result name="success">/clickNum.jsp</result>
    </action>
  </package>
 
</struts>

訪問Servlet API

雖然Struts 2提供了ActionContext來直接訪問Servlet API。但有時你需要直接訪問Sevlet API。為了在Action中能夠直接訪問Servlet API,Struts 2還提供了一系列的其他接口,通過實現這些接口,Action可以直接訪問Servlet APi。

Struts 2框架提供的訪問Servlet API的接口如下表所示:

 

方法 功能描述
ServletContextAware 實現該接口的Action可以直接訪問Web應用的SevletContext實例
ServletRequestAware 實現該接口的Action可以直接訪問用戶請求的HttpServletRequest實例
ServletResponseAware 實現該接口的Action可以直接訪問服務器響應的HttpSevletResponse實例

 

下面代碼以實現SevletRequestAware接口為例,通過獲取HttpSession,將登陸成功的用戶名保存到Session中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package com.qst.chapter03.action;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
import org.apache.struts2.interceptor.ServletRequestAware;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
  /* 用戶名 */
  private String userName;
  /* 密碼 */
  private String password;
 
  public String getUserName() {
    return userName;
  }
 
  public void setUserName(String userName) {
    this.userName = userName;
  }
 
  public String getPassword() {
    return password;
  }
 
  public void setPassword(String password) {
    this.password = password;
  }
 
  //聲明request對象
  private HttpServletRequest request;
  //重寫ServletRequestAware中的方法
  public void setServletRequest(HttpServletRequest request) {
    this.request = request;
  }
 
  /**
   * 調用業務邏輯方法,控制業務流程
   */
  public String execute() {
    System.out.println("----登錄的用戶信息-----");
    System.out.println("用戶名:" + userName);
    System.out.println("密碼:" + password);
    if (userName.startsWith("qst") && password.length() >= 6) {
      // 獲得session對象
      HttpSession session = request.getSession();
      //將用戶名存放到session中
      session.setAttribute("CurUser", userName);
      // 返回成功頁面
      return SUCCESS;
    } else {
      // 返回失敗頁面
      return ERROR;
    }
  }
 
  // 重寫validate()方法
  public void validate() {
    // 簡單驗證用戶輸入
    if (this.userName == null || this.userName.equals("")) {
      // 將錯誤信息寫入到Action類的FieldErrors中
      // 此時Struts 2框架自動返回INPUT視圖
      this.addFieldError("userName", "用戶名不能為空!");
      System.out.println("用戶名為空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密碼不能為空且密碼長度不能小于6");
      System.out.println("密碼不能為空且密碼長度不能小于6!");
    }
  }
 
}

上述代碼定義的LoginAction4 實現了SevletRequestAware接口,并且重寫該接口中setServletRequest()方法,setServletRequest()方法的參數是HttpServletRequest對象,運行Web應用時,Struts 2框架會自動將當前請求對象傳入setServletRequest()方法,再將該請求對象賦給LoginAction4的request屬性,這樣在LoginAction4類的其他方法中就可以訪問到request對象了。通過request對象可以獲取HttpSession對象,并將當前用戶信息保存到Session中。

將login.jsp頁面中表單的action屬性改成login4.action:

?
1
2
3
...
<form action="login.action" method="post" name="logForm">
...

創建first.jsp顯示用戶信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 
<title>顯示用戶信息</title>
</head>
<body>
登錄成功!歡迎用戶${param.userName} <br/>
當前用戶${session.CurUser } <br/>
<a href="second.jsp" rel="external nofollow" >下一頁</a>
</body>
</html>

再創建一個second.jsp:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 
<title>顯示用戶信息</title>
</head>
<body>
請求中的用戶信息:${param.userName} <br/>
Session中的用戶信息:${session.CurUser }
</body>
</html>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.jianshu.com/p/f3b3b4b1ff43?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 男人的天堂在线视频 | 欧美视频在线观看不卡 | 亚洲第一黄色网 | 欧美精品乱码久久久久久按摩 | 国产综合久久 | 国产特级毛片aaaaaaa高清 | 91在线观看免费观看 | 国产一区www | 日韩不卡一二三 | 国产精品不卡视频 | av亚洲在线 | 成人网av | 久久久久久免费 | 亚洲一区有码 | 国产一区二区视频精品 | 男人的天堂在线视频 | 欧美一区国产一区 | 日韩欧美视频 | 午夜欧美 | 国产精品久久久久国产a级 成人a在线视频 | 黄在线观看 | 日韩国产欧美视频 | 91大全| 中文字幕日韩一区 | 日韩成人免费在线 | 性做久久久 | 黄色片在线免费观看 | 欧美一区二区在线视频 | 日韩一区电影 | 日韩在线亚洲 | 国产大片在线观看 | 中文字幕高清在线观看 | 亚洲国产精品自拍 | 色视频在线免费观看 | 午夜日韩 | 四虎av成人| 中文字幕av一区二区三区 | 精品国产乱码一区二区三区四区 | 日韩国产在线 | 4438x成人网最大色成网站 | 黄色污污视频 |