1、使用ActionContext对象,采用解耦合的方式访问ServletAPI
ActionContext context = ActionContext.getContext();
jsp
<form action="${pageContext.request.contextPath }/demo04/scope1.action" method="post"> <input type="text" name="scopetext" /> <input type="submit" value="提交" /> </form>
action,通过context获取的对象都是Map,这种方式完全与Servlet解构
public class ScopeAction1 extends ActionSupport { @Override public String execute() { ActionContext context = ActionContext.getContext(); //parameters Map<String, Object> parameters = context.getParameters(); //default return object String[] strs = (String[]) parameters.get("scopetext"); System.out.println(strs[0]); //request scope context.put("reqinfo", "request scope"); System.out.println(context.get("reqinfo")); //session scope Map<String, Object> session = context.getSession(); session.put("sessioninfo", "session sceop"); System.out.println(session.get("sessioninfo")); //appliction scope Map<String, Object> application = context.getApplication(); application.put("appinfo", "application scope"); System.out.println(application.get("appinfo")); return NONE; } }
配置
<package name="demo04" namespace="/demo04" extends="struts-default"> <action name="scope1" class="demo04.ScopeAction1"> </action> </package>
2、使用接口注入的方式使用ServletAPI
jsp
<form action="${pageContext.request.contextPath }/demo04/scope2.action" method="post"> <input type="text" name="scopetext" /> <input type="submit" value="提交" /> </form>
Action,通过实现接口,设置setXXX来获取HttpServletXXX对象
public class ScopeAction2 extends ActionSupport implements ServletContextAware, ServletResponseAware, ServletRequestAware { private HttpServletResponse response; private ServletContext context; private HttpServletRequest request; @Override public String execute() { System.out.println(request.getParameter("scopetext")); // request scope request.setAttribute("reqinfo", "request scope"); System.out.println(request.getAttribute("reqinfo")); // session scope HttpSession session = request.getSession(); session.setAttribute("sessioninfo", "session sceop"); System.out.println(session.getAttribute("sessioninfo")); // appliction scope context.setAttribute("appinfo", "application scope"); System.out.println(context.getAttribute("appinfo")); return NONE; } @Override public void setServletResponse(HttpServletResponse response) { this.response = response; } @Override public void setServletContext(ServletContext context) { this.context = context; } @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } }
配置
<action name="scope2" class="demo04.ScopeAction2"> </action>
3、通过ServletActionContext耦合的方式获取ServletAPI
jsp
<form action="${pageContext.request.contextPath }/demo04/scope3.action" method="post"> <input type="text" name="scopetext" /> <input type="submit" value="提交" /> </form>
Action
public class ScopeAction3 extends ActionSupport { @Override public String execute() { System.out.println(ServletActionContext.getRequest().getParameter("scopetext")); // request scope ServletActionContext.getRequest().setAttribute("reqinfo", "request scope"); System.out.println(ServletActionContext.getRequest().getAttribute("reqinfo")); // session scope HttpSession session = ServletActionContext.getRequest().getSession(); session.setAttribute("sessioninfo", "session sceop"); System.out.println(session.getAttribute("sessioninfo")); // appliction scope ServletContext context = ServletActionContext.getServletContext(); context.setAttribute("appinfo", "application scope"); System.out.println(context.getAttribute("appinfo")); return NONE; } }
配置
<action name="scope3" class="demo04.ScopeAction3"> </action>
这三种方式最好的是第一种,Action和Servlet完全解耦合,通过ServletActionContext的方式是最直接的,但也是耦合度最高的