zoukankan      html  css  js  c++  java
  • 获取Session和request方法

    action中的几种写法

    //第一种很少用
    public class LoginAction1 extends ActionSupport {
        
        private Map request;
        private Map session;
        private Map application;
        
        public LoginAction1() {
            request = (Map)ActionContext.getContext().get("request");
            session = ActionContext.getContext().getSession();
            application = ActionContext.getContext().getApplication();
        }
        
        public String execute() {
            request.put("r1", "request1");
            session.put("s1", "session1");
            application.put("a1", "application1");
            return SUCCESS; 
        }
    }
    //第二种几乎都用这种方式
    public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
        
        private Map<String, Object> request;
        private Map<String, Object> session;
        private Map<String, Object> application;
        
        //DI dependency injection
        //IoC inverse of control
        public String execute() {
            request.put("r1", "r1");
            session.put("s1", "s1");
            application.put("a1", "a1");
            return SUCCESS; 
        }

        @Override
        public void setRequest(Map<String, Object> request) {
            this.request = request;
        }

        @Override
        public void setSession(Map<String, Object> session) {
            this.session = session;
        }

        @Override
        public void setApplication(Map<String, Object> application) {
            this.application = application;
        }
        
        
    }
    //第三种很少用
    public class LoginAction3 extends ActionSupport {
        
        private HttpServletRequest request;
        private HttpSession session;
        private ServletContext application;
        
        public LoginAction3() {
            request = ServletActionContext.getRequest();
            session = request.getSession();
            application = session.getServletContext();
        }
        
        public String execute() {
            request.setAttribute("r1", "r1");
            session.setAttribute("s1", "s1");
            application.setAttribute("a1", "a1");
            return SUCCESS; 
        }
        
    }
    //第四种很少用
    public class LoginAction4 extends ActionSupport implements ServletRequestAware {
        
        private HttpServletRequest request;
        private HttpSession session;
        private ServletContext application;
        
        
        
        public String execute() {
            request.setAttribute("r1", "r1");
            session.setAttribute("s1", "s1");
            application.setAttribute("a1", "a1");
            return SUCCESS; 
        }



        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
            this.session = request.getSession();
            this.application = session.getServletContext();
        }
        
    }

    jsp页面获取request/session/application中的值

    1 <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
    2     <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
    3     <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
    4     <s:property value="#attr.a1"/><br />
    5     <s:property value="#attr.s1"/><br />
    6     <s:property value="#attr.r1"/><br />

    一下是我看到的一篇讲的比较详细的文章:

    在Struts1.*中,要想访问request、response以及session等Servlet对象是很方便的,因为它们一直是作为形参在各个方法之间进行传递的,而在Struts2中我们就很难看到它们的芳踪了,因为我们获得表单中的值都是通过预先设置好了的get方法来得到的,那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到,那么应该怎么做呢?按照Max的教程上的说法,可以分为两种:IoC方式和非IoC方式,如何理解这两种方式的区别呢?IoC是Spring里面的特征之一,字面意思是反转控制,说白了就是依赖注入,比方说类A依赖类B,那么就主动的给A注入一个类B的对象,下面看一下这两种方法的具体实现。
    1.非Ioc方式
    这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
    获得request对象:

    1. HttpServletRequest request = ServletActionContext.getRequest ();
    2. ActionContext ct= ActionContext.getContext()
    3.    HttpServletRequest request=
    4. (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);

    获得session对象:
    在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。

    1. Map session=ActionContext.getSession();
    2. Map session=(Map)ActionContext.getContext().getActionContext.SESSION);

    得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。
    2.IoC方式
    这种方式相对来说变化就比较少了,具体流程如下所示。
    获得request对象:
    第一步:让action实现ServletRequestAware接口
    第二步:在action中声明一个HttpServletRequest类型的实例变量
    第三步:在action中实现ServletRequestAware接口的setServletRequest方法,实现方式很简单,如下所示。
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest request) {
    this.request = request;
    }
    获得Session对象(注意,此时的session是SessionMap类型):
    第一步:让action实现SessionAware接口
    第二步:在action中声明一个HttpServletRequest类型的实例变量
    第三步:在action中实现SessionAware接口的setSession方法,实现方式很简单,如下所示。
    private Map session;
    publicvoid setSession(Map session) {
    this. session = session;
    }
    以下是另一篇关于得到Request和Session的文章:

      1. 在Struts2里,如果需要在Action中使用session,可以通过下面两种方式得到
      2. 1.通过ActionContext class中的方法getSession得到
      3. 2.Action实现org.apache.struts2.interceptor.SessionAware接口的方式来对session进行操作
      4.  
      5. 下面先看一个采用第一种方式,在action中得到session的例子
      6. package s2.ex.action;
      7.  
      8.  
      9. import java.util.Map;
      10.  
      11.  
      12. import com.opensymphony.xwork2.ActionContext;
      13.  
      14. import com.opensymphony.xwork2.ActionSupport;
      15.  
      16.  
      17. public class SessionTestAction extends ActionSupport { 
      18.  
      19.  
      20.     public String execute() { 
      21.  
      22.      ActionContext actionContext = ActionContext.getContext();
      23.  
      24.        Map session = actionContext.getSession();
      25.  
      26.        session.put("USER_NAME", "Test User");
      27.  
      28.        return SUCCESS;
      29.  
      30.     } 
      31.  
      32. }
      33. 在这个例子中,通过ActionContext得到session,并往session里放置一个key为USER_NAME,值为Test User的内容。
      34.  
      35. 下面是一个实现org.apache.struts2.interceptor.SessionAware接口来对session操作的例子
      36. package s2.ex.action;
      37.  
      38.  
      39. import java.util.Map;
      40.  
      41.  
      42. import org.apache.struts2.interceptor.SessionAware;
      43.  
      44.  
      45. import com.opensymphony.xwork2.ActionSupport;
      46.  
      47.  
      48. public class SessionTest1Action extends ActionSupport implementsSessionAware { 
      49.  
      50.     private Map session;
      51.  
      52.     public void setSession(Map session) { 
      53.  
      54.        this.session = session;
      55.  
      56.  
      57.     } 
      58.  
      59.     public String execute() { 
      60.  
      61.        this.session.put("USER_NAME", "Test User 1");
      62.  
      63.        return SUCCESS;
      64.  
      65.     } 
      66.  
      67. }
      68.  
      69. 在这个例子中实现了接口SessionAware中的setSession方法。
      70.  
      71. 上面两种方式都可以得到session,能实现的功能都是一样的。
      72. 这里推荐通过第二种方式来使用session,原因是便于做单体测试,用第二种方式,只需要构造一个Map就可以对action class进行单体测试了。
      73.  
      74.     在一个项目中可能会有很多action都需要用到session,如果每个action都来实现org.apache.struts2.interceptor.SessionAware这个接口,可能会显得比较麻烦,所以建议作一个抽象的BaseAction类来实现org.apache.struts2.interceptor.SessionAware接口,以后所有的action只要继承这个BaseAction就可以了。
      75.  
      76. 下面是一个如何在JSP中使用session的例子。
      77. <%@ page contentType="text/html; charset=UTF-8" %>
      78.  
      79. <%@page pageEncoding="utf-8" %>
      80.  
      81. <%@taglib prefix="s" uri="/struts-tags" %>
      82.  
      83. <html>
      84.  
      85. <head>
      86.  
      87.     <title>Session Test</title>
      88.  
      89. </head>
      90.  
      91.  
      92. <body>
      93.  
      94. <h1><s:property value="#session.USER_NAME"/></h1>
      95.  
      96. <h1></h1>
      97.  
      98. </body>
      99.  
      100. </html>
      101.  
      102.    一般在项目中往往会往session里放置一个Object,必如说user,user里有个boolean admin和String userName,如果user里存在isAdmin的方法,在jsp中可以通过<s:if test="#session.user.admin">来判断用户有没有管理权限,通过<s:propertyvalue="#session.user.userName">或者来取得用户名。
  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/seely/p/4447063.html
Copyright © 2011-2022 走看看