struts 2中如何通过action手动获取参数
struts2中action手动获取Session,jsp页面参数
1. ActionContext
在Struts2开拓中,除了将请求参数自动配置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,
甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操纵.
我们需要在Action中取得request请求参数"username"的值:
ActionContext context = ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");
在执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map罢了),它存放的是Action在执行时需要用到的工具.
一般环境, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get();来获取的.
我们再来看看这里的actionContext工具的建设:
static ThreadLocal actionContext = new ActionContextThreadLocal();
ActionContextThreadLocal是实现ThreadLocal的一个内部类.
ThreadLocal可以定名为"线程局部变量",它为每一个利用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变本身的副本,
而不会和其它线程的副本斗嘴.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而担保它是线程安详的.
通过ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession();
2. ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接担任了我们上面先容的ActionContext,
它提供了直接与Servlet相关工具会见的成果,它可以取得的工具有:
(1)javax.servlet.http.HttpServletRequest : HTTPservlet请求工具
(2)javax.servlet.http.HttpServletResponse : HTTPservlet相应工具
(3)javax.servlet.ServletContext : Servlet上下文信息
(4)javax.servlet.ServletConfig : Servlet设置工具
(5)javax.servlet.jsp.PageContext : Http页面上下文
如何从ServletActionContext里取得Servlet的相关工具:
<1>取得HttpServletRequest工具: HttpServletRequest request = ServletActionContext. getRequest();
<2>取得HttpSession工具: HttpSession session = ServletActionContext. getRequest().getSession();
3. ServletActionContext和ActionContext接洽
ServletActionContext和ActionContext有着一些反复的成果,在我们的Action中,该如何去决议呢?
我们遵循的原则是:假如ActionContext可以或许实现我们的成果,那最好就不要利用ServletActionContext,让我们的Action只管不要直接去会见Servlet的相关工具.
留意:在利用ActionContext时有一点要留意: 不要在Action的结构函数里利用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有配置,
这时通过ActionContext取得的值也许是null;
同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在结构函数中,也不要直接将req作为类变量给其赋值。
至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安详的,
而ServletActionContext担任自ActionContext,所以ServletActionContext也线程安详,线程安详要求每个线程都独立举办,所以req的建设也要求独立举办,
所以ServletActionContext.getRequest()这句话不要放在结构函数中,也不要直接放在类中,
而应该放在每个详细的要领体中(eg:login()、queryAll()、insert()等),这样才气担保每次发生工具时独立的成立了一个req。
4. struts2中得到request、response和session
(1)非IoC方法
要领一:利用org.apache.struts2.ActionContext类,通过它的静态要领getContext()获取当前Action的上下文工具。
ActionContext ctx = ActionContext.getContext();
ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
Map session = ctx.getSession(); //session
HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
细心的伴侣可以发明这里的session是个Map工具, 在Struts2中底层的session都被封装成了Map范例.
我们可以直接操纵这个Map工具举办对session的写入和读取操纵, 而不消去直接操纵HttpSession工具.
要领二:利用org.apache.struts2.ServletActionContext类
public class UserAction extends ActionSupport { //其他代码片断 private HttpServletRequest req; // private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在结构要领中也是错误的。 public String login() { req = ServletActionContext.getRequest(); //req的得到必需在详细的要领中实现 user = new User(); user.setUid(uid); user.setPassword(password); if (userDAO.isLogin(user)) { req.getSession().setAttribute("user", user); return SUCCESS; } return LOGIN; } public String queryAll() { req = ServletActionContext.getRequest(); //req的得到必需在详细的要领中实现 uList = userDAO.queryAll(); req.getSession().setAttribute("uList", uList); return SUCCESS; } //其他代码片断 }
(2)IoC方法(纵然用Struts2 Aware拦截器)
#p#分页标题#e#
要利用IoC方法,我们首先要汇报IoC容器(Container)想取得某个工具的意愿,通过实现相应的接口做到这点。
public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { private HttpServletRequest request; private HttpServletResponse response; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } public String execute() { HttpSession session = request.getSession(); return SUCCESS; }