通过ActionContext
struts2框架提供了ActionContext类来访问servletAPI,ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session、application等
ActionContext中访问Servlet API的方法
代码体现
- 编写一个form表单,获取参数
<body>
<form action="${pageContext.request.contextPath }/userAction" method="post">
<input type="text" name="username"></br>
<input type="text" name="password"></br>
<input type="submit" value="提交">
</form>
</body>
- 编写Action类,获得各个域对象
package com.zillion.action;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
@Override
public String execute() throws Exception {
//获得ActionContext对象
ActionContext context = ActionContext.getContext();
//ActionContext对象本身就是一个request域,通过ActionContext获得表单提交的参数,返回值结果为map集合
Map<String, Object> parameters = context.getParameters();
//遍历map获得表单参数
Set<String> keySet = parameters.keySet();
for (String key : keySet) {
String[] value = (String[]) parameters.get(key);
System.out.println(key+" "+value[0]);
}
//向request域中存放值
context.put("request", "request");
//获得application域对象
Map<String, Object> application = context.getApplication();
application.put("application", "application");
//获得session域对象
Map<String, Object> session = context.getSession();
session.put("session", "session");
return SUCCESS;
}
}
- 配置action
<action name="userAction" class="com.zillion.action.UserAction" method="execute">
<result name="success">/success.jsp</result>
</action>
- jsp页面获取域对象值
<body>
${request }
${application }
${session }
</body>
使用ServletActionContext获得原生的域对象
获得域对象的方法
- jsp页面还是一个表单
- 编写Action类中的方法
public String method() throws Exception {
//获得request作用域
HttpServletRequest request = ServletActionContext.getRequest();
//获得参数值
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+" "+password);
request.setAttribute("request", "request");
//通过request作用域获得session作用域
HttpSession session = request.getSession();
session.setAttribute("session", "session");
//获得响应对象
HttpServletResponse response = ServletActionContext.getResponse();
//获得ServletContext作用域——也就是application作用域
ServletContext application = ServletActionContext.getServletContext();
application.setAttribute("application", "application");
//获得PageContext作用域——也就是page域
PageContext pageContext = ServletActionContext.getPageContext();
return SUCCESS;
}
通过实现特点接口访问
struts2虽然提供了ActionContext类来访问Servlet API,虽然这种方法可以访问Servlet API,但无法直接获得原生的Servlet API对象,所以为了获得原生的API,struts2提供了一些接口。
- 代码体现
实现ServletRequestAware接口,并重写该方法,就可以获得原生的request域,然后将request设置为全局变量,这样在其他方法中就可以使用了
public class UserAction extends ActionSupport implements ServletRequestAware{
HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
结论
从以上内容可以看出,借助于ServletActionContext类的帮助,开发者可以直接访问Servlet API,避免了去一一实现ServletRequestAware、ServletResponseAware、SessionAware、ServletContextAware等相关接口,虽然如此,该Action依然与Servlet API直接耦合,不利于程序解耦,所以建议开发中使用ActionContext。