方式一:使用ActionContext类间接获取Servlet APIStruts 2提供了一个ActionContext类,Struts 2的Action可以通过该类来访问Servlet API,以下是ActionContext类
中常用的几个方法:
1.Object get(Object key):类似于调用HttpServletRequest的request.getAttribute(String name)方
2.Map getApplication();返回一个Map集合对象,该对象模拟了该应用的ServletContext实例
3.static ActionContext getConntext();静态方法,获取系统的ActionContext实例
4.Map getParameters();获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap()方法
5.Map getSession();返回一个Map对象,该Map对象模拟了HttpSession实例
6.void setApplication(Map application):将Map的键值对转换成application的属性名和属性值(保存在application对象中)
7.void setSession(Map map);将Map的键值对转换成session的属性名,属性值(保存在session对象中)
示例:在action类中向request,session和application范围设置属性值
public class LoginAction Implements Action{
private String username;
private String password;
//省略username,password的setter和getter方法
........................................
public String execute(){
//创建ActionContext实例ctx
ActionContext ctx = ActionContext.getContext();
//获取application范围的属性值,ctx.getApplication()的结果是一个Map集合,再通过get方法获取到count键对应的值
int count = ctx.getApplication().get("count");
if(count == null){
count = 1;
}else{
count = count+1;
}
//设置application范围的属性值
ctx.getApplication().put("count",count);
//设置session范围的属性值
ctx.getSession.put("username","getUsername()");
if(getUsername().equals("crazyit.org")&&getPassword().equals("leegang")){
//设置request范围的属性值
ctx.put("tip","登陆成功!");
return SUCCESS;
}else{
//设置request范围的属性值
ctx.put("tip","登录失败!");
return ERROR;
}
}
}
这样在登录成功页面就可获取到设置在三个范围里的属性值了,如下:
-------------------------------------------------------
本站访问的次数:${applicationScope.count}
${sessionScope.username}
${requestScope.tip}
-------------------------------------------------------
使用总结:
1.首先创建ActionContext类的实例,创建方式为:
ActionContext ctx = ActionContext.getContext();
2.设置request范围的值:ctx.put("aaa","我是request中的值!"); //集合的put方法
在jsp页面获取request的值:${requestScope.aaa} //使用EL表达式
在action页面获取request范围的值:ctx.get("aaa"); //集合的get方法获取键对应的值
3.设置session范围的值:ctx.getSession().put("key","value"); //调用Map集合的put方法设置值
在jsp页面获取session范围的值:${sessionScope.key} //使用EL表达式获取值
在action中获取session的值:ctx.getSession().get("key") //根据Map集合的键获取对应的值
4.application和session的方法使用方式一致
方式二:Struts中Action类实现对应接口,直接访问Servlet API
在Struts中提供了如下几个接口:
1.ServletContextAware:实现该接口的action类可以直接访问web应用的ServletContext实例
需重写的方法:public void setServletContext(HttpServletContext context)
2.ServletRequestAware:实现该接口的action类可以直接访问用户请求的HttpServletRequest实例
需重写的方法:public void setServletRequest(HttpServletRequest request)
3.ServletResponseAware:实现该接口的action类可以直接访问服务器响应的的ServletResponse实例
需重写的方法:public void setServletResponse(HttpServletResponse response)
使用步骤:
1.首先在action类中定义HttpServletResponse类型的response成员属性或者HttpServletRequest类型的request成员属性
2.重写接口中的方法,在以上的三个接口中各有一个方法需要被重写,如ServletResponseAware接口要求重写
public void setServletResponse(HttpServletResponse response)方法,注意到该方法中有一个HttpServletResponse
类型的参数,就代表了Web应用对客户的响应,我们只要在该方法内通过this.response=response就可将其设置为action类
的成员属性,从而就可以在action中使用该response对象了,request对象的使用也是如此,有了request对象session就可以
被创建,
示例:在action类中使用response和request对象
public class LoginAction entends ActionSupport implements ServletRequestAware,ServletResponseAware{
private String username;
private String password;
private HttpServletRequest request;
private HttpServletResponse response;
//重写实现ServletRequestAware接口必须实现的方法
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
//重写实现ServletResponseAware接口必须实现的方法,
public void setServletResponse(HttpServletResponse response){
this.response = response;
}
//接下来request和response对象就可以在action的所有方法中使用了
public String execute(){
.............
}
}
方式三:使用ServletActionContext工具类直接访问Servlet API,不用实现什么接口,该类中常用的方法如下:
1.static PageContext getPageContext():取得Web应用的PageContext对象
2.static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象
3.static HttpServletResponse getResponse():取得Web应用的HttpServletResponse对象
4.static ServletContext getServletContext():取得Web应用的ServletContext对象
如: HttpServletRequest request = ServletActionContext.getRequest();
request.getSession().setAttribute("aaaa","aaaa");
在jsp页面通过ognl表达式和标签获取到session中的值:<s:property value="#session.aaaa" />