假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...
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"jm"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?
{
z B/Q9I&u0 response.getWriter().write("实现ServletResponseAware接口");
6af Vpn0 }ITPUB个人空间7j;rm2q5Cp
}ITPUB个人空间%[^F IV0GTyh
在上面的代码中,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'CZ Y5G3R0boolean 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个人空间JU^lq)q
import com.opensymphony.xwork2.util.*;
7q7[/l l Bz0import org.apache.struts2.interceptor.*;ITPUB个人空间z G*kMx2ey
$b^&J T+Pt0public class FirstAction extends ActionSupport implements RequestAwareITPUB个人空间t9h/P T(RC
{ITPUB个人空间c;M1KeH
private Map request;
#`)V k Q.U+f'{1J0private HttpServletResponse response;ITPUB个人空间kZb}&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;
但在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"jm"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?
{
z B/Q9I&u0 response.getWriter().write("实现ServletResponseAware接口");
6af Vpn0 }ITPUB个人空间7j;rm2q5Cp
}ITPUB个人空间%[^F IV0GTyh
在上面的代码中,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'CZ Y5G3R0boolean 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个人空间JU^lq)q
import com.opensymphony.xwork2.util.*;
7q7[/l l Bz0import org.apache.struts2.interceptor.*;ITPUB个人空间z G*kMx2ey
$b^&J T+Pt0public class FirstAction extends ActionSupport implements RequestAwareITPUB个人空间t9h/P T(RC
{ITPUB个人空间c;M1KeH
private Map request;
#`)V k Q.U+f'{1J0private HttpServletResponse response;ITPUB个人空间kZb}&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;