一个请求,调用了类A,A又调用B,B又调用C。 最后被调用的假设是Z的一个方法。我如何在Z的方法中,获取到session呢?前提是,Z的这个方法没有REQUEST参数,而且也不可能加上了。有办法吗,谢谢,紧急在线等。

解决方案 »

  1.   

    可以给所有的方法都加上HttpServletRequest request这个参数,这样不就可以取到?
      

  2.   

    你可以继承有request 的类 ,如A类 试试看
      

  3.   

    对,再传进去request.getSession()取得。
      

  4.   

    用1个全局的request变量应该可以
      

  5.   

    貌似不行了。
    1)你的Z类到底处于系统的哪一层?也就是MVC的哪一个模块,相信不是M就是C了,不可能是V。
    2)如果是M层,那你的系统设计就有问题。因为Session这些元素是属于v/c层面的,你却渗透的M层来了,设计不合理。
    3)如果是C层的,既然是C层,那为何Z类没有来自前台的HTTP请求参变量?(比如Http请求,http响应)。没有这些东西,你的前后台如何通信?你的系统设计依然有问题。综合起来,出现这种情况,只能说你的系统设计不合理,至少类的框架设计模糊,而且已经出现了耦合。
      

  6.   

    楼上其他人的回答,都是要修改Z类的设计。而LZ已经说了,Z的方法不能修改。
      

  7.   

    LZ说了,不能可能传递request
    同样session也应该不能传递了。
    如果是一个普通的java类中,而不是一个servlet的话,就只能通过参数传递了。而又不能传递参数,我想这样没有办法获取到了。
    如果LZ是想获取session中的值,你可以在C类中,自定一个一个方法。
    让B传递你想要的值给自定义方法,然后在Z方法中获取这个值。
      

  8.   

    拿不到request就拿不到session!
      

  9.   

    ServletRequestAware  这个接口
      

  10.   

    ActionContext.getContext().getSession()
      

  11.   

    我觉得在ACTION 层 把request 传过去   那样Z 不是可以使用request了啊
      

  12.   

    你要用session里面的什么参数 先取出来另保存格式就OK了不啊
      

  13.   

      如果你是使用的struts2 那么是你可以通过ServletActionContext.getRequest();来获取request的
      

  14.   

    请求都不传过去,怎么获得Session,
    即使能够获得Session,还有意义吗,
    Session中能取到什么?数据不是保存在请求中了吗?
      

  15.   

    既然不能可能传递request
    同样session也应该不能传递了。
    如果是一个普通的java类中,而不是一个servlet的话,就只能通过参数传递了。而又不能传递参数,我想这样没有办法获取到了。
    如果LZ是想获取session中的值,你可以在C类中,自定一个一个方法。
    让B传递你想要的值给自定义方法,然后在Z方法中获取这个值。
      

  16.   

    HttpSession session = request.getSession();
    session.setAttribute("s1",value);
    session.getAttribute("s1");
      

  17.   

    楼主如果你用的是struts2的话可以试试下面的方法获取各作用域的对象
            方法一:通过 ServletActionContext 对象获取
                    HttpServletRequest request=ServletActionContext.getRequest();
                    HttpServletResponse response=ServletActionContext.getResponse();
                    HttpSession session=request.getSession();
                    ServletContext applicaton=ServletActionContext.getServletContext();
            方法二:实现指定接口,由struts框架运行时注入
                    public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware{
                    private HttpServletRequest request;
                    private ServletContext servletContext;
                    private HttpServletResponse response;
                    public void setServletRequest(HttpServletRequest req) {
                            this.request=req;
                    }
                    public void setServletResponse(HttpServletResponse res) {
                            this.response=res;
                    }
                    public void setServletContext(ServletContext ser) {
                            this.servletContext=ser;
                    }
                    }
      

  18.   

    “不可能传request进去”,你都断了数据来源怎么给你取数据
      

  19.   

    如果要在底层获取session,比如逻辑层,或者持久层,能想到的只有传参,或者给调用session的类再写一个构造函数
    class A
    {
        public void B(HttpServletRequest request)
        {
            ...
        }
    }
    class A
    {
        HttpServletRequest request = null;
        public A(HttpServletRequest request)
        {
            this.request = request;
        }
        public void B()
        {
            ...
        }
    }
    出现这种情况,在设计上是否已经出现了弊端?
      

  20.   

    一定有变相的解决办法。
    如果楼主用了struts2那么就是:ActionContext.getContext().getSession()
    如果楼主用了dwr框架,那也可以,这个框架里面也提供了直接那出session的方法,我记不清了,如果需要我可以帮你翻一下api。
    既然这两个框架都能做到,自己手工代码也一定能实现。
      

  21.   

    继承A类,然后再Z类里写this.getRequest().getSession()
      

  22.   

    如果是servlet类或者struts类就用这个
    HttpServletRequest reque如果是普通类就得传值了
      

  23.   

    写一个javaBean 将Request作为一个属性传给这个bean。 
     然后将这个bean传给z
      

  24.   

    ActionContext.getContext().getSession()
      

  25.   

    struts2是完全可以取到的,别被上面的误导了
    HttpSession session = ServletActionContext.getRequest().getSession();
    ActionContext.getContext().getSession()这个取到的是一个MAP,不知道具体行不
      

  26.   


    request.getSession().setAtrribute("");
      

  27.   

    Z的这个方法可以传什么样的参数?
    实际上session也是一个对象,你可以通过请求的action获取session对象然后将session封装到一个对象里面在传到这个方法中去
      

  28.   

    HttpSession session = request.getSession();
    session.setAttribute("s1",value);
    code]
    .............................
    [code=Java]session.getAttribute("s1");[/
      

  29.   

    声明静态变量 ThreadLocal 
    有A方法中调用 ThreadLocal 的set(你的session)方法
    在B ,C,Z方法用可用ThreadLocal 的get方法得到你的session
      

  30.   

    不修改方法的话~
    能否在ABC.......直到Z类中private一个session对象
    并提供get/set方法
    然后逐层set进去
      

  31.   

    我不信你和C交互的的A类也无法设置传递一个session或者request进去~
      

  32.   


    HttpSession session = new HttpSession();
    session.setAttribute().......session.getAttribute()这样不就可以吗
    session是域对象,只要在用户的浏览器不关闭,走在一个进程内都有效的啊~~~~
    request是只在一次请求内有效的
    如果还是不行你可以选择用pageContext来解决