Servlet 运行在服务端(tomcat) 的Java小程序,是sun公司提供一套规范. 就是动态资源
1、Servlet 是 JavaEE 规范之一。规范就是接口
2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
用来接收、处理客户端请求、响应给浏览器的动态资源。
但servlet的实质就是java代码,通过java的API动态的向客户端输出内容
1、编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址

image-20201110233106547

image-20201110233307404

image-20201110233330706

image-20201110233401114

image-20201110233514670

image-20201110233637425

image-20201110233700884

image-20201110233842956

image-20201110234607157
<?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_4_0.xsd"
version="4.0">
<!-- servlet标签给Tomcat配置Servlet程序 -->
<servlet>
<!--servlet-name标签 Servlet程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
<servlet-class>com.test01.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern标签配置访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>

image-20201110234706768
启动 tomcat 服务如下:

image-20201110234738522
访问 http://localhost:8080/06_servlet/hello

image-20201110234831870

image-20201110235124894

image-20201110235240101

image-20201110235420491

image-20201110064007165
1、执行 Servlet 构造器方法
2、执行 init 初始化方法
第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。
3、执行 service 方法
第三步,每次访问都会调用。
4、执行 destroy 销毁方法
第四步,在 web 工程停止的时候调用。

image-20201111000553289

image-20201111000652460

image-20201111000725599

image-20201111000810614
访问 localhost:8080/06_servlet/hello

image-20201111000945419

image-20201111001026343

image-20201111001056479
在上面的说明中,我们已经理解了 Servlet 的基本操作。但是可以知道,我们上面进行Servlet请求的时候,都是执行 service 方法。
那么一般我们请求都会分为多种方式,例如: GET \ POST \ PUT \ DELETE 请求。这些请求都全部会请求到 Servlet 中,那么该怎么区分处理呢?
下面我们来演示一下这个问题。

image-20201111001714606
<!--form表单请求-->
<form action="http://localhost:8080/06_servlet/hello" method="get">
<input type="submit">
</form>
访问 http://localhost:8080/06_servlet/a.html

image-20201111002052868

image-20201111002105544
此时可以看到,通过 get 请求可以访问到 service 方法。

image-20201111002200468

image-20201111002236018
从结果来看,也就是不管是 get 请求 还是 post 请求,都会触发 service 方法。
如果需要将请求进行方法,那么首先就需要获取到底请求过来的是什么方法。

image-20201111002647206
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. service 方法:hello servlet被访问了!");
// 类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
System.out.println("请求的方法:" + method);
}

image-20201111080419393
可以看到,我们已经获取到请求的方法了,下面再来看看 GET 请求。

image-20201111080933086
可以看到也能够检测出请求是 GET 方法。

image-20201111081629224
package com.test01;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author Aron.li
* @date 2020/11/10 23:34
*/
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("1. HelloServlet构造方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2. init 初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 实现 service 方法,专门用来处理请求和响应
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. service 方法:hello servlet被访问了!");
// 类型转换(因为它有getMethod()方法)
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求的方式
String method = httpServletRequest.getMethod();
System.out.println("请求的方法:" + method);
// 根据method分发执行不同的方法
if ("GET".equals(method)){
this.doGET();
}else if ("POST".equals(method)){
this.doPOST();
}
}
/**
* 处理GET方法
*/
public void doGET(){
System.out.println("处理GET方法");
}
/**
* 处理POST方法
*/
public void doPOST(){
System.out.println("处理POST方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4. destroy 销毁方法!");
}
}
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址

image-20201111083139991
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

image-20201111083331572

image-20201111083433147
<!-- 配置HelloServlet2 -->
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.test01.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>

image-20201111083628873
可以从上面的操作来看,使用 HttpServlet 来实现 Servlet 比较简单。
上面我们通过手写 HttpServlet 也是能够很快速开发 Servlet 程序,但是还有更加快的。其实这是 IDEA 提供的快捷方法,下面我们来试试。

image-20201111084329256

image-20201111084525874

image-20201111084650634

image-20201111084801321
<!-- 配置HelloServlet3 -->
<servlet>
<servlet-name>HelloServlet3</servlet-name>
<servlet-class>com.test01.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet3</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>

image-20201111084902907

image-20201111085019930