1. 程式人生 > >struts2 教程6 在Action類中…

struts2 教程6 在Action類中…

  在struts1.x Action類的execute方法中,有四個引數,其中兩個就是responserequest。而在Struts2中,並沒有任何引數,因此,就不能簡單地從execute方法獲得HttpServletResponseHttpServletRequest物件了。

   但在Struts2 Action類中仍然有很多方法可以獲得這些物件。下面就列出四種獲得這些物件的方法。

【方法1】使用Struts2 Aware攔截器

這種方法需要Action類實現相應的攔截器介面。如我們要獲得HttpServletResponse物件,需要實現org.apache.struts2.interceptor.ServletResponseAware介面,

程式碼如下:

package action;

import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import org.apache.struts2.interceptor.*;

publicclass MyAction extends ActionSupport implements ServletResponseAware
{
    
private javax.servlet.http.HttpServletResponse response;
    
// 獲得HttpServletResponse物件
publicvoid setServletResponse(HttpServletResponse response)
    {
        
this.response = response;
    }    
    
public String execute() throws Exception
    {    
        response.getWriter().write(
"實現ServletResponseAware介面");
    }
}

在上面的程式碼中,MyAction實現了一個ServletResponseAware介面,並且實現了setServletResponse方法。如果一個動作類實現了

ServletResponseAware介面,Struts2在呼叫execute方法之前,就會先呼叫setServletResponse方法,並將response引數傳入這個方法。如果想獲得HttpServletRequestHttpSessionCookie等物件,動作類可以分別實現ServletRequestAwareSessionAwareCookiesAware等介面。這些介面都在org.apache.struts2.interceptor包中。

如果要獲得請求引數,動作類可以實現org.apache.struts2.interceptor. ParameterAware介面,但如果只想判斷某個引數是否存在,也可以實現com.opensymphony.xwork2.interceptor. ParameterNameAware介面。這個介面有一個acceptableParameterName方法,當Struts2獲得一個請求引數時,就會呼叫一次。讀者可以在這個方法中將所有的請求引數記錄下來,以便以後使用。這個方法的定義如下:

boolean acceptableParameterName(String parameterName);

【方法2】使用RequestAware攔截器

這種方法和第1種方法類似。動作類需要實現一個org.apache.struts2.interceptor.RequestAware介面。所不同的是RequestAware將獲得一個com.opensymphony.xwork2.util.OgnlValueStack物件,這個物件可以獲得responserequest及其他的一些資訊。程式碼如下所示:


package action;

import java.util.Map;
import org.apache.struts2.*;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import com.opensymphony.xwork2.util.*;
import org.apache.struts2.interceptor.*;

publicclass FirstAction extends ActionSupport implements RequestAware
{
    
private Map request;
private HttpServletResponse response;
    
    
publicvoid setRequest(Map request)
    {
        
this.request = request;        
    }    
    
public String execute() throws Exception
    {    
        java.util.Set
<String> keys = request.keySet();
        
// 列舉所有的key值。實際上只有一個key:struts.valueStackfor(String key: keys)
            System.out.println(key);
        
// 獲得OgnlValueStack 物件        OgnlValueStack stack = (OgnlValueStack)request.get("struts.valueStack");
        
// 獲得HttpServletResponse物件        response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);
        response.getWriter().write(
"實現RequestAware 介面");
    }
}

    我們也可以使用StrutsStatics.HTTP_REQUESTStrutsStatics.PAGE_CONTEXT來獲得HttpServletRequestPageContext物件。這種方法有些麻煩,一般很少用,讀者可以作為一個參考。

【方法3】使用ActionContext

這種方法比較簡單,我們可以通過org.apache.struts2.ActionContext類的get方法獲得相應的物件。程式碼如下:

    HttpServletResponse response = (HttpServletResponse)

ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

HttpServletRequest request = (HttpServletRequest)

ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);

【方法4】使用ServletActionContext

Struts2為我們提供了一種最簡單的方法獲得HttpServletResponse及其他物件。這就是org.apache.struts2.ServletActionContext類。我們可以直接使用ServletActionContext類的getRequestgetResponse方法來獲得HttpServletRequestHttpServletResponse物件。程式碼如下:

    HttpServletResponse response = ServletActionContext.getResponse()

response.getWriter().write("hello world");

   從這四種方法來看,最後一種是最簡單的,讀者可以根據自己的需要和要求來選擇使用哪一種方法來獲得這些物件。