1、1. Servlet 概述1.1. Servlet概述1.1.1. Servlet是什么Servlet是 sun公司提供的一门用于开发动态 web资源的技术。按照这套规范写出来的 Servlet可以放置到 web应用中在 Servlet容器中运行。1.1.2. 开发 Servlet步骤想要开发一个 Servlet只需要两个步骤:(1)写一个类实现 javax.servlet接口。(2)在 web.xml中为 servlet配置对外访问路径。2. 开发第一个 Servlet2.1. 写一个类实现 Servlet接口2.1.1. Servlet接口 api接下来我们就手动编写一个 Servlet感
2、受一下 Servlet开发的过程。我们用记事本,写一个类实现 Servlet接口,我们打开 api发现如果直接实现Servlet接口需要实现如下方法,如图-1 所示:图-1简单介绍下其中重要方法:init(ServletConfig config)初始化方法,会在 Servlet被创建出来后立即执行,做一些初始化的工作destroy()销毁方法,会在 Servlet被销毁之前执行,做一些善后工作service(ServletRequest req, ServletResponse res)服务方法,每当有请求访问 Servlet时,此方法执行,处理请求的代码要写到这个方法里。2.1.2. Ge
3、nericServlet 抽象类我们发现这个接口中方法太多了,其实我们可以直接继承 Servlet接口的一个默认实现了 GenericServlet类,如图-2 所示:图-2通过观察 api,我们发现 GenericServlet是个抽象类,实现了 Servlet接口中的大部分方法,唯独 service方法没有做实现,我们继承 GenericServlet需要实现这个Service方法在其中写处理请求的代码。如图-3 所示:图-3在记事本中编写如下代码,注意写的过程中需要导入包。如图-4 所示:图-4我们输出当前时间到客户端,service 方法有两个参数,ServletRequest 代表
4、HTTP请求,ServletResponse 代表 HTTP响应,我们想要获取客户端发送过来的信息时可以找ServletRequest,现在需要向客户端发送数据就可以使用 ServletResponse对象。通过查询 ServletResponse对象的 api,发现其中有获取写出数据的流的方法,通过这个方法获取流就可以将数据发送给浏览器。代码如图-5 所示:图-5编写好 java文件后,需要进行编译,如图-6 所示:图-6在编译的过程中发现少了开发包,这是因为我们现在开发的是 javaee项目,需要将javaee相关的开发包加入 classpath环境变量,这个包在 tomcat的支持包中存
5、有,将其加入 classpath环境变量即可。如图-7 所示:图-7再次编译。报出了警告,是因为 Date的 toLocaleString方法已经过时,但是我们不关心,到此编译已经完成。编译成功后将包拷入 web应用的 WEB-INF/classes目录下,如图-8 所示:图-82.2. 配置 Servlet的对外访问路径2.2.1. 在 web.xml配置 servlet我们还需要在 web.xml中为这个 Servlet配置一个对外访问路径。打开 web.xml文件,在根标签下进行如下配置,如图 -9所示:图-9其中,servlet-class 中为配置的 Servlet类的全路径名。se
6、rvlet-name是为该 servlet配置的名称,此名称没有特殊要求,为了便于识别此处取名和类名相同。url-pattern是为该名称的 servlet配置对外访问路径,浏览器可以通过该路径访问此 servlet。启动服务器,通过浏览器访问,如图-10 所示:图-10发现成功输出了当前时间,多次刷新页面发现每次显示的都是最新的时间,不同的人在不同的时间看到的结果不同,说明这确实是一个动态 web资源。3. Servlet 的调用过程和生命周期3.1. servlet的调用过程3.1.1. Servlet调用过程图当我们在访问这个 Servlet时,是如何看到时间输出的呢?整个过程是如何工作
7、的呢?我们画图解释,如图-11 所示:图-11(1 )在浏览器输入地址,浏览器先去查找 hosts文件,将主机名翻译为 ip地址,如果找不到就再去查询 dns服务器将主机名翻译成 ip地址。(2 )浏览器根据 ip地址和端口号访问服务器,组织 http请求信息发送给服务器。(3 )服务器收到请求后首先根据 Host请求头判断当前访问的是哪台虚拟主机。(4 )服务器根据 http请求头中的请求 URI判断当前访问的是哪个 web应用。(5 )服务器根据 http请求头中的请求 URI判断当前访问的是 web应用中的哪个 web资源。(6 )检查 web应用的 web.xml文件,如果根据路径找到
8、具体的 servlet处理类的全路径名交给该 servlet处理 ,如果找不到就交给缺省 servlet处理。(7 )这个过程中浏览器只知道自己发出来 http请求,不久就收到了 http响应,浏览器不知道也不关心服务器内部是如何处理的。浏览器和服务器之间的关系是非常单纯的,只有 HTTP协议。(8 )解析请求、封装 RequestResponse对象、创建 Servlet、调用 Service方法都是服务器自动进行的,开发人员只需要写好 Servlet配置进容器中即可,无需操心具体的底层实现。-这就是容器啊!多重要!多形象!3.2. servlet的生命周期3.2.1. servlet生命周
9、期详解(1 )Servlet 第一次被访问到时创建对象,创建出来后立即执行 init方法执行初始化的操作。(2 )从此以后该对象一直驻留在内存中为后续的对这个 Servlet的请求进行服务。(3 )直到服务器关闭或 web应用移除出容器时,随着 web应用的销毁 Servlet对象销毁掉,在销毁之前调用 destory方法执行善后工作。(4 )在存活期间,每次对 Servlet 的调用都会导致 Service方法的执行。4. 在 myeclipse 中开发 Servlet4.1. 为什么需要 myeclipse4.1.1. 为什么需要 myeclipse上面的例子中我们用记事本实现了一个 Se
10、rvlet,这样做的目的是为了让大家更好的理解 Servlet的本质,但是如果在真实开发中也用记事本开发,可以想见效率一定是非常低的。接下来我们来了解一下如何在 Myeclipse环境中开发 Servlet4.2. 在 Myeclipse中开发 Servlet4.2.1. 第一步:创建 servlet在工程 src目录上右键弹出菜单,选择 new-Servlet,如图-12 所示:图-124.2.2. 第二步:配置 servlet类信息在弹出的对话框中输入 Servlet的包名、类名,默认继承 HttpServlet,覆盖其中doGet和 doPost方法。如图 -13所示:图-134.2.3
11、. 第三步:配置 serlvet虚拟路径进入下一界面,选择是否自动配置 servlet到 web.xml中,一旦勾选,则自动会用输入的信息在 web.xml中为该 Servlet配置对外访问路径,如图 -14所示:图-144.2.4. 第四步:编写 servlet处理逻辑点击确定,创建出 Servlet,发现该类继承了 HttpServlet(此类是 Servlet接口的实现类,我们的类继承他,自然也是个 Servlet),并且覆写了其中的 doGet和doPost方法。当客户端用 get方式访问该 Servlet时会导致 doGet方法执行当客户端用 post方式访问该 Servlet时会导致 doPost方法执行我们只需要写代码处理对应的处理逻辑即可。很多时候我们的处理代码对于 get方式的请求和 post方式的请求的处理是相同的,此时可以在 doPost中调用 doGet();然后将处理代码写在 doGet中。这样无论是 get还是 post请求都可以进行处理了。编写代码,如图-15 所示: