手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>Java技术>列表

开发一个调试JSP的Eclipse插件

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  Tomcat 又将这个 JAVA 代码编译为 Hello_jsp.class,他们位于: $Tomcat_install_path$\work\Standalone\localhost\_ 目录下。但是 JSP 文件名/行号和 JAVA 行号的对应表(以下简称SMAP) 在哪里呢?答案是,它保存在 Class 中。如果用 UltraEdit 打开这个 Class 文件,就可以找到 SourceDebugExtension 属性,这个属性用来保存 SMAP。

  JVM 规范定义了 ClassFile 中可以包含 SourceDebugExtension 属性,保存 SMAP:

SourceDebugExtension_attribute { 

  u2 attribute_name_index; 

  u4 attribute_length; 

  u1 debug_extension[attribute_length]; 

} 


  我用 javassist 做了一个测试(javassist可是一个好东东,它可以动态改变Class的结构,JBOSS 的 AOP就利用了javassist,这里我们只使用它读取ClassFile的属性)

 

public static void main(String[] args) throws Exception{ 

   String[]files = { 

   "E:\\Tomcat5_0_5\\work\\Catalina\\localhost\\_\\org\\apache\\jsp\\Hello_jsp.class", 

   }; 

                 

 for(int k = 0; k < files.length; k  ){ 

    String file = files[k]; 

    System.out.println("Class : "   file); 

    ClassFile classFile = new ClassFile(new DataInputStream(new FileInputStream(file))); 

            

    AttributeInfo attributeInfo = classFile.getAttribute("SourceDebugExtension"); 

    System.out.println("attribute name :"   attributeInfo.getName()   "]\n\n"); 

    byte[]bytes = attributeInfo.get(); 

    String str = new String(bytes); 

    System.out.println(str);    

   } 

} 


  这段代码显示了SourceDebugExtension 属性,你可以看到SMAP 的内容。编译JSP后,SMAP 就被写入 Class 中, 你也可以利用 javassist 修改 ClassFile 的属性。

  下面就是 Hello_jsp.class 中保存的 SMAP 内容:

SMAP 

E:\Tomcat5_0_5\work\Catalina\localhost\_\org\apache\jsp\Hello_jsp.java 

JSP 

*S JSP 

*F 

  0 Hello.jsp 

/Hello.jsp 

  1 greeting.jsp 

/greeting.jsp 

*L 

1:45 

2:46 

3:47 

3:48 

4:49 

5:50 

1#1:51 

1:52 

2:53 

7#0:56 

8:57 

*E

  首先注明JAVA代码的名称:Hello_jsp.java,然后是 stratum 名称: JSP。随后是两个JSP文件的名称 :Hello.jsp、greeting.jsp。两个JSP文件共10行,产生的Hello_jsp共69行代码。最后也是最重要的内容就是源文件文件名/行号和目标文件行号的对应关系(*L 与 *E之间的部分)

  在规范定义了这样的格式:

  源文件行号 # 源文件代号,重复次数 : 目标文件开始行号,目标文件行号每次增加的数量
(InputStartLine # LineFileID , RepeatCount : OutputStartLine , OutputLineIncrement)

  源文件行号(InputStartLine) 目标文件开始行号(OutputStartLine) 是必须的。下面是对这个SMAP具体的说明:

 

1:45  2:46  3:47  3:48  4:49  5:50(没有源文件代号,默认为Hello.jsp) 

                   开始行号   结束行号 

Hello.jsp:    1 ->  Hello_jsp.java:    45 

              2 ->                     46 

              3 ->                     47           48 

              4 ->                     49 

              5 ->                     50 

1#1:51  1:52  2:53(1#1表示 greeting.jsp 的第1行) 

greeting.jsp:    1 ->  Hello_jsp.java:       51           52 

                 2 ->                     53  

         

7#0:56  8:57(7#0表示 Hello.jsp 的第7行) 

Hello.jsp:     7 ->  Hello_jsp.java:       56 

               8 ->                     57 

  开发一个JSP编辑器

  Eclipse 提供了 TextEditor,作为文本编辑器的父类。由于 Editor 的开发不是本文的重点,不做具体论述。我们可以利用 Eclipse 的 Plugin 项目向导,生成一个简单的 JSP 编辑器:

  (1)点击 File 菜单,New -> Project -> Plug-in Project ;

  (2)输入项目名称 JSP_DEBUG,下一步;

  (3)输入 plugin ID : com.jsp.debug
    Plugin Class name : com.jsp.debug.JSP_DebugPlugin

  (4)选择用模板创建

  使用 Plug-in with editor,输入

  Java Package Name :com.jsp.editors

  Editor Class Name :JSPEditor

  File extension :jsp

  一个 jsp editor 就产生了。

  运行这个Plugin,新建一个JAVA项目,新建一个 Hello.jsp 和 greeting.jsp,在 Navigator 视图双击 jsp,这个editor就打开了。

  在JSP编辑器中设置断点

  在编辑器中添加断点的操作方式有两种,一种是在编辑器左侧垂直标尺上双击,另一种是在左侧垂直标尺上点击鼠标右键,选择菜单"添加/删除断点"。

  在 Eclipse 的实现中,添加断点实际上就是为 IFile 添加一个marker ,类型是IBreakpoint.BREAKPOINT_MARKER,然后将断点注册到 BreakpointManager。

  BreakpointManager 将产生一个 BreakpointRequest,通知正在运行的JVM Target,如果此时还没有启动 JVM,会在 JVM 启动的时候,将所有断点一起通知 JVM Target。

  添加断点使用一个 AbstractRulerActionDelegate,重载 createAction 方法,返回一个 IAction ManageBreakpointRulerAction动作:

public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDelegate{ 

 protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) { 

  return new ManageBreakpointRulerAction(rulerInfo, editor); 

 } 

} 


  为了将 ManageBreakpointRulerActionDelegate 添加到文本编辑器左侧标尺的鼠标右键菜单,并且能够处理左侧标尺的鼠标双击事件,在 plugin.xml 中加入定义。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!