个简单的Servlet容器.ppt_第1页
个简单的Servlet容器.ppt_第2页
个简单的Servlet容器.ppt_第3页
个简单的Servlet容器.ppt_第4页
个简单的Servlet容器.ppt_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一个简单的Servlet容器,贝毅君 浙江大学软件学院,Servlet,一个简单的Servlet容器 外观模式优化Servlet容器,Servlet,Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。,public void init(ServletConfig config) throws ServletException; public void service(ServletRequest request, ServletResponse response) throws ServletExcetion, IOException; public void destroy(); public void ServletConfig getServletConfig(); public String getServletInfo(); 上述5个是Servlet接口中声明的5个方法,其中init(), service()和destroy()方法和servlet生命周期相关。,Servlet生命周期,当实例化某个servlet类后,servlet会调用其init()方法将其初始化。Servlet容器只会调用该方法一次。Servlet接受任何请求之前,必须要经过争取的初始化。 当servlet的一个客户端请求到达后,servlet容器会调用相应servlet的service()方法,并将servletRequest和servletResponse作为参数传入。在Servlet对象的整个生命周期里面,service()方法会被多次调用。 在将Service实例从服务中移除前, servlet容器会调用destroy()方法。一般当servlet容器关闭或servlet容器要释放内存时, 才会将servlet实例移除。,Servlet生命周期,Servlet实例PrimitiveServlet,public class PrimitiveServlet implements Servlet public void init(ServletConfig config) throws ServletException System.out.println(“init”); public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException System.out.println(“from service”); PrintWriter out = response.getWriter(); out.println(“Hello. Roses are red.”); out.print(“Violets are blue.”); public void destroy() System.out.println(“destroy”); public void String getServletInfo() return null; public void ServletConfig getServletConfig() return null; ,Servlet示例demo,PrimitiveServlet在每个方法内部增加后台打印,利用打印的后台信息可以跟踪servlet的生命周期调用。 本章实现的servlet容器仅仅用到了service()方法,验证生命周期的输出推荐使用完整的tomcat运行。,一个简单的servlet容器,改造HttpServer,仅仅需要改造HttpServer中await()方法 response.sendStaticResource(); 替换为下述代码:,if (request.getUri().startsWith(“/servlet/“) ServletProcessor1 processor = new ServletProcessor1(); cess(request, response); else StaticResourceProcessor processor = new StaticResourceProcessor(); cess(request, response); ,Url类型为 http:/XXX/servlet/xxx 为访问servlet, 不带/servelt/路径访问静态资源,因为servlet的service方法会从servlet容器中接受一个ServletRequest实例和一个ServletResponse实例。因此它们必须作为参数传入的 servlet的service()方法中。 Request需要实现ServletRequest接口。 Reponse也需要实现ServletResponse接口。,改造Request和Response,ServletProcessor,StaticResourceProcessor类用于处理对静态资源的请求,process过程仅仅重新调用response.sendResource方法。 ServletProcessor类对servlet资源进行http请求。下述为没有补货异常的process过程代码。,String uri = request.getUri(); String servletName = uri.substring(uri.lastIndexOf(“/“) + 1); URL urls = new URL1; URLStreamHandler streamHandler = null; File classPath = new File(Constants.WEB_ROOT); / 类载入器查找目录称为 仓库 String repository = (new URL(“file“, null, classPath.getCanonicalPath() + File.separator).toString() ; urls0 = new URL(null, repository, streamHandler); /类载入器 URLClassLoader loader = new URLClassLoader(urls); Class myClass = loader.loadClass(servletName); / 实例化servlet对象并调用service()方法 Servlet servlet = (Servlet) myClass.newInstance(); servlet.service(ServletRequest) request, (ServletResponse) response);,为什么需要URLStreamHandler对象?,这里存在什么问题?,通过java classpath ./lib/servlet.jar; ./ ex02.pyrmont.HttpServlet1 可以执行该容器,然后可以测试应用程序。 浏览器输入 http:/localhost:8080/servlet/PrimitiveServlet 的时候可以看到浏览器仅仅输出Hello. Rose are red, 为什么?,一个简单的servlet容器,servlet = (Servlet) myClass.newInstance(); servlet.service(ServletRequest) request, (ServletResponse) response); 在service方法里面,程序员可以通过向下转型获取自定义的Request和Reponse实例并调用其公共方法parse()或sendStaticResource()。如果将公共方法设置为私有方法,在service内部实际上还是可以直接调用的,而且它们不能被其它类调用,所以该方法不好。 Protect方法也有service直接调用的问题,所以也并不完美。 在这里有个完美的解决方案: 外观模式,外观模式,外观模式定义了一个高层的接口,让子系统更加容易使用。 外观不只是简化了接口,也将客户从组件的子系统中解耦。 Tomcat利用RequestFacade封装Request接口的属性方法,将ServletRequest方法排除。,外观模式,RequestFacade,public class RequestFacade implements ServletRequest private ServletRequest request = null; public RequestFacade(Request request) this.request = request; public Object getAttribute(String attribute) return request.getAttribute(attribute); public Enumeration getAttributeNames() return request.getAttributeNames(); / 构建返回request的方法 request.getXXXXX(); ,改造结果,改造servletProcessor,servlet = (Servlet) myClass.newInstance(); servlet.service(ServletRequest) request, (ServletResponse) response);,servlet = (Servlet) myClass.newInstance(); RequestFacade requestFacade = new RequestFacade(request); Respon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论