自己写了一个缓存系统,没有使用任何框架。目前使用时都需要jsp页面传递request,然后得到application
如果不想每个功能都传递request怎样从java类中直接得到request?
就像struts一样可以直接使用ServletActionContext.getRequest ();   的方法得到request。
问题的前提是不使用任何框架就是普通的jsp系统。

解决方案 »

  1.   

    jsp就是一个servlet,request是它的一个内置对象。有现成的不用,反而要自己给他制定一个规则吗?你说的:“使用时都需要jsp页面传递request,然后得到application”中的application是什么意思?
      

  2.   

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    试试
      

  3.   

    楼主不用servlet吗?用就有这个啊。
      

  4.   

    回复请看清我的问题,这个不是简单的东西。我写的东西是一套仿hibernate框架的东西,前端显示比较复杂没有使用struts,就是使用纯jsp。其中一部分是系统缓存。一级系统缓存是存储在application中的。3楼不知道application只是你框架用太多把最基础的东西都给忘掉了。page,request,session,application这几个jsp内置对象你没听说过?是系统全局的至于4楼回复更是瞎扯,我问的是request属于那个包吗?
    回答这个问题的前提是你了解struts整个系统框架。或者自己就能够写框架这类人。
      

  5.   

    jsp里面本来就可以直接使用request,response啊,
      

  6.   

    .
    呵呵,我了解struts整个系统框架,觉得还是你比较强大!
      

  7.   

    不知道你啥意思。
    struts跟servlet是紧密耦合的。JSP本质也是一个servlet。
    response和request是由servlet容器提供给servlet的。
      

  8.   

    在一个类A中定义一个
    public class A{
    static ThreadLocal<HttpServletRequest> threadLocal = new ThreadLocal<HttpServletRequest>();
    }
    在你的JSP、Servlet中,先调用A.threadLocal.set(request);
    然后在你的类中就可以A.threadLocal.get()返回request对象了
    ThreadLocal可以避免多个线程访问造成的问题
      

  9.   

    其实你如果想直接获取到application那更简单,直接调用servlet的api获取ServletContext就行了。
      

  10.   

    楼主想要的是,在没有将request作为参数传递的前提下,jsp、Servlet中所调用的Java类可以通过某些方式取得当前的request对象。
    所以没有什么ServletContext之类的
    这里用ThreadLocal是一个选择,实际上Structs、Hiberante等都有使用这个类来处理的
      

  11.   

    楼主在自己造API , 我记得无论什么框架 底层都都会使用到API的东西, struts的action 也是继承了httpservlet哪怕不集成, 老爸的老爸也会集成, 楼主的意思是什么都不用,那你写的是java代码吗?还是自己新出的一门语言,还需要jre吗? 
      

  12.   

    模拟 struts ? 这个 可以用 servlet 里面的 过滤器 + 类反射  或者 代理实现  
    我记得我上课的时候 老师就是用这个 给实现  的  就 1个过滤器 + 普通java 类没有 servlet
    模拟  struts 运行在普通类中 能获取到request   
      

  13.   

    使用filter拦截 设置到一个ThreadLocal里
      

  14.   

    感觉你得研究一下struts2的东西了,它所使用的类全是纯的pojo,可以有效降低耦合性。
      

  15.   

    是自己要写个servlet  对不?
      

  16.   

    还是只有我来告诉你一个失传了很久的绝学:
    首先写一个类Global:这个类的共享变量主要是存放你每次的请求request对象,
    然后用一个filter,把request保存到上面的这个类的共享变量里这些准备工作做好之后,每次你有java类根本不用传这个参数,只有直接取就行了,比如:
    只要调用这个方法Global.getContext()就可以取得每次的request对象了,
    在这个类里写一下粗略的代码:
    public final class Global{ private static final ThreadLocal<HttpServletRequest> context = new ThreadLocal<HttpServletRequest>(); public static void setContext(HttpServletRequest request) {
    context.set(request);
    } public static HttpServletRequest getContext() {
    return context.get();
    }
    }
    大致讲一个思路在这里,具体代码涉及机密,不便透露
    该结帖了
      

  17.   

    可行,+1
    还有JSP本来就会被编译成servlet,而request是他的一个内置对象,难道楼主想重新自己定规则!
      

  18.   

    适应一个公司内部人使用,其实完全可以大家自己来写框架做的比SSH更加的简单易用,而SSH他是要做到适应所有的人、公司及其各种和样的环境来使用,所以有些东西完全可以的细细的封装一下,开发速度将提高至少一倍,属个人见解,没有要充什么的意思
      

  19.   

    servlet,filter其中也是借用ThreadLocal
      

  20.   

    需要这个类extends HttpServlet 吧?
      

  21.   

    其实你如果想直接获取到application那更简单,直接调用servlet的api获取ServletContext就行了。
    我也这么认为。。java类包中可以这样得到pageContext 然后通过他去获得相应的隐含对象
      

  22.   

    不明白 不懂 把系统缓存存在application里..
      

  23.   

    楼上几个人不明白楼主的意思。楼主的意思应该是指在一个普通的Java类中如何获取当前的request对象
    一般常用的方法就两种,一种就是把request作为参数传递到该类的方法中,另外一种就是我上面说到的使用一个static ThreadLocal 对象的方法
      

  24.   

    不懂为何要将request对象保存到那个地方..不过struts获得那个东西的方法....
      

  25.   

    我看了一下以上回复,使用filter拦截 设置到一个ThreadLocal还是一个比较行的通的方式。当初我想过这个方法,只是一直没有研究它的源码是怎样处理这个问题的。我做下测试没问题就结贴。
    还有很多人不知道到底我在做什么,就像23楼说的那样我这个是一个公司内部使用的框架。建好数据库表后使用工具生成基础代码,基本的crud操作全部生成好了,包括页面的javascript验证,那个组建是单选,多选,下拉框都是自动生成的。页面上实体属性的中文名称也是自动生成的。也就是说基本的增删改操作按一下生成按钮就可以不用管了。加传递request是为了得到application然后实现系统缓存的。现在缓存是完全可以使用了,就是页面要把request传递到实现缓存的基础类中很不爽。所以需要改进。
    32楼的问题很奇怪,全局使用的缓存不存储在application里面还能存储到那里?
      

  26.   


    我的缓存是存储在application里面的,application在java类中怎么得到?是通过request得到的(另外要request的原因是要取得操作者ip实现系统日志功能)在缓存的基类里面怎么得到request?我目前是通过jsp页面传递进去的,每个要使用缓存的页面都传递request很麻烦是吧?那就要在基类里面处理以后页面再也不用管了。
    如果你还是不太清楚,那如果是你自己实现缓存系统你会怎么实现?
      

  27.   

    看的挺晕的。
    其实我觉得没必要这样做,不知道楼主这样做是想解决什么问题。
    struts2把这些东西封成一个组件,另外还提供了action中类变量+getter/setter的方式,避免了不少直接操作servlet的Api的情况,而需要操作会话上下文等东西时直接由组合的方式从那个组件获得,而不是由execute方法作为参数传进来。这样做的一大优点就是:脱离web容器,更便于测试。ServletActionContext那个东东应该是以运行期代理增强类功能的方式将指定会话上下文什么的注入其中,才使得我们能在调用其获取方法时得到属于当前线程的会话或上下文,这个还得去看他源码才能确定这个猜想。
      

  28.   

    楼主很强大,“回复请看清我的问题,这个不是简单的东西。我写的东西是一套仿hibernate框架的东西,前端显示比较复杂没有使用struts,就是使用纯jsp。其中一部分是系统缓存。一级系统缓存是存储在application中的。3楼不知道application只是你框架用太多把最基础的东西都给忘掉了。page,request,session,application这几个jsp内置对象你没听说过?是系统全局的至于4楼回复更是瞎扯,我问的是request属于那个包吗? 
    回答这个问题的前提是你了解struts整个系统框架。或者自己就能够写框架这类人。”
    光就看你说的这段话,感觉很看不起人,你不想别人来回答,你就注明啊,“非此类人”请勿回答!。多打几个字不会少你一个手指。 特别是还反问好心的参与者,没听说过那几个jsp内置对象!我看你眼球不要老翘在天花板上;....多说无益...
      

  29.   

    楼主,我要说明的是,缓存是完全没必要放到application里的,32楼说的对,你这样做是可以实现,但是不优雅、别扭,完全可以用一个普通的java类实现缓存的操作,而且也可以用著名开源的缓存框架,实现原理都差不多,但是就是没听说过application里。
    还有要说明的是:楼主有点儿,有点儿。。那个意思。呵,心高什么什么气傲,别人回复的不好,可以不理,但是可不要小看人哦,也许你做的这一整套东西,有可能别人早就做过了,呵。一山还有一山高,虚心点儿,你就进步的更快。
    还有最后一点儿,csdn确实没有javaeye高手多,各位别拿砖砸我
      

  30.   

    看了半天看懂了,楼主是要写个servlet
      

  31.   

    .......我一直是没看懂 不过这些问题引发了一些新问题 可以体现出某些人的基础问题(比如我)比如 request 究竟是如何工作的?
    ServletActionContext与request的关系?等等等等等等.....看样子除了要知道request.getXXX setXXX还有必要了解很多东西啊 之前曾经找过一段时间这类信息 不过已经忘记了 
    再次证明 知识多少会限制人的想象力 完毕..
      

  32.   


    struts 中的action 和serlvet非继承关系
      

  33.   

    ...理解力啊。
    楼主只是想
    public class A{
      public void f(){
         request.xxx();
      }
    }
    而不是
    public class A{
      public void f(HttpServletRequest reqeust){
         request.xxx();
      }
    }
      

  34.   

    在一个类A中定义一个 
    public class A{ 
    static ThreadLocal <HttpServletRequest> threadLocal = new ThreadLocal <HttpServletRequest>(); 

    在你的JSP、Servlet中,先调用A.threadLocal.set(request); 
    然后在你的类中就可以A.threadLocal.get()返回request对象了 
    ThreadLocal可以避免多个线程访问造成的问
      

  35.   

    这个参数是肯定能够取到的,因为所有的数据都在请求中存在。
    不管是 action  还是 servlet ,他们都继承(实现) HttpServlet抽象类(或者是其他的借口)
    那楼主可以去看下 HttpServlet 这个类的源码,然后自己去写就ok了