1-Servlet路由&声明周期

1. 什么是Servlet技术

Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2. 环境搭建

新建项目(不要中文路径

  • jdk1.8 202
  • apache-tomcat-9.0.93
  • Pasted image 20250318220921
  • Pasted image 20250318221043

弄好后就会创建一个模板,然后运行就会起一个tomcat网站
Pasted image 20250318223926

3. Servlet开发

现在我们自己进行一些编写代码
比如我们现在新建一个 IndexServlet 类,并通过另外的路由来访问这个类的代码

package com.example.servlet;  
  
public class IndexServlet {  
}

我们对这个类进行继承 HttpServlet

package com.example.servlet;

import javax.servlet.http.HttpServlet;

public class IndexServlet extends HttpServlet {
}

3.1. Servlet的路由配置

3.1.1. 执行方法1 在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_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>index</servlet-name>
        <servlet-class>com.example.servlet.IndexServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>index</servlet-name>
        <url-pattern>/index</url-pattern>
    </servlet-mapping>

</web-app>
servlet配置相关标签

<servlet> 用于定义一个 Servlet 其中会包含两个标签

  • <servlet-name>:Servlet 的名称,在 <servlet-mapping> 里会用到。
  • <servlet-class>:Servlet 的全限定类名(com.example.servlet.IndexServlet),它是具体实现 HttpServlet 的 Java 类。

<servlet-mapping> 用于将 Servlet 名称映射到一个或多个URL路径

  • <servlet-name>:指定要映射的 Servlet(需要和 <servlet> 中的 servlet-name 保持一致)。
  • <url-pattern>:定义该 Servlet 处理的 URL 路径。

3.1.2. 执行方法二 简易配置方式

由于每个类都要到Web.xml里面进行配置会导致很繁琐。所以可以用第二中方法
直接在类里面加上 @WebServlet

@WebServlet(name = "index",value = "/index")

Pasted image 20250319000643

3.2. Servlet的生命周期&执行流程

然后我们根据这个流程图挨着写代码
Pasted image 20250318230944
挨着写方法 init doGet doPost service destroy

public class IndexServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("init Servlet");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost Servlet");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("service Servlet");
    }

    @Override
    public void destroy() {
        System.out.println("destroy Servlet");
    }
}

执行顺序
Pasted image 20250318231439

3.3. Servlet触发方法

然后我们访问 /index 路由就会触发一些对应的方法
Pasted image 20250318233005
发现只要一刷新就会触发 Servlet 的 service 方法
但是这里并没有触发 doGet doPost 方法
这里还有 doPut 等很多中方法,

3.4. Servlet 处理接受与返回

观察代码可以发现里面有 req 参数 resp 参数,这就是请求与返回

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost Servlet");
    }

这里我们只要

当我们在 doGet 方法里面加入对应的请求与返回代码 如下

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
    String name = req.getParameter("name");  
    resp.setContentType("text/html");  
    PrintWriter out = resp.getWriter();  
    out.println(name);   
    System.out.println("doGet Servlet");  
}

这时我们get请求 name=123 就会返回123

HttpServletRequest 是 ServletRequest 的子接口

  • getParameterValues — String[ ] 通过name获得多值
  • HttpServletResponse是ServletResponse的子接口

getParameter(name) — String 通过name获得值

  • setCharacterEncoding() 设置编码格式
  • setContentType() 设置解析语言
  • getWriter() 获得一个PrintWriter字符输出流输出数据
  • PrintWriter 接受符合类型数据