Spring MVC

Spring web MVC

Tomcat

Tomcat 是一个开源的轻量级web服务器和servlet容器。它实现了java servlet等java EE 规范的核心功能,常用于部署和运行javaweb应用程序。

Tomcat 是一个严格遵循Servlet 规范开发出来的,可以独立安装和运行Java web服务器/servlet容器

核心功能:

  • servlet容器:支持servlet的执行,处理HTTP请求和响应
  • Web服务器:提供静态资源(如HTML)的访问能力,支持基本的Http服务

servlet

  1. API示范

    创建项目/配置文件

    • 在IDEA中创建Maven项目

    • 在pom.xml 文件中添加servlet依赖(置于< project >< /project >标签下)

      <dependencies>
              <dependency>
                  <groupId>jakarta.servlet</groupId>
                  <artifactId>jakarta.servlet-api</artifactId>
                  <!--servlet依赖版本应与jdk和tomcat的版本相匹配-->
                  <version>6.1.0</version>
                  <scope>provided</scope>
              </dependency>
      </dependencies>
      
  • 在main路径下创建webapp/Web-INF/web.xml,在xml文件中添加以下内容

    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
    </web-app>
    
    • API示例

      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      
      import java.io.IOException;
      
      //设置访问路径(url)
      @WebServlet("/method")
      //继承HttpServlet并重写doGet和doPost方法
      public class MethodServlet extends HttpServlet {
          //接收method=post的请求
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
              System.out.println("doPost");
              resp.setContentType("text/html; charset=utf-8");
              resp.getWriter().write("doPost");
          }
          //接收method=put的请求
          @Override
          protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
              System.out.println("doPut");
              resp.setContentType("text/html; charset=utf-8");
              resp.getWriter().write("doPut");
          }
          //接收method=delete的请求
          @Override
          protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
              System.out.println("doDelete");
              resp.setContentType("text/html; charset=utf-8");
              resp.getWriter().write("doDelete");
          }
      }
      
  1. 生命周期

    servlet生命周期由web容器(如Tomcat)管理,包含加载初始化处理请求销毁四个阶段

    每个阶段对应特定的方法调用,开发者可以 通过重写这些方法实现自定义逻辑

    1. 类加载:Web容器通过类加载器加载 Servlet 类(通常首次请求触发或容器启动时预加载,字节码文件被加载到内存但未实例化)。具体类加载流程请阅读:Java虚拟机——JVM(Java Virtual Machine)解析一
      1. 实例化:确认Servlet类成功加载后立刻执行,在整个Web容器中每种Servlet类(如HttpServlet)只会有一个实例化对象
    2. 初始化:Web容器调用刚刚创建好的Servlet实例的init(ServletConfig config)方法,在整个servlet实例的生命周期中仅调用一次,主要作用是读取配置和资源加载。若初始化失败,抛出
      ServletException,Servlet不会被加入可用队列
    3. 处理请求:Web容器为每个请求创建线程,调用service(ServletRequest req, ServletResponse res)方法。service() 方法根据
      HTTP请求类型(get/post)调用doGet()或doPost()
    4. 销毁:Web容器调用 destroy()方法,Servlet 实例被标记为垃圾回收

Spring 配置文件

配置文件

SpringBoot配置文件:SpringBoot支持多种类型的配置文件,常见的格式包括properties、yaml和yml,主要用于集中管理应用程序的各种配置参数,简化部署和开发过程中的环境切换

YAML和YML本质上是相同的文件格式,只是文件扩展名的不同,两者在功能和使用上没有区别

properties

  • properties配置文件是最早期的配置文件格式,也是创建SpringBoot项目默认的配置文件
  • 采用常见的键值对格式(key=value)
  • 支持# 开头的注释
#应用程序名称
spring.application.name=configuration
#应用程序端口号
server.port=8080
#数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/database_name?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

yml

  • 采用键值对格式(key:value),冒号后面必须有空格
  • 数据序列化格式,通过缩进表示层级关系
  • 支持#开的注释
spring:
  application:
    #应用程序名称
    name: configuration
  #数据库连接信息
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/database_name?characterEncoding=utf8&useSSL=false
    username: root
    password: root
#应用程序端口号
server:
  port: 8080

properties优先级高于yaml

@Value注解

作用:是Spring框架提供了一个@Value注解(org.springframework.beans.factory.annotation.Value),用于将外部配置文件中的值注入到Spring管理的Bean中

properties 和 yml 的读取方式相同

package org.example.configuration.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
    @Value("${spring.application.name}")
    private String applicationName;
    @Value("${server.port}")
    private Integer port;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;

    public void print() {
        System.out.println("applicationName=" + applicationName);
        System.out.println("port=" + port);
        System.out.println("url=" + url);
        System.out.println("username=" + username);
        System.out.println("password=" + password);
    }
}

package org.example.configuration;
import org.example.configuration.config.Config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class ConfigurationApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(ConfigurationApplication.class, args);
        Config config = context.getBean(Config.class);
        config.print();
    }
}

运行结果:
applicationName=configuration
port=8080
url=jdbc:mysql://127.0.0.1:3306/database_name?characterEncoding=utf8&useSSL=false
username=root
password=root

posted @ 2025-11-01 17:03  小郑[努力版]  阅读(1)  评论(0)    收藏  举报