访问Servlet api
一.完全解耦,但只能操作作用域
1、不使用曾经学习过的servlet知识,可以去操作三个作用域
2、
ActionContext 工具类(Struts2的数据中心),action上下文对象
获得实例:ActionContext.getContext()
api:
ac.put(key,value), 相当于操作request作用域。request.setAttribute("key",value)
ac.getSession().put(key,value),相当于操作session作用域。session.setAttribute("key",value)
ac.getApplication().put(key,value),相当于操作application作用域。servletContext.setAtt...
提交的参数map, ac.getParameters();
在action中访问3大域和参数
Demo1Action:
package cn.hcx.f_servlet;
import java.util.Arrays;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class Demo1Action implements Action {
public String execute() throws Exception {
//如何在Action中访问3大域和 参数
//获得request
Map<String,Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//获得session
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
//获得application
Map<String, Object> applicationScope =ActionContext.getContext().getApplication();
//获得参数
Map<String, Object> params = ActionContext.getContext().getParameters();
requestScope.put("name", "requestTom");
sessionScope.put("name", "sessionTom");
applicationScope.put("name", "applicationTom");
//获得参数并打印
String[] names = (String[]) params.get("name");
System.out.println(Arrays.toString(names));
return SUCCESS;
}
}
struts.xml:
<struts>
<package name="servlet" namespace="/servlet" extends="struts-default">
<action name="Demo1Action" class="servlet.Demo1Action" method="execute">
<result name="success" type="dispatcher">/servlet/demo1.jsp</result>
</action>
</package>
</struts>
servlet/demo1.jsp:
<body>
${requestScope.name}<br>
${sessionScope.name}<br>
${applicationScope.name}<br>
</body>
二.操作servlet对象(耦合)
ServletActionContext 工具类,获得需要servlet对象
api:
ServletActionContext对象 获得 原生的 Servlet对象(不推荐使用)
package cn.hcx.f_servlet;
import java.util.Arrays;
import java.util.Map;
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.Action;
import com.opensymphony.xwork2.ActionContext;
public class Demo2Action implements Action {
public String execute() throws Exception {
//ServletActionContext对象 获得 原生的 Servlet对象
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response =ServletActionContext.getResponse();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();
return SUCCESS;
}
}
三.通过实现接口,struts注入(不推荐)
需要实现指定的接口,此接口都提供setter,struts在执行action方法之前,将调用setter方法进行赋值。
ServletRequestAware获得HttpServletRequest对象
ServletResponseAware 获得HttpServletResponse对象
ServletContextAware获得ServletContext对象
public class Demo5Action3 extends ActionSupport implements ServletRequestAware , ServletResponseAware ,ServletContextAware{
private HttpServletRequest request;
private HttpServletResponse response;
private ServletContext servletContext;
private HttpSession session;
@Override
public void setServletRequest(HttpServletRequest request) {
this.session = request.getSession();
this.request = request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletContext(ServletContext context) {
this.servletContext = context;
}
Demo1Action:
package servlet;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class Demo1Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware{
private HttpServletRequest request;
private HttpServletResponse response;
private Map<String, Object> session;
//注入request对象
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
//注入response对象
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
//注入session对象
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
public String execute(){
System.out.println(request);
System.out.println(response);
System.out.println(session);
return SUCCESS;
}
}
struts.xml:
<?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="servlet" namespace="/servlet" extends="struts-default" >
<action name="Demo1Action" class="cn.hcx.b_servlet.Demo1Action" method="execute" >
<result name="success" type="dispatcher" >/index.jsp</result>
</action>
</package>
</struts>