真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Struts2實(shí)現(xiàn)Action的幾種方式

Action用于處理用戶的請求,因此也被稱為業(yè)務(wù)控制器。每個(gè)Action類就是一個(gè)工作單元,Struts 2框架負(fù)責(zé)將用戶的請求與相應(yīng)的Action匹配,如果匹配成功,則調(diào)用該Action類對用戶請求進(jìn)行處理,而匹配規(guī)則需要在Struts 2的配置文件中聲明。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計(jì)和自適應(yīng)建站服務(wù)。團(tuán)隊(duì)由有經(jīng)驗(yàn)的網(wǎng)頁設(shè)計(jì)師、程序員和市場專家組成,能夠提供從成都h5網(wǎng)站建設(shè),網(wǎng)站制作,一元廣告,模板建站到小程序制作等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。

Struts 2框架下實(shí)現(xiàn)Action類有以下三種方式:

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

POJO實(shí)現(xiàn)方式

以用戶登錄為例,創(chuàng)建LoginAction類。

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;
  }

  /**
   * 調(diào)用業(yè)務(wù)邏輯方法,控制業(yè)務(wù)流程
   */
  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";
    }
  }

}

登錄頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>


用戶登錄


  
用戶名
密碼

錯(cuò)誤頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




錯(cuò)誤頁面


     登錄失敗!



成功頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




顯示用戶信息


登錄成功!歡迎用戶${param.userName} !



struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>



  
  
  

  
  
    
    
      
      /ok.jsp
      /error.jsp
    
  



這樣就以POJO方式實(shí)現(xiàn)了一個(gè)Action,當(dāng)單擊“登錄按鈕時(shí)”,表單中的數(shù)據(jù)會(huì)提交給login.action,Struts 2框架將自動(dòng)調(diào)用LoginAction的setter方法將請求參數(shù)值封裝到對應(yīng)的屬性中,并執(zhí)行execute()方法。

實(shí)現(xiàn)Action接口方式

為了讓Action類更規(guī)范,使各個(gè)開發(fā)人員編寫的execute()方法返回的字符串風(fēng)格是一致的,Struts 2提供一個(gè)Action接口,該接口定義了Acitoin處理類應(yīng)該實(shí)現(xiàn)的通用規(guī)范:

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接口來創(chuàng)建Action類:

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;
  }

  /**
   * 調(diào)用業(yè)務(wù)邏輯方法,控制業(yè)務(wù)流程
   */
  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:


  
  
  

  
  
    
    
      
      /ok.jsp
      /error.jsp
    
  



繼承ActionSupport類方式

Struts 2框架為Action接口提供了一個(gè)實(shí)現(xiàn)類ActionSupport,該類提供了許多默認(rèn)方法,寫Action類時(shí)繼承ActionSupport類會(huì)大大簡化Action的開發(fā)。ActionSupport類是Struts 2默認(rèn)的Action處理類,如果配置Action類時(shí)沒有指定class屬性,系統(tǒng)自動(dòng)默認(rèn)使用ActionSupport類作為Action的處理類。

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

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;
  }

  /**
   * 調(diào)用業(yè)務(wù)邏輯方法,控制業(yè)務(wù)流程
   */
  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() {
    // 簡單驗(yàn)證用戶輸入
    if (this.userName == null || this.userName.equals("")) {
      // 將錯(cuò)誤信息寫入到Action類的FieldErrors中
      // 此時(shí)Struts 2框架自動(dòng)返回INPUT視圖
      this.addFieldError("userName", "用戶名不能為空!");
      System.out.println("用戶名為空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密碼不能為空且密碼長度不能小于6");
      System.out.println("密碼不能為空且密碼長度不能小于6!");
    }
  }

}

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

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

<?xml version="1.0" encoding="UTF-8" ?>



  
  
  

  
  
    
    
      
      /ok.jsp
      /error.jsp
      /login.jsp
    
  



當(dāng)表單提交的數(shù)據(jù)驗(yàn)證不通過時(shí),則會(huì)返回到輸入頁面,程序會(huì)依然“停留”(看起來是這樣,但其實(shí)是一個(gè)新的輸入頁面)在輸入頁面login.jsp。

訪問ActionContext

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

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

常用方法如下表所示:

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

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

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,設(shè)置num屬性為1
      if (num == null) {
        num = 1;
      } else {
        // 將num加1
        num++;
      }
    // 將加1后的num值保存在application中
    ctx.getApplication().put("num", num);
    return SUCCESS;
  }
}

上面代碼先使用ActionContext.getContext()靜態(tài)方法獲取系統(tǒng)的ActionContext對象,再調(diào)用ActionContext對象的getApplication()方法獲取ServletContext對應(yīng)的Map對象,然后調(diào)用get()/put()方法進(jìn)行數(shù)據(jù)的讀/寫操作。最后將num值保存到ServletContext中。

編寫clickNum.jsp 頁面,對application進(jìn)行訪問:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>


點(diǎn)擊次數(shù)統(tǒng)計(jì)


點(diǎn)擊按鈕,已點(diǎn)擊了 ${empty applicationScope.num?0:applicationScope.num} 次

上述代碼創(chuàng)建了一個(gè)表單,表單的action屬性值為clicknum,action,當(dāng)單擊“提交”按鈕時(shí)會(huì)將表單提交給CounterAction進(jìn)行處理。

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

<?xml version="1.0" encoding="UTF-8" ?>



  
  
  

  
  
    
    
      
      /ok.jsp
      /error.jsp
      /login.jsp
    
    
      /clickNum.jsp
    
  



訪問Servlet API

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

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

方法功能描述
ServletContextAware實(shí)現(xiàn)該接口的Action可以直接訪問Web應(yīng)用的SevletContext實(shí)例
ServletRequestAware實(shí)現(xiàn)該接口的Action可以直接訪問用戶請求的HttpServletRequest實(shí)例
ServletResponseAware實(shí)現(xiàn)該接口的Action可以直接訪問服務(wù)器響應(yīng)的HttpSevletResponse實(shí)例

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

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;
  }

  /**
   * 調(diào)用業(yè)務(wù)邏輯方法,控制業(yè)務(wù)流程
   */
  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() {
    // 簡單驗(yàn)證用戶輸入
    if (this.userName == null || this.userName.equals("")) {
      // 將錯(cuò)誤信息寫入到Action類的FieldErrors中
      // 此時(shí)Struts 2框架自動(dòng)返回INPUT視圖
      this.addFieldError("userName", "用戶名不能為空!");
      System.out.println("用戶名為空!");
    }
    if (this.password == null || this.password.length() < 6) {
      this.addFieldError("password", "密碼不能為空且密碼長度不能小于6");
      System.out.println("密碼不能為空且密碼長度不能小于6!");
    }
  }

}

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

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

...
...

創(chuàng)建first.jsp顯示用戶信息:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




顯示用戶信息


登錄成功!歡迎用戶${param.userName} 
當(dāng)前用戶${session.CurUser }
下一頁

再創(chuàng)建一個(gè)second.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>




顯示用戶信息


請求中的用戶信息:${param.userName} 
Session中的用戶信息:${session.CurUser }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


本文標(biāo)題:Struts2實(shí)現(xiàn)Action的幾種方式
本文URL:http://weahome.cn/article/pjeijs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部