个简单的Servlet容器.ppt

上传人:大米 文档编号:569416275 上传时间:2024-07-29 格式:PPT 页数:19 大小:642.36KB
返回 下载 相关 举报
个简单的Servlet容器.ppt_第1页
第1页 / 共19页
个简单的Servlet容器.ppt_第2页
第2页 / 共19页
个简单的Servlet容器.ppt_第3页
第3页 / 共19页
个简单的Servlet容器.ppt_第4页
第4页 / 共19页
个简单的Servlet容器.ppt_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《个简单的Servlet容器.ppt》由会员分享,可在线阅读,更多相关《个简单的Servlet容器.ppt(19页珍藏版)》请在金锄头文库上搜索。

1、一个简单的Servlet容器贝毅君浙江大学软件学院Servletn一个简单的Servlet容器n外观模式优化Servlet容器ServletServlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。npublic void init

2、(ServletConfig config) throws ServletException;npublic void service(ServletRequest request, ServletResponse response) throws ServletExcetion, IOException;npublic void destroy();npublic void ServletConfig getServletConfig();npublic String getServletInfo();n上述5个是Servlet接口中声明的5个方法,其中init(), service()和d

3、estroy()方法和servlet生命周期相关。Servlet生命周期当实例化某个servlet类后,servlet会调用其init()方法将其初始化。Servlet容器只会调用该方法一次。Servlet接受任何请求之前,必须要经过争取的初始化。当servlet的一个客户端请求到达后,servlet容器会调用相应servlet的service()方法,并将servletRequest和servletResponse作为参数传入。在Servlet对象的整个生命周期里面,service()方法会被多次调用。在将Service实例从服务中移除前, servlet容器会调用destroy()方法。一

4、般当servlet容器关闭或servlet容器要释放内存时, 才会将servlet实例移除。Servlet生命周期Servlet实例PrimitiveServletpublic class PrimitiveServlet implements Servletpublic void init(ServletConfig config) throws ServletExceptionSystem.out.println(“init”);public void service(ServletRequest request, ServletResponse response) throws Serv

5、letException, IOExceptionSystem.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 getSe

6、rvletConfig() return null; Servlet示例demonPrimitiveServlet在每个方法内部增加后台打印,利用打印的后台信息可以跟踪servlet的生命周期调用。n本章实现的servlet容器仅仅用到了service()方法,验证生命周期的输出推荐使用完整的tomcat运行。一个简单的servlet容器改造HttpServern仅仅需要改造HttpServer中await()方法 nresponse.sendStaticResource(); 替换为下述代码: if (request.getUri().startsWith(/servlet/) Servle

7、tProcessor1 processor = new ServletProcessor1(); processor.process(request, response); else StaticResourceProcessor processor = new StaticResourceProcessor(); processor.process(request, response); Url类型为 http:/XXX/servlet/xxx 为访问servlet,不带/servelt/路径访问静态资源n因为servlet的service方法会从servlet容器中接受一个ServletR

8、equest实例和一个ServletResponse实例。因此它们必须作为参数传入的 servlet的service()方法中。nRequest需要实现ServletRequest接口。nReponse也需要实现ServletResponse接口。改造Request和ResponseServletProcessorStaticResourceProcessor类用于处理对静态资源的请求,process过程仅仅重新调用response.sendResource方法。ServletProcessor类对servlet资源进行http请求。下述为没有补货异常的process过程代码。 String

9、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).toStr

10、ing() ; 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)

11、response);为什么需要URLStreamHandler对象?这里存在什么问题?n通过java classpath ./lib/servlet.jar; ./ ex02.pyrmont.HttpServlet1 可以执行该容器,然后可以测试应用程序。n浏览器输入 http:/localhost:8080/servlet/PrimitiveServlet 的时候可以看到浏览器仅仅输出Hello. Rose are red, 为什么?一个简单的servlet容器servlet = (Servlet) myClass.newInstance();servlet.service(ServletR

12、equest) request, (ServletResponse) response);n在service方法里面,程序员可以通过向下转型获取自定义的Request和Reponse实例并调用其公共方法parse()或sendStaticResource()。如果将公共方法设置为私有方法,在service内部实际上还是可以直接调用的,而且它们不能被其它类调用,所以该方法不好。nProtect方法也有service直接调用的问题,所以也并不完美。n在这里有个完美的解决方案: 外观模式外观模式外观模式n外观模式外观模式定义了一个高层的接口,让子系统更加容易使用。n外观不只是简化了接口,也将客户从组

13、件的子系统中解耦。nTomcat利用RequestFacade封装Request接口的属性方法,将ServletRequest方法排除。外观模式RequestFacadepublic class RequestFacade implements ServletRequest private ServletRequest request = null; public RequestFacade(Request request) this.request = request; public Object getAttribute(String attribute) return request.g

14、etAttribute(attribute); public Enumeration getAttributeNames() return request.getAttributeNames(); / 构建返回request的方法 request.getXXXXX(); n改造结果改造servletProcessorservlet = (Servlet) myClass.newInstance();servlet.service(ServletRequest) request, (ServletResponse) response);servlet = (Servlet) myClass.newInstance();RequestFacade requestFacade = new RequestFacade(request);ResponseFacade reponseFacade = new ResponseFacade(response);servlet.service(ServletRequest) requestFacade , (ServletResponse) reponseFacade );n如何改造?运行结果运行结果n本章的Servlet容器既可以处理静态资源请求,也可以处理简单的Servlet请求。nServlet接口以及相关背景知识n外观模式及其应用总结

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号