Tomcat当中在接受到要调用的Servlet请求后,需要载入相应的Servlet类,然后创建Servlet类实例,从而调用Servlet类实例的service()方法
下面实例的场景,request和response分别是一个javax.servlet.ServletRequest实例和一个javax.servlet.ServletResponse实例,request通过getUri()方法从ServletRequest当中获取uri
uri格式为/servlet/servletName
其中servletName就是所请求servlet资源的类名,针对这个资源名,调用URLClassLoader类载入相应的类实例
public void process(Request request, Response response) { String uri = request.getUri(); String servletName = uri.substring(uri.lastIndexOf("/") + 1); URLClassLoader loader = null; try { // create a URLClassLoader URL[] urls = new URL[1]; URLStreamHandler streamHandler = null; File classPath = new File(Constants.WEB_ROOT); // the forming of repository is taken from the createClassLoader // method in // org.apache.catalina.startup.ClassLoaderFactory String repository = (new URL("file", null, classPath.getCanonicalPath() + File.separator)).toString(); // the code for forming the URL is taken from the addRepository // method in // org.apache.catalina.loader.StandardClassLoader class. urls[0] = new URL(null, repository, streamHandler); loader = new URLClassLoader(urls); } catch (IOException e) { System.out.println(e.toString()); } Class myClass = null; try { myClass = loader.loadClass(servletName); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } Servlet servlet = null; try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) request, (ServletResponse) response); } catch (Exception e) { System.out.println(e.toString()); } catch (Throwable e) { System.out.println(e.toString()); } }
使用java.net.URLClassLoader类来完成,该类是java.lang.ClassLoader类的一个直接子类,一旦创建了URLClassLoader类的实例之后,就可以使用它的loadClass()方法来载入Servlet类,实例化URLClassLoader类有三种方法,也就是有三个构造方法
构造方法摘要 | |
---|---|
URLClassLoader(URL[] urls) 使用默认的委托父 ClassLoader 为指定的 URL 构造一个新
URLClassLoader。 |
|
URLClassLoader(URL[] urls, ClassLoader parent)
为给定的 URL 构造新 URLClassLoader。 |
|
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)
为指定的 URL、父类加载器和 URLStreamHandlerFactory 创建新 URLClassLoader。 |
URLClassLoader 参数: urls - 从其位置加载类和资源的 URL 抛出: SecurityException - 如果安全管理器存在并且其 checkCreateClassLoader 方法不允许创建类加载器。 另请参见: SecurityManager.checkCreateClassLoader()
public URLClassLoader(URL[] urls)使用默认的委托父 ClassLoader 为指定的 URL 构造一个新 URLClassLoader。\n
首先在父类加载器中搜索 URL,然后按照为类和资源指定的顺序搜索 URL。这里假定任何以 ‘/‘ 结束的 URL 都是指向目录的。\n
如果不是以该字符结束,则认为该 URL 指向一个将根据需要下载和打开的 JAR 文件。 如果有安全管理器,该方法首先调用安全管理器的 checkCreateClassLoader 方法以确保允许创建类加载器。
原文:http://www.cnblogs.com/wuxinliulei/p/4967101.html