Struts2有4种方式去获取servletAPI,其实就是有4种方式获得request,
也可以说是两种方式,一种解耦,一种耦合。解耦就是通过ActionContext对象(里面存放了Action执行所需要的对象)来获取ServletAPI,将Struts2和servlet解耦,这样就可以,也就是好处,在测试的时候不需要启动服务器就可以测试,用main方法就可以,一定程序上可以提高开发效率)。通过ActiionContext获取的request,session等不是真正的HttpServletRequest等对象,而是将对象的值重新包装成了map对象,这样的封装,我们既获取了我们需要的值,同时避免了和web容器直接打交道,实现了完全的解耦
(1)
public String execute(){
System.out.println(name+"---"+pwd);
if("siggy".equals(name)&&"1111".equals(pwd)){
//获取session
ActionContext.getContext().getSession().put("user", name);
//获取request---HttpServletRequest对象的attributes
Map<String,Object> request = (Map)ActionContext.getContext().get("request");
//获取application
Map<String,Object> application=ActionContext.getContext().getApplication();
//获取parameters
Map<String,Object> parameters = ActionContext.getContext().getParameters();
//相当于;request.getParameter("name");name的值存放在数组里,因为可能有多个,所以先把Object转换为数组再取第一个
System.out.println("name===="+((String[])parameters.get("name"))[0]);
return "success";
}else{
return "login";
}
}
}
public String logout(){
//退出的时候session清除对应账户
ActionContext.getContext().getSession().remove("user");
System.out.println("退出");
return "success";
}
(2)
通过ActionContext直接获取HttpServletRequest
HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
request.getSession().setAttribute("user", name);
System.out.println("name===="+request.getParameter("name"));
(3)通过耦合的方式获取HttpServletRequest,实现ServletRequestAware接口(这种方式其实内部源码就是第二种)
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction2 implements ServletRequestAware{
private String name;
private String pwd;
HttpServletRequest request;
//处理方法
public String execute(){
System.out.println(name+"---"+pwd);
if("siggy".equals(name)&&"1111".equals(pwd)){
request.getSession().setAttribute("user", name);
System.out.println("name===="+request.getParameter("name"));
return "success";
}else{
return "login";
}
}
//这个是接口的方法,不是属性的set方法注意
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public String logout(){
ActionContext.getContext().getSession().remove("user");
System.out.println("退出");
return "success";
}
//set/get方法就略了
}
(4)耦合通过ServletActionContext获取HttpServletRequest对象
HttpServletRequest request = ServletActionContext.getRequest();
request.getSession().setAttribute("user", name);
System.out.println("name===="+request.getParameter("name"));
建议用第一种或者第四种