一个简单的 Servlet 容器
javax.servlet.Servlet 接口
Servlet 编程是通过 javax.servlet 和 javax.servlet.http 这两个包的类和接口来实现的。 其中一个至关重要的就是 javax.servlet.Servlet 接口了。所有的 servlet 必须实现实现或者继 承实现该接口的类。
Servlet 接口有五个方法,其用法如下。
public void init(ServletConfig config) throws ServletException public void service(ServletRequest request, ServletResponse response)throws ServletException, java.io.IOException
public void destroy() public ServletConfig getServletConfig() public java.lang.String getServletInfo()
在 Servlet 的五个方法中,init,service 和 destroy 是 servlet 的生命周期方法。在 servlet 类已经初始化之后,init 方法将会被 servlet 容器所调用。servlet 容器只调用一次,以此表明 servlet 已经被加载进服务中。init 方法必须在 servlet 可以接受任何请求之前成功运行完毕。 一个 servlet 程序员可以通过覆盖这个方法来写那些仅仅只要运行一次的初始化代码,例如加载 数据库驱动,值初始化等等。在其他情况下,这个方法通常是留空的。
servlet 容器为 servlet 请求调用它的 service 方法。servlet 容器传递一个 javax.servlet.ServletRequest 对象和 javax.servlet.ServletResponse 对象。ServletRequest 对象包括客户端的 HTTP 请求信息,而 ServletResponse 对象封装 servlet 的响应。在 servlet 的生命周期中,service 方法将会给调用多次。
当从服务中移除一个 servlet 实例的时候,servlet 容器调用 destroy 方法。这通常发生在 servlet容器正在被关闭或者servlet容器需要一些空闲内存的时候。仅仅在所有servlet线程 的service方法已经退出或者超时淘汰的时候,这个方法才被调用。在servlet容器已经调用完 destroy 方法之后,在同一个 servlet 里边将不会再调用 service 方法。destroy 方法提供了一 个机会来清理任何已经被占用的资源,例如内存,文件句柄和线程,并确保任何持久化状态和 servlet 的内存当前状态是同步的。
HttpServer类改动
如果请求的是一个servlet,则使用servlet处理器
// check if this is a request for a servlet or // a static resource // a request for a servlet begins with "/servlet/" if (request.getUri().startsWith("/servlet/")) { ServletProcessor1 processor = new ServletProcessor1(); processor.process(request, response); } else { StaticResoureProcessor processor = new StaticResourceProcessor(); processor.process(request, response); }
ServletProcessor1
通过路径加载并实例化一个servlet,并调用service方法(其它方法未实现)
package ex02.pyrmont; import java.net.URL; import java.net.URLClassLoader; import java.net.URLStreamHandler; import java.io.File; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; 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 { // 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()); } } }
浙公网安备 33010602011771号