假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

Struts2教程6:在Action类中获得HttpServletResponse对象的四种方法

上一篇 / 下一篇  2008-04-22 21:26:14 / 个人分类:struts2

查看( 98 ) / 评论( 1 )
在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request。而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得HttpServletResponse或HttpServletRequest对象了。ITPUB个人空间@&sWr\Q j%q FS
    但在Struts2 Action类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。ITPUB个人空间-wq-pi7OE:tM

^Pm.SL X0【方法1】使用Struts2 Aware拦截器ITPUB个人空间c!Z6pol}g
ITPUB个人空间 ymlal%tS5x`
    这种方法需要Action类实现相应的拦截器接口。如我们要获得HttpServletResponse对象,需要实现org.apache.struts2.interceptor.ServletResponseAware接口,代码如下:
?C B~(O0z;]z0
M7? m)Cj-t)@0package action;
Kx)v H9~;w"j m"h0ITPUB个人空间b#z{0TNv(vd$e![
import com.opensymphony.xwork2.ActionSupport;
z){:~!op6Pqpg0import javax.servlet.http.*;ITPUB个人空间:~'A8U*M9L
import org.apache.struts2.interceptor.*;
'J_K/B9a;zJ!v)]'Xt0
uvFyh3Nmk0public class MyAction extends ActionSupport implements ServletResponseAwareITPUB个人空间9C!x$e7~u'Y5|2]
{ITPUB个人空间%^2a;s ~0@-vd
        private javax.servlet.http.HttpServletResponse response;
1I0vp;i bwp+A0    // 获得HttpServletResponse对象
D5} w` N0    public void setServletResponse(HttpServletResponse response)ITPUB个人空间!WM7o9LjaF7XC*m9{
    {
p6\r1i$Z-h%G _W0        this.response = response;
3~:W|4J(ift#e0    }   ITPUB个人空间 }Vmyw6hT
    public String execute() throws ExceptionITPUB个人空间)FC_l5[:sN1?
        {       
zB/Q9I&u0            response.getWriter().write("实现ServletResponseAware接口");
6af Vpn0        }ITPUB个人空间7j;rm2q5Cp
}ITPUB个人空间%[^F IV0GTy h
在上面的代码中,MyAction实现了一个ServletResponseAware接口,并且实现了setServletResponse方法。如果一个动作类实现了ServletResponseAware接口,Struts2在调用execute方法之前,就会先调用setServletResponse方法,并将response参数传入这个方法。如果想获得HttpServletRequest、HttpSession和Cookie等对象,动作类可以分别实现ServletRequestAware、SessionAware和CookiesAware等接口。这些接口都在org.apache.struts2.interceptor包中。如果要获得请求参数,动作类可以实现org.apache.struts2.interceptor. ParameterAware接口,但如果只想判断某个参数是否存在,也可以实现com.opensymphony.xwork2.interceptor. ParameterNameAware接口。这个接口有一个acceptableParameterName方法,当Struts2获得一个请求参数时,就会调用一次。读者可以在这个方法中将所有的请求参数记录下来,以便以后使用。这个方法的定义如下:ITPUB个人空间5[c'\9C:K0Q%E)U

u'C ZY5G3R0boolean acceptableParameterName(String parameterName);ITPUB个人空间!p1]0O!b?2{
ITPUB个人空间*Fo4V4nXy
   ITPUB个人空间l!O(o4A'^;ZU/VW2Q
ITPUB个人空间!BB l7Ut
【方法2】使用RequestAware拦截器ITPUB个人空间8n C\ H }^
ITPUB个人空间{w4qRw4S j
    这种方法和第1种方法类似。动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware将获得一个com.opensymphony.xwork2.util.OgnlValueStack对象,这个对象可以获得response、request及其他的一些信息。代码如下所示:ITPUB个人空间#J1DZ1z#aO
ITPUB个人空间CI9c0C#k:},d&n M
package action;
'WjeA a8sQq0ITPUB个人空间hrqy0g }xKc,L
import java.util.Map;ITPUB个人空间b2o&g"i\N
import org.apache.struts2.*;ITPUB个人空间SD*C"}y'X
import com.opensymphony.xwork2.ActionSupport;ITPUB个人空间'j%L N#Ep,G
import javax.servlet.http.*;ITPUB个人空间J U^lq)q
import com.opensymphony.xwork2.util.*;
7q7[/l lBz0import org.apache.struts2.interceptor.*;ITPUB个人空间z G*kMx2ey

$b^&J T+Pt0public class FirstAction extends ActionSupport implements RequestAwareITPUB个人空间t9h/PT(RC
{ITPUB个人空间c;M1KeH
        private Map request;
#`)V k Q.U+f'{1J0private HttpServletResponse response;ITPUB个人空间k Zb}&pN @:t
       ITPUB个人空间6{~6`W8~|9FM;W;o8|^
        public void setRequest(Map request)ITPUB个人空间Pnn;P(ThT
        {ITPUB个人空间Fm)g X%R7mA#m9W$?
                this.request = request;               
f HY1I@6b5n/MR0        }   ITPUB个人空间Q6JR,^ IZF
    public String execute() throws ExceptionITPUB个人空间`rAwD*c4i6e
        {       ITPUB个人空间X3dF\)XEv
            java.util.Set<String> keys = request.keySet();
'_'v-L F8[?$YE0        // 枚举所有的key值。实际上只有一个key:struts.valueStack
'V U)U2\!nxJ ]-j0        for(String key: keys)
$Hkb#n&]7?.F%B7_0                System.out.println(key);
YB"Y)h*G0        // 获得OgnlValueStack 对象ITPUB个人空间P0J H'lm+T@~u+V/}
            OgnlValueStack stack = (OgnlValueStack)myRequest.get("struts.valueStack");
H.TZ|_ BY|Xw0        // 获得HttpServletResponse对象ITPUB个人空间/C-I!Nvdc
            response =
^'j{Eo`Gh C!x.i0(HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);
4C$o6^|`l/H0a"tP0            response.getWriter().write("实现RequestAware 接口");
#S BoKfEm0        }ITPUB个人空间4s \j `c@w
}ITPUB个人空间0r&rR)qka
    我们也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT来获得HttpServletRequest和PageContext对象。这种方法有些麻烦,一般很少用,读者可以作为一个参考。
r^9lkB"wK!W]#Sn}&@0
ofO&UE3_6~ed.b0【方法3】使用ActionContext类
0NUD9P7Ji:?,Z9W ]0    这种方法比较简单,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:
$V9u E7E @T(aT_0ITPUB个人空间"D5VA8|kuo
HttpServletResponse response(HttpServletResponse) =ITPUB个人空间 rMh7~z`F&ploI
ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);ITPUB个人空间Q6{TU.F
HttpServletRequest request(HttpServletRequest) =ITPUB个人空间"}k8Y:h FT
ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);ITPUB个人空间E m'a5]3Z)u Y

E5Lujm)[S K?2N0【方法4】使用ServletActionContext类
e)W6|2_,U hQt4j ]0ITPUB个人空间b4o8cR5Js
    Struts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。代码如下:
.XO R/^ Nc0
"P.ewn"P(DJ,j3A:v;I0    HttpServletResponse response = ServletActionContext.getResponse()ITPUB个人空间Fu6CH7qX
    response.getWriter().write("hello world");ITPUB个人空间$aI+I%GBK V
ITPUB个人空间Y5i)|o|.S"?&~
    从这四种方法来看,最后一种是最简单的,读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。

TAG:

justforregister的个人空间 justforregister 发布于2008-04-22 21:40:55
非常不好的实践
我来说两句

(可选)

日历

« 2008-08-09  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 8653
  • 日志数: 103
  • 建立时间: 2008-02-08
  • 更新时间: 2008-07-31

RSS订阅

Open Toolbar