啊?我说得还行吧!
简单点: 我有办法拿到JAVA运行时动态编译出来的JSP页面类的实例吗?

解决方案 »

  1.   

    有的时候需要在后台代码调用前台页面里定义的函数这个不行。
    就好象JS不能调JAVA代码一样。
    这是WEB服务器的问题。
    它先加载了LIB包。和你的JAVA类。
    然后,servlet是受WEB服务器管理的。
    并不是你的一般的类。
    你想穿过WEB服务器来取它里面的内容,你想想,这是怎么样的??
      

  2.   

    再说,SEVLET只有一份,
    就是你能穿过WEB服务器,
    那你怎么NEW出来呀??
    你要取到WEB服务器启用的时候,NEW出来的那个实例??
      

  3.   

    是的,我觉得应该可以.我发现我们做的代码用的是:WebappClassLoader
    而jsp用的是:org.apache.jasper.servlet.JasperLoader是否可以用后者进行LOAD呢?再说了,我能否像.net一样拿到一个class文件进行加载呢?如果可以那样的话,我不是可以直接找到动态编译出来的类文件加载之?
      

  4.   

    当然可以了,但是你的程序需要调用容器提供Loader才行,就向你上面说的一样。但是我不知道为了这么一个需求就调用容器中的类,这样就使得你的程序和特定的容器耦合在一起了,以后你的程序想要部署到其它容器中就不能够了。所以还是采用其它方案解决好,我是这么觉得的。
      

  5.   

    to guozhanxian(蝈蝈)现在的我就是为了解决问题,能详细说说如何调用容器提供Loader?我试了,很难成功.1 下面这段是可以找到org.apache.jsp.xbgtest_jsp但报JspSourceDependent没有定义,因为该JSP类继承了这个接口File filePath = new
     File("C:/Tomcat5.0/work/Catalina/localhost/balasbrid/");
     ClassLoader loader = new URLClassLoader(new URL[] {
     filePath.toURL() });
     //classLoader = this.getClass().getClassLoader();

     Class beanClass = null;
     try
     {
     
     
     //System.out.println("====>"+loader.toString());
     
     beanClass = loader.loadClass("org.apache.jsp.xbgtest_jsp");
     System.out.println(beanClass.getName());
     }
     catch (ClassNotFoundException e)
     {
     e.printStackTrace();
     }2 又换了方案,把要加载的全加载了,还是不行.ClassLoader loader = this.getClass().getClassLoader();
    String basePackage = "org.apache.jasper.";
            try
            {
                loader.loadClass(basePackage + "runtime.JspFactoryImpl$PrivilegedGetPageContext");
                loader.loadClass(basePackage + "runtime.JspFactoryImpl$PrivilegedReleasePageContext");
                loader.loadClass(basePackage + "runtime.JspRuntimeLibrary");
                loader.loadClass(basePackage + "runtime.JspRuntimeLibrary$PrivilegedIntrospectHelper");
                loader.loadClass(basePackage + "runtime.ServletResponseWrapperInclude");
                loader.loadClass(basePackage + "runtime.TagHandlerPool");
                loader.loadClass(basePackage + "runtime.JspFragmentHelper");
                loader.loadClass(basePackage + "runtime.ProtectedFunctionMapper");
                loader.loadClass(basePackage + "runtime.ProtectedFunctionMapper$1");
                loader.loadClass(basePackage + "runtime.ProtectedFunctionMapper$2");
                loader.loadClass(basePackage + "runtime.ProtectedFunctionMapper$3");
                loader.loadClass(basePackage + "runtime.ProtectedFunctionMapper$4");
                loader.loadClass(basePackage + "runtime.PageContextImpl");
                loader.loadClass(basePackage + "runtime.PageContextImpl$1");
                loader.loadClass(basePackage + "runtime.PageContextImpl$2");
                loader.loadClass(basePackage + "runtime.PageContextImpl$3");
                loader.loadClass(basePackage + "runtime.PageContextImpl$4");
                loader.loadClass(basePackage + "runtime.PageContextImpl$5");
                loader.loadClass(basePackage + "runtime.PageContextImpl$6");
                loader.loadClass(basePackage + "runtime.PageContextImpl$7");
                loader.loadClass(basePackage + "runtime.PageContextImpl$8");
                loader.loadClass(basePackage + "runtime.PageContextImpl$9");
                loader.loadClass(basePackage + "runtime.PageContextImpl$10");
                loader.loadClass(basePackage + "runtime.PageContextImpl$11");
                loader.loadClass(basePackage + "runtime.PageContextImpl$12");
                loader.loadClass(basePackage + "runtime.PageContextImpl$13");
                loader.loadClass(basePackage + "runtime.JspContextWrapper");
                loader.loadClass(basePackage + "servlet.JspServletWrapper");
                loader.loadClass(basePackage + "runtime.JspWriterImpl$1");
                
                loader.loadClass(basePackage + "runtime.JspSourceDependent");
               
                Class.forName("com.egosystems.balasbrid.xbgtest",false,loader);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
    我感觉就差一步了.是不是JAVA有方法提供可以直接从当前容器中遍历类和加载器的功能?
      

  6.   

    穿过WEB服务器,就为了取得JSP的一段代码??是一开始碰到这个问题的时候,没想清,感觉很容易,后面发现不是那么回事、
    还是现在想专研一下??
    如果可以这样子穿。
    那换WEB服务器怎么办,
    WEB服务器做集群了又怎么办?
      

  7.   

    这是一个藕合的问题了.
    现在想不了这么多,先把技术性问题搞定.
    通过昨天一晚上折腾,终于搞定了.呵呵.其实就是把编译的类最后的路径确定好再把该类需要的包也准备好,用URLClassLoader加载器就可以了.至于web服务器更换,应该也不是问题,像tomcat的路径在work下,websphere在temp下.判断就可以了.
      

  8.   

    又发现一个问题,
    因为我是在页面加载之前做后台代码,然后执行页面.也就是说因为动态编译的原因,第一次加载时,我的后台代码在前,所以拿不到这个页面类,因为他是在执行后编译生成的.请求 --> filter --> 后台类 --> doFilter --> 编译 --> 页面类生成从上面可以看出来,在页面没有生成类之前,我是拿不到的,只有第二次访问时才能拿到.怎么办呢?
      

  9.   

    为什么需要jsp的实例?
    为什么不把那些函数放在java里?
      

  10.   

    你可以参考一下tomcat自带的应用吧,它是把应用中的所有页面,预先编译打包后放到lib中的。
      

  11.   

    问题搞定,sansong089(sansong089) 多谢详细研究了一下org.apache.jasper.servlet等一系列的东东
    了解了其动态编译JSP类的原理,用反射调用了其中一个私有的方法,并且采用欺骗的方式只进行编译工作而不进行加载JSP类的service方法,这样就可以做到请求 --> filter --> 编译 --> 页面类生成 --> 后台类 --> doFilter --> Servlet Service()