获取servletApi有两种方法,(在这里web.xml的配置我们就不写了,就是添加了一个过滤器,可以参考http://blog.csdn.net/zlk961543260/article/details/77073730,这里有web.xml的配置),下面介绍两种方法:
方法1:(推荐使用,简单好理解)
Struts.xml:这里不指定页面,我们只需看到控制台的输出就ok了。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="p1" extends="struts-default" >
<action name="action1" class="com.heima.action.severletApiAction"></action>
</package>
</struts>
动作类severletApiAction:
package com.heima.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class severletApiAction extends ActionSupport {
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
HttpSession session = request.getSession();
System.out.println(request);
System.out.println(response);
System.out.println(application);
System.out.println(session);
return null;
}
}
控制台输出结果:
org.apache.struts2.dispatcher.StrutsRequestWrapper@8076fa
org.apache.catalina.connector.ResponseFacade@128de10
org.apache.catalina.core.ApplicationContextFacade@103db92
org.apache.catalina.session.StandardSessionFacade@1135fb8
注意:这个在运行的时候: http://localhost:8080/J2EE_severletApi/action1,要加上action1,否则会404错误
方法2:
Struts中的配置不变,动作类severletApiAction如下:
package com.heima.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class severletApiAction implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private HttpServletRequest request;
private HttpServletResponse response;
private ServletContext application;
public String execute(){
/* HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
HttpSession session = request.getSession();*/
System.out.println(request);
System.out.println(response);
System.out.println(application);
//System.out.println(session);
return null;
}
@Override
public void setServletContext(ServletContext application) {
this.application = application;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
这种方法实现了ServletRequestAware,ServletResponseAware,ServletContextAware这三个接口,通过注入的方式将三个值传入。这种方法运行过程较为复杂,实质是由一个拦截器实现的。具体可以看源码:在Java中ctrl + shift + t,输入ServletConfigInterceptor,可进入这个类中,有以下代码,其余的if都是跟这个一样的
final Object action = invocation.getAction(); //得到动作类的引用,也就是severletApiAction的对象
final ActionContext context = invocation.getInvocationContext(); //获取contex对象
if (action instanceof ServletRequestAware) { //看severletApiAction的对象是不是属于ServletRequestAware(实现了那三个接口,当然属于了)
HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); //获取request对象
((ServletRequestAware) action).setServletRequest(request); //action属于ServletRequestAware,可以强制转换成ServletRequestAware,然后调用我们方法中的setServletRequest方法。
}
这个解释已经用注释说明,其实就是我们的类实现了那三个接口,然后找方法的时候现在我们的类中找,我们类中有就用自己的,没有就去父类中找,我们自己的类中定义了setServletRequest方法,所以就用我们自己的了。
结果如下:
org.apache.struts2.dispatcher.StrutsRequestWrapper@790988
org.apache.catalina.connector.ResponseFacade@128de10
org.apache.catalina.core.ApplicationContextFacade@11c4d9e