Servlet学习

项目结构

http 复制代码
MyServlet/
├── src/
│   └── com/
│       └── example/
│           └── MyServlet.java
└── web/
├── WEB-INF/
│   ├── web.xml
│   ├
│   └ lib/ (存放Servlet API等JAR)
│
└── index.html
(1)什么是Servlet?

:::warning

1、Servlet 是 JavaEE 规范之一。规范就是接口

2、Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。

3、Servlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。

:::

创建一个servlet类

java 复制代码
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应的内容类型为 HTML
        response.setContentType("text/html;charset=UTF-8");
        // 获取输出流,用于向客户端发送响应
        PrintWriter out = response.getWriter();
        // 写入动态生成的 HTML 内容
        out.println("<html>");
        out.println("<head><title>My First Servlet</title></head>");
        out.println("<body>");
        out.println("<h1>Hello, this is my first servlet!</h1>");
        out.println("</body>");
        out.println("</html>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 如果是 POST 请求,可以在这里处理表单数据等
        doGet(request, response); // 这里简单地调用 doGet 方法
    }
}

2. 传统映射配置方式(web.xml)

如果使用Servlet 3.0以下版本或想使用传统配置,在WEB-INF/web.xml中添加:

java 复制代码
  <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.guigu.servlet.MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/my</url-pattern>
    </servlet-mapping>

现在配置 Servlet

java 复制代码
import javax.servlet.annotation.WebServlet;

@WebServlet(name = "myServlet", urlPatterns = {"/my"})
public class MyServlet extends HttpServlet {
    // 代码和上面一样
}

访问Servlet(URL类比于网址)

启动Tomcat后,通过以下URL访问:

java 复制代码
http://localhost:8080/HelloServlet/hello

Servlet生命周期理解

  1. 加载和实例化:容器首次访问时加载Servlet类并创建实例
  2. 初始化 :调用init()方法,只有在服务器启动的时候执行初始化一次
  3. 处理请求 :调用service()方法,根据请求类型分发到doGet()/doPost(),一次请求就会执行一次,这是 Servlet 生命周期中最频繁调用的方法。

如果请求是 GET 类型,service() 方法会调用 doGet() 方法。

如果请求是 POST 类型,service() 方法会调用 doPost() 方法。

如果请求是其他类型(如 PUT、DELETE 等),service() 方法会调用 doGet() 或 doPost() 方法,具体取决 于 Servlet 的实现。

  1. 销毁 :调用destroy()方法 ,只有在项目销毁的时候执行一次
java 复制代码
package com.atguigu.servlet;

import jakarta.servlet.*;

import java.io.IOException;

public class HelloServlet implements Servlet {

  public HelloServlet() {
    System.out.println("1 构造器方法");
  }

  @Override
  public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println("2 init初始化方法");
  }

  @Override
  public ServletConfig getServletConfig() {
    return null;
  }

  //service方法是专门用来处理请求和响应的
  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    System.out.println("3 service == HelloService 被访问了");
  }

  @Override
  public String getServletInfo() {
    return null;
  }

  @Override
  public void destroy() {
    System.out.println("4 destroy销毁方法");
  }
}
(1)GET 和 POST 请求的分开处理
java 复制代码
用户访问服务器时,提交数据的请求方式:get和post
服务器要对这两种请求方式分开处理
java 复制代码
public class HelloServlet implements Servlet {
	//...
	
	//service 方法是专门用来处理请求和响应的
	@Override
	public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
		//要获得请求的方式,使用ServletRequest接口的子接口HttpServletRequest
		//因为HttpServletRequest有获得请求方式的方法 getMethod()
		//所以要进行强制转换
		HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
		// 获取请求的方式
		String method = httpServletRequest.getMethod();
		
		if ("GET".equals(method)) {
			doGet();
		} else if ("POST".equals(method)) {
			doPost();
		}
	}
	
	/**
	* 做 get 请求的操作
	*/
	public void doGet(){
		System.out.println("get 请求");
		System.out.println("get 请求");
	}
	/**
	* 做 post 请求的操作
	*/
	public void doPost(){
		System.out.println("post 请求");
		System.out.println("post 请求");
	}
}
java 复制代码
ctrl+h 可以查看该类/接口有多少子类/子接口

通过继承 HttpServlet 实现 Servlet 程序

http 复制代码
一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址

Servlet 类的代码:
java 复制代码
package com.atguigu.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class HelloServlet2 extends HttpServlet {
  //get请求时调用
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("HelloServlet2 的doGet()方法");
  }

  //post请求时调用
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("HelloServlet2 的doPost()方法");
  }
}

Servlet 类的继承体系

相关推荐
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
十月南城5 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
王九思5 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs