« 开发一个调试JSP的Eclipse插件4(收藏)« »开发一个调试JSP的Eclipse插件6(收藏) »
开发一个调试JSP的Eclipse插件5(收藏)

开发一个调试JSPEclipse插件1(收藏)    
开发一个调试JSPEclipse插件2(收藏) 
开发一个调试JSPEclipse插件3(收藏)
开发一个调试JSPEclipse插件4(收藏)
开发一个调试JSPEclipse插件5(收藏)
开发一个调试JSPEclipse插件6(收藏)
  本文通过开发一个JSP 编辑器插件的示例,介绍了 Eclipse 中设置 JSP 断点的方法,以及如何远程调试 JSP。作为基础知识,本文的前两部分描述了 JAVA Debug JSR-45 的基本原理。
  环境要求: 本文的代码是在 Eclipse3.0.0JDK1.4.2 Tomcat5.0.5 上测试过的

 JSPBreakpoint 重载了父类的addToTarget(JDIDebugTarget target) 方法。重载这个方法的目的是根据不同的应用服务器,设置不同的 referenceTypeName和sourcePath。我们知道,每种应用服务器编译 JSP 产生Java Class 名称的规则都不相同,例如Tomcat编译Hello.jsp 产生的Java 类名为 org.apache.jsp. Hello_jsp,而WebSphere6.0 却是 com.ibm._jsp._Hello。只有确定服务器类型,才能知道referenceTypeName 和souecePath应该是什么。目前通过启动 JVM 时target 名称来判断应用服务器类型: String targetString = target.getLaunch().getLaunchConfiguration().getName(); 如果targetString 包含 Tomcat ,就认为是 Tomcat。

  产生 referenceTypeName 后首先创建一个 ClassPrepareRequest 通知,然后从vm中取出所有的classes,如果是当前的 Class,再创建一个添加断点通知。之所以这样做,是因为有可能这个 Class 还没有被 JVM 加载,直接通知 JVM 没有任何意义。在 Class 被加载的时候,JVM 会通知 Eclipse,这个时候,才产生添加断点通知。需要指出的是,本文示例代码获取 referenceTypeName 的方法不是很完善:

  (1) 仅仅实现了Tomcat 读者有兴趣可以实现更多的Web容器,例如 JBoss3 以上,WebSphere6.0

  (2) 一些特殊情况没有处理例如 路径名为package的jsp,路径名或文件名带有数字的jsp
  public void addToTarget(JDIDebugTarget target) throws CoreException {
  IMarker marker = this.getMarker();
     IResource resource = marker.getResource();
     String targetString = target.getLaunch().getLaunchConfiguration().getName();
  IJSPNameUtil util = JSPDebugUtility.getJSPNameUtil(targetString);
     
  // pre-notification
  fireAdding(target);
    
  String referenceTypeName;
  try {
   referenceTypeName = getPattern();
   //如果没有设置 Pattern, 根据 Server 的类型, 产生新的 Pattern 
   if(referenceTypeName == null || 
      "".equals(referenceTypeName.trim()) ||
      "*".equals(referenceTypeName.trim())){
       referenceTypeName = util.referenceTypeName(resource);
   }
   
  } catch (CoreException e) {
   JDIDebugPlugin.log(e);
   return;
  }
  
  this.ensureMarker().setAttribute(TYPE_NAME, referenceTypeName);
  String sourcePath = util.sourcePath(resource);
  this.ensureMarker().setAttribute(JSPBreakpoint.SOURCE_PATH, sourcePath);
  
  String classPrepareTypeName= referenceTypeName;
  
  //如果这时 class 还没有被加载, 注册一个 ClassPrepareRequest 请求
  //
  //当 class 加载的时候, 首先会触发 JavaBreakpoint 的 handleClassPrepareEvent 方法
  //调用 createRequest(target, event.referenceType()) --> newRequest() -->
  //    createLineBreakpointRequest() 创建 enable或disable 断点的请求
  //
  //  设置 enable/disable 动作在 configureRequest() --> updateEnabledState(request) 方法中
  //  根据 getMarker().getAttribute(ENABLED, false) 确定断点是否有效
  
  registerRequest(target.createClassPrepareRequest(classPrepareTypeName), target);
  
  // create breakpoint requests for each class currently loaded
  VirtualMachine vm = target.getVM();
  if (vm == null) {
   target.requestFailed("Unable_to_add_breakpoint_-_VM_disconnected._1"), 
   null);   }
  List classes = null;
  try {
   classes= vm.allClasses();
  } catch (RuntimeException e) {

   target.targetRequestFailed("JavaPatternBreakpoint.0"), e); 
  }
  if (classes != null) {
   Iterator iter = classes.iterator();
   while (iter.hasNext()) {
    ReferenceType type= (ReferenceType)iter.next();
    if (installableReferenceType(type, target)) {
     createRequest(target, type);
    }
   }
  }
}    

 


Tags: java基础  

原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/

本文链接地址:http://www.busfly.net/csdn/post/jsp_eclipse_debug_5.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Feed订阅集
网站分类
勤劳致富^.^
最近发表
最新评论及回复
最近留言
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(VS为主):3769186.