一.解耦方式
为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts2对HttpServletRquest, HttpSession, ServlcetContext进行了封装,构造了三个Map对象.com.opensymphony.xwork2.ActionContext
ActionContext是action执行的上下文,在ActionContext中保存了action执行所需要的一组对象,包括 parameters, request, session application locale.
1.通过ActionContent得到对象LoginAction.java
package com.action;
import java.util.Map;
import com.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction implements Action, ModelDriven<User> {
public LoginAction() {
System.out.println("in LoginAction");
}
private User user = new User();// 直接实例化
@Override
public User getModel() {
System.out.println(" in getModel");
return user;
}
@Override
public String execute() throws Exception {
System.out.println(" in execute");
if ("mgc".equalsIgnoreCase(user.getName()) && "mgc".equals(user.getPassword())) {
ActionContext context = ActionContext.getContext();
Map<String, Object> request = (Map) context.get("request");// ActionContext并没有提供一个专门得到request的方法,要
Map<String, Object> session = context.getSession();//
Map<String, Object> application = (Map) context.getApplication();
request.put("greeting", "欢迎您来到我们的网站...");// 在请求中放置欢迎信息
session.put("user", user);// 将user对象放置session中
Integer counter = (Integer) application.get("counter");// 网站的访问记数 ,重启无效
counter = null == counter ? 1 : ++counter;
application.put("counter", counter);
return SUCCESS;
}
else
return ERROR;
}
}
2.通过实现接口LoginAction.java
package com.action;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction implements Action, ModelDriven<User>, RequestAware, SessionAware, ApplicationAware {//在这里实现接口
public LoginAction() {
System.out.println("in LoginAction");
}
//通过接口向对象设置值
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
private User user = new User();// 直接实例化
public void setRequest(Map<String, Object> request) {
System.out.println("in setRequest");
this.request = request;
}
public void setSession(Map<String, Object> session) {
System.out.println("in setSession");
this.session = session;
}
public void setApplication(Map<String, Object> application) {
System.out.println("in setApplication");
this.application = application;
}
@Override
public User getModel() {
System.out.println(" in getModel");
return user;
}
@Override
public String execute() throws Exception {
System.out.println(" in execute");
if ("mgc".equalsIgnoreCase(user.getName()) && "mgc".equals(user.getPassword())) {
request.put("greeting", "欢迎您来到我们的网站...");// 在请求中放置欢迎信息
session.put("user", user);// 将user对象放置session中
Integer counter = (Integer) application.get("counter");// 网站的访问记数 ,重启无效
counter = null == counter ? 1 : ++counter;
application.put("counter", counter);
return SUCCESS;
} else
return ERROR;
}
}
二.耦合方式
要直接获取HttpServletRequest和ServletContext对象,在这个类中定义两个静态方法,可以使用org.apache.struts2.ServletActionContext 类,这个类是ActionContext的子类.public static HttpServletRequest getRequest()
public static ServletContext getServletContext()
package com.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction implements Action, ModelDriven<User> {
public LoginAction() {
System.out.println("in LoginAction");
}
private User user = new User();// 直接实例化
@Override
public User getModel() {
System.out.println(" in getModel");
return user;
}
@Override
public String execute() throws Exception {
System.out.println(" in execute");
if ("mgc".equalsIgnoreCase(user.getName()) && "mgc".equals(user.getPassword())) {
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
request.setAttribute("greeting", "欢迎您来到我们的网站...");// 在请求中放置欢迎信息
session.setAttribute("user", user);// 将user对象放置session中
Integer counter = (Integer) application.getAttribute("counter");// 网站的访问记数 ,重启无效
counter = null == counter ? 1 : ++counter;
application.setAttribute("counter", counter);
return SUCCESS;
} else
return ERROR;
}
}
还可以实现接口设置对象
LoginAction.java
package com.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import com.entity.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction implements Action, ModelDriven<User>, ServletRequestAware, ServletContextAware {//实现接口
public LoginAction() {
System.out.println("in LoginAction");
}
private HttpServletRequest request;
private ServletContext context;
//通过接口设置对象
@Override
public void setServletContext(ServletContext context) {
this.context = context;
}
//通过接口设置对象
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
private User user = new User();// 直接实例化
@Override
public User getModel() {
System.out.println(" in getModel");
return user;
}
@Override
public String execute() throws Exception {
System.out.println(" in execute");
if ("mgc".equalsIgnoreCase(user.getName()) && "mgc".equals(user.getPassword())) {
HttpSession session = request.getSession();
request.setAttribute("greeting", "欢迎您来到我们的网站...");// 在请求中放置欢迎信息
session.setAttribute("user", user);// 将user对象放置session中
Integer counter = (Integer) context.getAttribute("counter");// 网站的访问记数 ,重启无效
counter = null == counter ? 1 : ++counter;
context.setAttribute("counter", counter);
return SUCCESS;
} else
return ERROR;
}
}