在struts2框架中获取servlet api
对于struts2框架,不建议直接使用servlet api;
在struts2中获取servlet api有三种方式:
1.通过ActionContext来获取
1.获取一个ActionContext对象。
ActionContext context=ActionContext.getContext();
2.获取servlet api
注意:通过ActionContext获取的不是真正的Servlet api,而是一个Map集合。
api下的一些方法
1.context.getApplication()
2.context.getSession()
3.context.getParameter();---得到的就相当于request.getParameterMap()。获取请求参数,注意:不知为什么这里get到的数据会变成String类型的数组,所以你必须强转成String类型的数组
如:Map<String,Object> map3 = context.getParameters();
System.out.println(((String[])map3.get("username"))[0]);
4.context.put(String,Object) 相当于request.setAttribute(String,String);
2.注入方式获取(这种方式是真正的获取到了servlet api)
1.要求action类必须实现提定接口。
ServletContextAware : 注入ServletContext对象
ServletRequestAware :注入 request对象
ServletResponseAware : 注入response对象
2.声明一个web对象,重定接口中的方法,使用接口中的方法的参数对声明的web对象赋值。
public class ServletDemo2Action extends ActionSupport implements
ServletRequestAware {
private HttpServletRequest request;
@Override
//在执行此方法之前,必定会先执行方法2
public String execute() throws Exception {
System.out.println(request.getParameter("username"));
return null;
}
//方法2
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
扩展:分析其实现:
是使用struts2中的一个interceptor完成的.
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
if (action instanceof ServletRequestAware) { //判断action是否实现了ServletRequestAware接口
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); //得到request对象.
((ServletRequestAware) action).setServletRequest(request);//将request对象通过action中重写的方法注入。
}
3.通过ServletActionContext获取.
在ServletActionContext中方法都是static。
getRequest();
getResposne();
getPageContext();
public class ServletDemo3Action extends ActionSupport {
@Override
public String execute() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
System.out.println(request.getParameter("username"));
return SUCCESS;
}
}