Action访问ServletAPI
struts2的Action并未直接与任何Servlet API耦合。但可以访问:Web应用中通常需要访问的Servlet API就是HttpServletRquest、HttpSession、ServletContext,分别代表JSP内置对象中的request、session、application。
非IOC:
一、struts2可以根据自身提供的com.opensymphony.xwork2.ActionContext.ActionContext类访问Servlet API。
1.Object get(Object key) :通过参数key来查找当前ActionContext中的值,该方法类似于调用HttpServletRequest的getAttribute(String name) 方法。
2.Map getApplication() :返回一个Application级的Map对象 ,模拟了该应该的ServletContext实例。
3.Static ActionContext getContext() :获得当前线程的ActionContext对象
4.Map getParameters() :获取所有的请求参数,返回一个包含所有HttpServletRequest参数信息的Map对象,类似于调用HttpServletRequest对象的getParameterMap()方法。
5.Map getSession() :返回一个Map类型的HttpSession对象
6.Void put(Object key,Object value) :向当前ActionContext对象中存入名值对信息
7.Void setApplication(Map application) :设置Application上下文,直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名、属性值。
8.Void setSession(Map session) :设置一个Map类型的Session值 ,直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名、属性值。
二、可以直接使用org.apache.struts2.ServletActionContext类访问这些API:
1.HttpServletRequest request = ServletActionContext.getRequest();
2.HttpServletResponse response = ServletActionContext.getResponse();
3.HttpSession session = request.getSession();
IOC:耦合性比较差
三、struts2还可以通过如下接口访问:
1.ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。
2.ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。
3.ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例。
注意:要重写他们里面的方法才可以用。
public class IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
public String getMessage() {
return message;
}
public void setSession(Map att) {
this.att = att;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public String execute() {
att.put("msg", "Hello World from Session!");
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append(" Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
在struts.xml的action中配置拦截器
<interceptor-ref name="servletConfig"></interceptor-ref>
注意:即使在Struts2的Action类中获得了HttpServletResponse对象,也不要尝试直接在Action中生成对客户端的输出!例如:response.getWriter().println("Hello World");在标准Servlet中会生成对客户端的输出,但在Struts2的Action中,没有任何实际意义。