什么是 Servlet?
-
其实就是一个 Java 程序,运行在我们的 Web 服务器上,用于接收和响应客户端的 HTTP 请求。
-
更多的是配合动态资源来做。 当然静态资源也需要使用到 Servlet,只不过是Tomcat里面已经定义好了一个 DefaultServlet。
Servlet 的执行过程
第一步:类的定义
package com.huang.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
*
*@author 黄远志
*@date 2019年7月4日下午7:08:19
*@GitHub https://github.com/huangyuanzhi1997
*/
public class HelloServlet implements Servlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("HelloServlet");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
}
}
第二步:Servlet 的配置
<!-- 向tomcat报告, 我这个应用里面有这个servlet,名字叫做HelloServlet , 具体的路径是com.huang.servlet.HelloServlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.huang.servlet.HelloServlet</servlet-class>
</servlet>
<!-- 注册servlet的映射。 servletName : 找到上面注册的具体servlet,url-pattern: 在地址栏上的path一定要以/打头 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
执行过程:
- 找到 Tomcat 应用
- 找到项目
- 找 web.xml,然后在里面找到 url-pattern,有没有哪一个 patten 的内容是 /a
- 找到第二步 servlet-mapping 中的那个 servlet-name(HelloServlet)
- 找到第二步上面定义的 servlet 元素中的 servlet-name(HelloServlet)
- 找到第二步下面定义的 servlet-class,然后开始创建该类的实例
- 继而执行该 servlet 中的 service 方法
Servlet 的通用写法:
Servlet (接口)
|
|
GenericServlet
|
|
HttpServlet (用于处理http的请求)
定义一个类,继承 HttpServlet 复写 doGet 和 doPost
package com.huang.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*@author 黄远志
*@date 2019年7月4日下午7:51:01
*@GitHub https://github.com/huangyuanzhi1997
*/
public class HelloServlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet02...");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
System.out.println("post...");
}
}
Servlet 的生命周期
生命周期
从创建到销毁的一段时间。
生命周期方法
从创建到销毁,所调用的方法。
- init 方法
在创建该 Servlet 的实例时,就执行该方法。一个 Servlet 只会初始化一次, init 方法只会执行一次。
默认情况下是 : 初次访问该 Servlet,才会创建实例。 - service 方法
只要客户端来了一个请求,那么就执行这个方法。该方法可以被执行很多次。 一次请求,对应一次 service 方法的调用。 - destroy 方法
servlet 销毁的时候,就会执行该方法。
(1). 该项目从 Tomcat 的里面移除。
(2). 正常关闭 Tomcat 就会执行 shutdown.bat。
doGet 和 doPost 不算生命周期方法,所谓的生命周期方法是指,从对象的创建到销毁一定会执行的方法, 但是这两个方法,不一定会执行。
让 Servlet 创建实例的时机提前
- 默认情况下,只有在初次访问 Servlet 的时候,才会执行 init 方法。 有的时候,我们可能需要在这个方法里面执行一些初始化工作,甚至是做一些比较耗时的逻辑。
- 那么这个时候,初次访问,可能会在 init 方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。
- 在配置的时候, 使用 load-on-startup 元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从 2 开始即可。
<servlet>
<servlet-name>HelloServlet04</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet04</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
什么是 ServletConfig
Servlet 的配置,通过这个对象,可以获取 Servlet 在配置的时候一些信息
- 未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。 但是有人写出来了。它的代码放置在了自己的 Servlet 类里面。
- 刚好这个 Servlet 里面需要一个数字或者叫做变量值。 但是这个值不能是固定了。 所以要求使用到这个 Servlet 的公司,在注册 Servlet 的时候,必须要在 web.xml 里面,声明 init-params。