1、什么是 Servlet
1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
2、 手动实现 Servlet 程序
1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址(先查找web.xml文件,是否有对应的标签体内容。若有,则在找到对应的全类名)
给Tomcat 配置 Servlet 程序
<servlet>
配置servlet的名字
<servlet-name></servlet-name>
配置servlet的全限定名:包名.类名
<servlet-class ></servlet-class >
</servlet>
给servlet 程序配置访问地址
<servlet-mapping>
作用:告诉服务器,当前配置的地址给哪个Servlet程序使用
<servlet-name>xx</servlet-name>
url-pattern标签配置访问地址
/ 斜杠在服务器解析时,地址:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello
<url-pattern>/hello</url-pattern>
</servlet-mapping>
案例1:
HelloWorldServlet.java
执行原理:
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
public class HelloWorldServlet extends HttpServlet {
//创建Servlet的步驟
//extends HttpServlet
//重写doGet | doPost方法
//配置
//web.xml
//注解
//GET
//浏览器直接输入地址
//超链接
//<form method="get"
//重定向
/**
* 用来处理GET请求
* @param req
* //代表一次请求
* //请求行
* //请求头
* //请求参数
* @param resp
* //代表一次响应
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Date date = new Date();//默认是当前时间对象
//含义
//JDK提供的和时间相关的类
//2020-7-13 20:31:53
String currentDate = date.toLocaleString();
//将字符串响应给浏览器
PrintWriter printWriter = resp.getWriter();
printWriter.print(currentDate);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<servlet>
<servlet-name>xx</servlet-name>
<servlet-class>com.neu.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xx</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
案例2:
url-pattern的配置模式
- 精确匹配 /hello /first /second
- 模糊匹配 /* /字符串/*
- 模糊匹配 *.do *.action *.jsp *.html
- 缺省匹配 /
- tomcat中默认有一个缺省匹配的servlet,用来处理静态资源的。
SecondServlet
public class SecondServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//告诉浏览器响应内容的编码是UTF-8,内容是HTML,浏览器需要使用UTF-8解码工作
resp.setContentType("text/html;charset=utf-8");
PrintWriter printWriter = resp.getWriter();
printWriter.print("<html>");
printWriter.print("<head>");
printWriter.print("</head>");
printWriter.print("<body>");
printWriter.print("<div style=\"color:red;\">我是DIV</div>");
printWriter.print("</body>");
printWriter.print("</html>");
}
}
web.xml
<servlet>
<servlet-name>secondServlet</servlet-name>
<servlet-class>com.neu.servlet.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>secondServlet</servlet-name>
<!-- <url-pattern>/*</url-pattern> -->
<!-- <url-pattern>/second/*</url-pattern> -->
<url-pattern>*.html</url-pattern>
<!-- <url-pattern>/</url-pattern> -->
</servlet-mapping>
<!-- url-pattern的写法 -->
<!-- 精确匹配 /字符串 比如:/hello /first-->
<!-- 模糊匹配 /* /字符串/* -->
<!-- 模糊匹配 *.do *.html *.jsp -->
<!-- 缺省 / 如果都找不到对应的资源则会交给该servlet来处理,tomcat的静态资源是由缺省的servlet来处理-->
3、servlet生命周期
含义:指Servlet实例从创建到响应客户请求,直至销毁的过程。
相关的方法
在Servlet容器启动后,客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。在为Servlet配置了自动装入选项(load-on-startup)时,服务器在启动时会自动装入此Servlet。
- load-on-startup
含义:用来配置servlet的创建时机,默认值-1,如果设置建议设置>=0,值越小越先创建。
ThirdServlet
public class ThirdServlet extends HttpServlet{
public ThirdServlet() {
System.out.println("ThirdServlet被创建了...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().print("servlet is singlton,it's hascode = "+this.hashCode());
}
}
web.xml
<servlet>
<servlet-name>thirdServlet</servlet-name>
<servlet-class>com.neu.servlet.ThirdServlet</servlet-class>
<!-- 默认值-1,代表当servlet第一次启动的是才会创建 -->
<!-- value >=0代表当项目启动成功之后会立马创建servlet对象,值越小越先创建 -->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>thirdServlet</servlet-name>
<url-pattern>/third</url-pattern>
</servlet-mapping>
1、被创建:执行init方法,只执行一次
Servlet什么时候被创建?
默认情况下,第一次被访问时,Servlet被创建
可以配置执行Servlet的创建时机。
在<servlet标签下配置
1. 第一次被访问时,创建
<load-on-startup的值为负数
2. 在服务器启动时,创建
<load-on-startup的值为0或正整数
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。
2、提供服务
服务器接收到客户端请求,会为该请求创建“请求”对象和“响应”对象,并调用service()方法,service()方法再调用其他方法来处理请求.可多次调用。当多个客户端同时访问某个Servlet的service()方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。
3、被销毁
- 执行destroy方法,只执行一次
- Servlet被销毁时执行。服务器关闭时,Servlet被销毁
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在Servlet被销毁之前执行,一般用于释放资源。
Servlet3.0:
好处:支持注解配置。可以不需要web.xml了。
步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置
@WebServlet(“资源路径”)