struts 2中如何通过action手动获取参数
当前位置:以往代写 > JAVA 教程 >struts 2中如何通过action手动获取参数
2019-06-14

struts 2中如何通过action手动获取参数

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;  
    }

    关键字:

在线提交作业