|
在Weblogic服务器情况,使用Eclipse对jsp调试会碰到在jsp设置断点无效的问题。网上有说需要在Weblogic控制台设置Debug Enable项,仅仅这样是不够的,对Weblogic的支持还需要通过代码定制。
分析一下目前MyEclipse等IDE对JSP调试的实现,主要两个方面,
1)调试客户端实现jdi接口,Eclipse即是一个调试客户端,它在插件org.eclipse.jdt.debug Plugin 提供了JDI 的具体实现
2 ) 实现JSR-045规范,即在将源文件生成java文件再编译成class文件的时候,需要在class文件里面写如源到java文件 的映射关系,即SMAP。关于JSR-045以及SMAP的详细描述,请参考相关文档,下面是一个链接:http://jcp.org/aboutJava/communityprocess/review/jsr045/index.html。
JSR-045规范的实现需要容器来保证,可以通过记事本打开Weblogic下由jsp编译生成的class文件,在最后面,是否能发现类似这样的信息:
__newfile.java
JSP
*S JSP
*F
1 newFile.jsp
*L
3#1:92,10
*E
上述信息即是SMAP,调试的时候会更具这个Java到JSP的映射在jsp编辑器的定位当前行。
从在编辑器上打断点到编辑器的渲染过程的简单流程图可见随文附件。对Weblogic的调试支持关键是第4步:“Test.class加载的时候,会发一个classprepared事件,
在Test.jsp上的断点需要监听这个事件,向JVM Target发送断点请求”,参照JavaStratumLineBreakpoint.java的源代码,对应的实现如下:
String[] patterns = null;
try {
patterns = getTypeNamePatterns();//获得class名称
} catch (CoreException e1) {
JDIDebugPlugin.log(e1);
return;
}
for (int i=0; i<patterns.length; i++)
{
String classPrepareTypeName= patterns;
// 当类加载时候,发送classPrepare事件给当前断点,
// 此时才会发送断点的Event给JVM Target。可见handleClassPrepareEvent()方法。
registerRequest(target.createClassPrepareRequest(classPrepareTypeName), target);
}
从上述代码中可见,由于不同容器编译生成的class格式不一样,如:Tomcat编译newFile.jsp 产生的Java 类名为 org.apache.jsp. newFile_jsp,而WebLogic却是 jsp_servlet._newFile。我们需要返回正确的classPatterns,这就是我们需要进行代码定制的地方。
当然我们还可以按照JSP调试的方式,实现对其他文件的调试,如XML、流程文件。
|
|
|
|
|
|
|