zoukankan      html  css  js  c++  java
  • Servlet加载器的实验

    今天,看了张孝祥老师的类加载器的一个高级实验分析的教程,有点受益匪浅。

    新建servlet工程,在Servlet类中

    package com.sinosoft.servelt;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.sun.org.apache.xml.internal.serialize.Printer;
    
    /**
     * Servlet implementation class MyServlet
     */
    public class MyServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public MyServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out=response.getWriter();
            ClassLoader loader=this.getClass().getClassLoader();
            while(loader!=null){
                out.print(loader.getClass().getName()+"<br>");
                loader=loader.getParent();
            }
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
        }
    
    }
    View Code

    启动  tomcat目录下的bin目录下的,startup.bat,之后访问这个servlet,结果如下

    从图中,我们看到,类加载器的加载Myservlet这个类的顺序是,Ext加载App加载Standard加载Webapp,最终是由Webapp加载了Myservlet这个类及其继承HttpServet类(此类在tomcat的lib目录下)

    现在我们,把Myservlet这个类 ,以jar包格式, export到jdk的F:Program FilesJavajdk1.7.0_02jrelibext目录下,这一步要注意的是,tomcat对应的jdk,和我们这次export的目录是否是同一个jdk,不确定的话,可以去tomcat的bin目录下,打开startup.bat    指定一下 set JAVA_HOME=F:Program FilesJavajdk1.7.0_02,否则会没有效果。

    重启tomcat,再次访问那个url,则报出500错误,

    这是因为ext的那个加载器,加载了sinosoft.jar的包下的Myservlet类,但是没有Myservlet类继承的HttpServlet那个类的jar包,即servlet-api.jar包。我们去tomcat目录下的lib目录下拷贝servlet-api.jar包到F:Program FilesJavajdk1.7.0_02jrelibext目录下,再次重启tomcat,可以得出下面的结果

    也就是ext加载器,第一次就发现了有myservlet及其继承的httpservelt的字节码,便直接加载进jvm,就不再继续往后继续寻找之后的加载器了。

  • 相关阅读:
    CSS基础
    HTML基础
    JavaScript基础目录
    python 面向对象的基本概念(未完待续)
    python核心编程笔记(转)
    转: cJSON的使用方法
    转: C语言交换两个变量数值的几种方法
    转: 100个gdb小技巧项目
    转:C语言中的typeof关键字
    转:安全起见,小心使用C语言realloc()函数
  • 原文地址:https://www.cnblogs.com/vinplezhang/p/3602331.html
Copyright © 2011-2022 走看看