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 类的继承体系

相关推荐
Green1Leaves20 分钟前
pytorch学习-9.多分类问题
人工智能·pytorch·学习
慕y27439 分钟前
Java学习第十五部分——MyBatis
java·学习·mybatis
碣石潇湘无限路1 小时前
【AI篇】当Transformer模型开始学习《孙子兵法》
人工智能·学习
future14123 小时前
C#每日学习日记
java·学习·c#
碎叶城李白5 小时前
若依学习笔记1-validated
java·笔记·学习·validated
无级程序员5 小时前
hive2服务启动报错:/tmp/hive on HDFS should be writable(不是chmod 777能解决的)
hive·hadoop·hdfs
im_AMBER5 小时前
学习日志05 python
python·学习
真的想上岸啊6 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
rui锐rui7 小时前
大数据学习2:HIve
大数据·hive·学习
凛铄linshuo8 小时前
爬虫简单实操2——以贴吧为例爬取“某吧”前10页的网页代码
爬虫·python·学习