2一个简单的Servlet容器.ppt

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

《2一个简单的Servlet容器.ppt》由会员分享,可在线阅读,更多相关《2一个简单的Servlet容器.ppt(19页珍藏版)》请在三一办公上搜索。

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

2、t(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()方

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

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

5、ion,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 getServletConfig()retu

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

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

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

9、ervletName=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);/类

10、载入器 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/servle

11、t.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

12、和Reponse实例并调用其公共方法parse()或sendStaticResource()。如果将公共方法设置为私有方法,在service内部实际上还是可以直接调用的,而且它们不能被其它类调用,所以该方法不好。Protect方法也有service直接调用的问题,所以也并不完美。在这里有个完美的解决方案:外观模式,外观模式,外观模式定义了一个高层的接口,让子系统更加容易使用。外观不只是简化了接口,也将客户从组件的子系统中解耦。Tomcat利用RequestFacade封装Request接口的属性方法,将ServletRequest方法排除。,外观模式,RequestFacade,public

13、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();/构建返

14、回request的方法 request.getXXXXX();,改造结果,改造servletProcessor,servlet=(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);,如何改造?,运行结果,运行结果,本章的Servlet容器既可以处理静态资源请求,也可以处理简单的Servlet请求。Servlet接口以及相关背景知识外观模式及其应用,总结,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号