最近写《How tomcat work》中,有实现简单servlet容器时。
public class ServletProcessor1 {
public void process(Request request, Response response){
String uri = request.getUri();
String servletName = uri.substring(uri.lastIndexOf('/')+1);
URLClassLoader loader = null;
try {
URL[] urls = new URL[1];
URLStreamHandler streamHandler = null;
File classPath = new File(Constants.WEB_ROOT);
String repository = (new URL("file", null, classPath.getCanonicalPath()+File.separator)).toString();
urls[0] = new URL(null, repository, streamHandler);
loader = new URLClassLoader(urls);
}catch (Exception e){
e.printStackTrace();
}
Class myclass = null;
try {
myclass = loader.loadClass(servletName);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
Servlet servlet = null;
try {
servlet = (Servlet) myclass.newInstance();
servlet.service(request, response);
}catch (Exception e){
e.printStackTrace();
}
}
}
此处加载类的时候一直抛出异常,原因是该类处于某个包下,而加载的时候没有使用pakage.class方式,而是用了pakege/class的方式。将loader.loadClass加载方式改为pakege.class正常运行。