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的方式是最直接的,但也是耦合度最高的