一、什么是 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
接口
![](https://img-blog.csdnimg.cn/direct/d121d5083e144f8aa43eea808ea536e7.png)
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
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init() 被调用");
}
/**
* 返回ServletConfig 也就是返回Servlet的配置
* @return
*/
@Override
public 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
*/
@Override
public 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基础的OOP
HttpServletRequest 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
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 1. 该方法是在servlet销毁时,被调用
* 2. 只会调用一次
*/
@Override
public void destroy() {
System.out.println("destroy() 被调用...");
}
}
4.浏览器调用 Servlet 流程分析
三、Servlet 生命周期
主要有三个方法
1. init()
初始化阶段
2. service()
处理浏览器请求阶段
3. destroy()
终止阶段
![](https://img-blog.csdnimg.cn/direct/52b1f6be82134a1ba1356334adfdf9f8.png)
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
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HiServlet doGet()...");
}
/**
* 处理doPost
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected 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
会更加方便
●
应用实例
![](https://img-blog.csdnimg.cn/direct/6c058bf4b76d43e390dbdf1a9cd0dba1.png)
六、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
、优先级遵守
:
精确路径
>
目录路径
>
扩展名路径
> /* > /