Servlet API的方法和类
Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问ServletAPI。下面是ActionContext类中包含的几个常用方法:
Object get(Object key ):该方法类似于HttpServletRequest的getAttribute(String name) 方法。
Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。
Static ActionContext getContext():静态方法,获取系统的ActionContxt对象。
Map getParameters():获取所有的请求参数,类似于HttpServletRequest对象的getParameterMap()方法。
Map getSession():返回一个map对象,该Map模拟了HttpSession实例。
Void setApplication(map Aapplication)直接传入一个Map实例,讲Map实例里的key=value对转换成application 的属性名,属性值。
Void setSession(Map Session)直接传入一个Map实例,讲该map实例的key-value转换成Session的属性名属性值。
Action直接访问ServletAPI
ServletContextAware :实现了该接口的Action可以直接访问web应用的ServletContext实例。
SerlvetRequestAware:实现了该接口的Action可以直接访问web的HttpSerlvetRequest实例。
ServletResponseAware 实现了该接口的Action可以直接访问服务器的相应的HttpServletResponse对象。
如果实现了ServletResponseAware只需要实现之中的public void setServletResponse(HttpServletResponse response)方法即可,然后就可以使用httpServletResponse对象进行操作。
ServletRequestAware对象也是这样的。
为了直接访问Servlet API Struts2还提供了一个ServletActionContext,这个类包含了如下几个静态方法:
Static PageContext getPageContext():取得Web应用PageContext对象。
Static HttpServletRequest getRequest();
Static HttpServletResposne getResponse();
Static SevletContext getSevletContext();取得web应用的ServletContxt对象。
实例
Struts是构建在servlet基础之上的框架,它提供了一系列的servlet api,允许我们对request、response、session对象进行操作。
1、最常用的一种方式是使用ServletActionContext访问Servlet API
ServletActionContext是面向action,特定于上下文的信息。继承于ActionContext。
public String execute() throws Exception
{
if(!"admin".equals(username))
throw new UsernameException("username invalid");
if(!"admin".equals(password))
throw new PasswordException("password invalid");
<span style="color:#ff0000;">HttpServletRequest request=ServletActionContext.getRequest();
HttpSession session=request.getSession();
session.setAttribute("hello", "helloworld");</span>
return SUCCESS;
}</span>
比如
以上是LoginAction的execute方法,将hello属性值设置为helloworld并放入session中,在结果页面通过sessionScope.hello就可以将值取出来。
2、使用ActionContext访问ServletAPI,将红字部分替换成以下内容也可以。
ActionContext actionContext=ActionContext.getContext();
Map<String,Object> map=actionContext.getSession();
map.put("hello","helloworld");
从以上代码可以看出,map所对应的就是session的内容。将session转换为map,方便我们进行web的单元测试。
3、通过实现指定接口ServletContextAware,ServletRequestAware,ServletResponseAware,这种方式不推荐使用,与ServletAPI的耦合性大。
下面以ServletRequestAware为例,介绍如何在Action中访问HttpServletRequest对象
public class LoginAction extends ActionSupport implements <span style="color:#ff0000;">ServletRequestAware</span>{
private String username;
private String password;
<span style="color:#FF0000;">HttpServletRequest request;</span>
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() throws Exception
{
if(!"admin".equals(username))
throw new UsernameException("username invalid");
if(!"admin".equals(password))
throw new PasswordException("password invalid");
HttpSession session=request.getSession();
session.setAttribute("hello", "helloworld");
return SUCCESS;
}
@Override
<span style="color:#ff0000;">public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
}</span>