一、什么是 Servlet
Servlet 在开发动态 WEB 工程中,得到广泛的应用,掌握好 Servlet 非常重要了 , Servlet( 基
石 ) 是 SpringMVC 的基础
Servlet(java 服务器小程序 ) ,它的特点 :
1. 他是由服务器端调用和执行的 ( 一句话:是 Tomcat 解析和执行 )
2. 他是用 java 语言编写的 , 本质就是 Java 类
3. 他是按照 Servlet 规范开发的 ( 除了 tomcat->Servlet weblogic->Servlet)
4. 功能强大,可以完成几乎所有的网站功能 ( 在以前,我们老程员,使用 Servlet 开发网站 ) 技
术栈要求高
二、快速入门- 手动开发 Servlet
1.需求说明
(1)开发一个 HelloServlet
(2)当浏览器 访问 http://localhost:8080/web 应用名/helloServlet 时,后台输出 "hi
HelloServelt"
2.具体步骤
1. 编写类HelloServlet去实现 Servlet 接口
2. 实现 service 方法,处理请求,并响应数据
3. 在 web.xml 中去配置 servlet 程序的访问地址
3.演示
1. 创建 hspedu_servlet JavaWeb 工程,并配置好 Tomcat
2. 添加 servlet-api.jar( 在 tomcat/lib 下 ) 到工程 , 因为 servlet.jar 不是 jdk 自带的 , 要引入
3. 在 src 下 包 com.hspedu.servlet.HelloServlet.java ,并实现 Servlet 接口
4.在web.xml配置HelloServlet,即:给HelloServlet 提供对外访问地址
5.通过浏览器访问HelloServlet ,看是否正确(记住要redeploy[快] 或者 restart[慢])
package com.hspedu.servlet;import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** 解读* 1. 开发一个Servlet 需要 实现Servlet接口* 2. 实现Servlet接口的方法5个*/
public class HelloServlet implements Servlet {private int count = 0; //属性/*** 1.初始化 servlet* 2.当创建HelloServlet 实例时,会调用init方法* 3. 该方法只会被调用一次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init() 被调用");}/*** 返回ServletConfig 也就是返回Servlet的配置* @return*/@Overridepublic ServletConfig getServletConfig() {return null;}/*** 1. service方法处理浏览器的请求(包括get/post)* 2. 当浏览器每次请求Servlet时,就会调用一次service* 3. 当tomcat调用该方法时,会把http请求的数据封装成实现ServletRequest接口的request对象* 4. 通过servletRequest 对象,可以得到用户提交的数据* 5. servletResponse 对象可以用于返回数据给tomcat->浏览器* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest,ServletResponse servletResponse) throws ServletException, IOException {count++;//如果count的值,在不停的累计,说明HelloServlet是单例的System.out.println("hi HelloServlet~ count= " + count);//Tomcat每处理一次http请求,就生成一个新的线程System.out.println("当前线程id= " + Thread.currentThread().getId());//思考->从servletRequest对象来获取请求方式->//1. ServletRequest 没有得到提交方式的方法//2. ServletRequest 看看ServletRequest子接口有没有相关方法//3. 老师小技巧:ctrl+alt+b => 可以看到接口的子接口和实现子类//4. 把servletReqeust转成 HttpServletRequest引用//5. 仍然是Java基础的OOPHttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String method = httpServletRequest.getMethod();if("GET".equals(method)) {doGet(); //用doGet() 处理GET请求} else if("POST".equals(method)) {doPost(); //用doPost() 处理POST请求}}/*** 用于响应get请求的*/public void doGet() {System.out.println("doGet() 被调用..");}/*** 用于响应post请求的*/public void doPost() {System.out.println("doPost() 被调用..");}/*** 返回servlet信息,使用较少* @return*/@Overridepublic String getServletInfo() {return null;}/*** 1. 该方法是在servlet销毁时,被调用* 2. 只会调用一次*/@Overridepublic void destroy() {System.out.println("destroy() 被调用...");}
}
4.浏览器调用 Servlet 流程分析
三、Servlet 生命周期
主要有三个方法
1. init() 初始化阶段
2. service() 处理浏览器请求阶段
3. destroy() 终止阶段
1.初始化阶段
Servlet 容器 ( 比如 : Tomcat) 加载 Servlet ,加载完成后, Servlet 容器会创建一个 Servlet 实例
并调用 init() 方法, init() 方法只会调用一次 , Servlet 容器在下面的情况装载 Servlet
(1). Servlet 容器(Tomcat)启动时自动装载某些 servlet,实现这个需要在 web.xml 文件中添加 <load-on-startup>1</load-on-startup> 1 表示装载的顺序
(2)在 Servlet 容器启动后,浏览器首次向 Servlet 发送请求(这个前面说过)
(3)Servlet 重新装载时(比如 tomcat 进行 redeploy【redeploy 会销毁所有的 Servlet 实例】),浏览器再向 Servlet 发送请求的第 1 次
2.处理浏览器请求阶段(service 方法)
1. 每收到一个 http 请求,服务器就会产生一个新的线程去处理 [ 线程 ]
2. 创建一个用于封装 HTTP 请求消息的 ServletRequest 对象和一个代表 HTTP 响应消息的
ServletResponse 对象
3. 然后调用 Servlet 的 service() 方法并将请求和响应对象作为参数传递进去
3.终止阶段 destory 方法(体现 Servlet 完整的生命周期)
当 web 应用被终止,或者 Servlet 容器终止运行,或者 Servlet 类重新装载时,会调用 destroy()
方法 , 比如重启 tomcat , 或者 redeploy web 应用
四、通过继承 HttpServlet 开发 Servlet
在实际项目中,都是使用继承 HttpServlet 类开发 Servlet 程序, 更加方便
1.具体的开发步骤
1. 编写一个类去继承 HttpServlet 类
2. 根据业务需要重写 doGet 或 doPost 方法
3. 到 web.xml 中的配置 Servlet 程序
2.应用实例
1. 创建 D:\idea_java_projects\hspedu_servlet\src\com\hspedu\servlet\HiServlet.java
package com.hspedu.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HiServlet extends HttpServlet {//重写HttpServlet的doGet 和 doPost/*** 处理doGet请求* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HiServlet doGet()...");}/*** 处理doPost* @param req* @param resp* @throws ServletException* @throws IOException*/@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("HiServlet doPost()...");}
}
2. 修改 D:\idea_java_projects\hspedu_servlet\web\WEB-INF\web.xml 完成配置
<!-- 配置HiServlet --><servlet><servlet-name>HiServlet</servlet-name><servlet-class>com.hspedu.servlet.HiServlet</servlet-class></servlet><servlet-mapping><servlet-name>HiServlet</servlet-name><url-pattern>/hiServlet</url-pattern></servlet-mapping>
五、IDEA 开发 Servlet 程序
● 说明
编手动开发 Servlet 需要程序员自己配置 Servlet , 比较麻烦,在工作中,直接使用 IDEA 开
发 Servlet 会更加方便
● 应用实例
六、Servlet 注意事项和细节
1. Servlet 是一个供其他 Java 程序( Servlet 引擎)调用的 Java 类,不能独立运行
2. 针对浏览器的多次 Servlet 请求,通常情况下,服务器只会创建一个 Servlet 实例对象,
也就是说 Servlet 实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至
web 容器退出 / 或者 redeploy 该 web 应用, servlet 实例对象才会销毁
3. 在 Servlet 的整个生命周期内, init 方法只被调用一次。而对每次请求都导致 Servlet 引
擎调用一次 servlet 的 service 方法。
4. 对于每次访问请求, Servlet 引擎都会创建一个新的 HttpServletRequest 请求对象和一个
新的 HttpServletResponse 响应对象,然后将这两个对象作为参数传递给它调用的 Servlet
的 service() 方法, service 方法再根据请求方式分别调用 doXXX 方法
5. 如果在 <servlet> 元素中配置了一个 <load-on-startup> 元素,那么 WEB 应用程序在启动时,
就会装载并创建 Servlet 的实例对象、以及调用 Servlet 实例对象的 init() 方法 , 老师聊聊 ( 定
时发送邮件的服务 / 自动启动 -> 完成任务 )
七、Servlet - 注解方式
1.快速入门
具体步骤
1. 编写类 OkServlet 去继承 HttpServlet
2. 注解方式配置 OkServlet, 一个 Servlet 支持配置多个 urlPattern
2.Servlet urlPattern 配置
(1)精确匹配
配置路径 : @WebServlet(" /ok/zs ")
访问 servlet: localhost:8080/servlet /ok/zs
(2)目录匹配
配置路径 : @WebServlet(" /ok/* ")
访问文件 : localhost:8080/servlet /ok/aaa localhost:8080/servlet /ok/bbb
(3) 扩展名匹配
配置路径 : @WebServlet("*.action")
访问文件 : localhost:8080/hsp /zs.action localhost:8080/hsp /ls.action
提示 : @WebServlet(" / *.action") , 不能带 / , 否则 tomcat 报错
(4) 任意匹配
配置路径 : @WebServlet("/") @WebServlet("/*")
访问文件 : localhost:8080/hsp /aaa localhost:8080/hsp /bbb localhost:8080/hsp /ccc
提醒: / 和 /* 的配置,会匹配所有的请求,这个比较麻烦,要避免
3.注意事项和使用细节
1 、当 Servlet 配置了 "/", 会覆盖 tomcat 的 DefaultServlet, 当其他的 utl-pattern 都匹配
不 上 时 , 都 会 走 这 个 Servlet, 这 样 可 以 拦 截 到 其 它 静 态 资 源 , 比 如
D:\hspedu_javaweb_temp\hspedu_servlet\web\hi.html
查看: tomcat/conf/web.xml , 配置的 DefaultServlet
The default servlet for all web applications, that serves static resources.
这个默认的 servlet 是处理静态资源的,一旦拦截,静态资源不能处理
2 、当 Servelt 配置了 "/*", 表示可以匹配任意访问路径
3 、提示 : 建议不要使用 / 和 /* , 建议尽量使用 精确匹配
4 、优先级遵守 : 精确路径 > 目录路径 > 扩展名路径 > /* > /