啊?我说得还行吧!
简单点: 我有办法拿到JAVA运行时动态编译出来的JSP页面类的实例吗?
简单点: 我有办法拿到JAVA运行时动态编译出来的JSP页面类的实例吗?
解决方案 »
- JNA能不能加载C++写的DLL?
- Unsupported major.minor version 49.0 异常
- JNDI的小问题
- 寻求Web service知识,工作原理及如何开发
- 新手求教struts中验证码的验证问题
- 在myeclipse中配置websphere的问题
- Struts用validation发生 Servlet action is not available异常
- 初学struts2标签找不到问题
- struts的路径问题
- 关于 Java 类路径的问题
- 关于Hibernate的session is closed问题请教大家理解方式??
- 急急急!!大家可不可以帮一下,快来不及了。。hibernate 自己写SQL 文
就好象JS不能调JAVA代码一样。
这是WEB服务器的问题。
它先加载了LIB包。和你的JAVA类。
然后,servlet是受WEB服务器管理的。
并不是你的一般的类。
你想穿过WEB服务器来取它里面的内容,你想想,这是怎么样的??
就是你能穿过WEB服务器,
那你怎么NEW出来呀??
你要取到WEB服务器启用的时候,NEW出来的那个实例??
而jsp用的是:org.apache.jasper.servlet.JasperLoader是否可以用后者进行LOAD呢?再说了,我能否像.net一样拿到一个class文件进行加载呢?如果可以那样的话,我不是可以直接找到动态编译出来的类文件加载之?
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有方法提供可以直接从当前容器中遍历类和加载器的功能?
还是现在想专研一下??
如果可以这样子穿。
那换WEB服务器怎么办,
WEB服务器做集群了又怎么办?
现在想不了这么多,先把技术性问题搞定.
通过昨天一晚上折腾,终于搞定了.呵呵.其实就是把编译的类最后的路径确定好再把该类需要的包也准备好,用URLClassLoader加载器就可以了.至于web服务器更换,应该也不是问题,像tomcat的路径在work下,websphere在temp下.判断就可以了.
因为我是在页面加载之前做后台代码,然后执行页面.也就是说因为动态编译的原因,第一次加载时,我的后台代码在前,所以拿不到这个页面类,因为他是在执行后编译生成的.请求 --> filter --> 后台类 --> doFilter --> 编译 --> 页面类生成从上面可以看出来,在页面没有生成类之前,我是拿不到的,只有第二次访问时才能拿到.怎么办呢?
为什么不把那些函数放在java里?
了解了其动态编译JSP类的原理,用反射调用了其中一个私有的方法,并且采用欺骗的方式只进行编译工作而不进行加载JSP类的service方法,这样就可以做到请求 --> filter --> 编译 --> 页面类生成 --> 后台类 --> doFilter --> Servlet Service()