方式1:让Action类实现接口.
ServletRequestAware:HttpServletRequest对象;
ServletResponseAware:HttpServletResponse对象;
ServletSessionAware:HttpSession对象;
package com.it.action;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
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.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.net.httpserver.HttpContext;
//方式1:让Action类实现感知接口.
//
//ServletRequestAware:HttpServletRequest对象;
//
//ServletResponseAware:HttpServletResponse对象;
//
//ServletSessionAware:HttpSession对象;
import com.sun.org.apache.regexp.internal.recompile;
public class ActionServlet1 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private static final long serialVersionUID = 1L;
HttpServletRequest request;
HttpServletResponse response;
ServletContext context;
@Override
public String execute() throws Exception {
response.setContentType("text/html;charset=utf-8");
//获取页面数据
String name = request.getParameter("username");
System.out.println(name);
//写响应页面数据
//response.getWriter().print("adfg");
// 往域中存数据 到页面展示
request.setAttribute("msg1","request");
request.getSession().setAttribute("msg2", "session");
context.setAttribute("msg3", "servletcontext");
return "ok";
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.response=response;
}
@Override
public void setServletContext(ServletContext context) {
// TODO Auto-generated method stub
this.context=context;
}
}
存在的问题,和ServletAPI耦合严重;
问题:Action中感知接口的方法是谁在调用?----->servletConfig拦截器(优先于Action执行)
方式2:通过ServletActionContext工具类.
通过ServletActionContext类中的静态方法,得到Servlet相关的Api
这种方式直接通过ServletActionContext的静态方法就可以获取Servlet的API对象,操作和理解非常简单.
在开发中很多人都喜欢使用,但是依然是Action与ServletAPI有耦合.
package com.it.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
//方式2:通过ServletActionContext工具类.
//
//通过ServletActionContext类中的静态方法,得到Servlet相关的Api
//
//这种方式直接通过ServletActionContext的静态方法就可以获取Servlet的API对象,操作和理解非常简单.
//
//在开发中很多人都喜欢使用,但是依然是Action与ServletAPI有耦合.
public class ActionServlet2 extends ActionSupport {
@Override
public String execute() throws Exception {
//获取response
HttpServletResponse response = ServletActionContext.getResponse();
//response.getWriter().print("response");
response.setContentType("text/html;charset=utf-8");
//获取request
HttpServletRequest request = ServletActionContext.getRequest();
String name = request.getParameter("username");
System.out.println(name);
//获取ServletContext
ServletContext context = ServletActionContext.getServletContext();
// 封装数据到域对象 到页面展示
request.setAttribute("msg1", "request");
request.getSession().setAttribute("msg2", "session");
context.setAttribute("msg3", "servletContext");
return "ok";
}
}
方式3:通过ActionContext工具类
Struts2将作用域对象重新使用Map集合进行了封装,所以现在操作作用域中的共享数据就是直接操作对应的Map集合
理解ActionContext:从字面上分析,表示Action的上下文对象.
ActionContext封装每一次请求的相关信息.
此时要获取请求对象实际上就是在获取ActionContext对象(因为ActionContext是对请求数据的封装,相当于就是一个请求对象)
可以使用ActionContext中的非静态方法来获取Servlet相关的API
所以需要获取到ActionContext的对象
获取ActionContext对象:
ActionContext ac= ActionContext.getContext();
在ActionContext中把request,session,application三大作用域都作为Map对象.
1):获取请求参数.
原始:Map<String,String[]> params = request.getParameterMap();
现在:Map<String,String[]> params = ac.getParameters();
2):操作request作用域:
原始:request.setAttribute(String name, Object value);
现在:ac.put(String key,Object value);
原始:Object val = request.getAttribtue(String name);
现在: Object val = ac.get(String name);
3):操作session作用域:
原始:HttpSession session =request.getSession();
现在:Map<String,Object> session = ac.getSession();
4):操作servletContext(application)作用域:
原始:ServletContext ac= request.getServletContext();
现在:Map<String,Object> app = ac.getApplication();
package com.it.action;
//方式3:通过ActionContext工具类
//Struts2将作用域对象重新使用Map集合进行了封装,所以现在操作作用域中的共享数据就是直接操作对应的Map集合
//理解ActionContext:从字面上分析,表示Action的上下文对象.
//ActionContext封装每一次请求的相关信息.
//此时要获取请求对象实际上就是在获取ActionContext对象(因为ActionContext是对请求数据的封装,相当于就是一个请求对象)
//可以使用ActionContext中的非静态方法来获取Servlet相关的API
//所以需要获取到ActionContext的对象
//获取ActionContext对象:
//ActionContext ac= ActionContext.getContext();
//在ActionContext中把request,session,application三大作用域都作为Map对象.
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ActionServlet3 extends ActionSupport {
@Override
public String execute() throws Exception {
//获取session的底层集合
ActionContext actionContext = ActionContext.getContext();
Map<String, Object> map = actionContext.getSession();
map.put("abcd", 45646);//等于:session.setAttribute("abcd", 45646);
//验证
HttpSession session = ServletActionContext.getRequest().getSession();
Object obj = session.getAttribute("abcd");
System.out.println(obj);//45646
//获取页面数据
Map<String, Object> parameters = actionContext.getParameters();//类似request.getParameterMap();
for(String key:parameters.keySet()) {
System.out.println(key+":"+Arrays.toString((String[])parameters.get(key)));
}
// 封装封装到域对象 页面展示
actionContext.put("msg1", "requset");
actionContext.getSession().put("msg2", "session....");
actionContext.getApplication().put("msg3", "servletContext..");
return "ok";
}
}