使用java简单实现的一个Spring框架(pom.xml仅包含Servlet jar包依赖)

本文详细介绍了如何使用Java从零开始实现一个类似Spring MVC的轻量级框架。通过配置Servlet、编写Action、实现Service、DI注解以及创建DispatcherServlet,逐步构建一个简化版的控制器调度和依赖注入系统。代码已上传至优快云,可供学习参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始前的准备
开发环境:jdk8+tomcat7+IDEA+maven
所需jar包:Servlet2.x
那么现在就开始吧


开发过程(绝对详细)
首先,启动IDEA创建一个maven项目,并创建下图所示的包结构,包名你们自己起就可以了

这里写图片描述

然后配置pom.xml,在里面引入Servlet依赖就可以了,这里我引入的2.x的,你们不要引入3.0的,虽然3.0的可以不需要web.xml配置,不过这里需要加载配置文件的
</dependency>
      <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <version>2.5</version>
          <scope>provided</scope>
      </dependency>
在Action中创建一个类,这里我创建的类为DemoAction.java,该类的作用在SSM框架中等同于Controller类,在里面写入下面代码:
@Controller("demoAction")
@RequestMapping("/web")
public class DemoAction {
   
   

    @Autowired("tom")
    private IDemoService demoService;

    @RequestMapping("/query")
    public void query(HttpServletRequest request, HttpServletResponse response,
                      @RequestParam("name") String name) throws IOException {

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        String result = demoService.get(name);

        PrintWriter writer = response.getWriter();
        writer.print(result);
        writer.close();
    }

}
这里要注意一点,里面我所用到的注解都是需要自己实现的,而不是Spring框架中的
然后我们来将所有类一个个的写上,首先先写Service吧,IDemoService是一个接口类,代码如下:
public interface IDemoService {
    public String get(String name);
}
它有一个实现类DemoService:
@Service("tom")
public class DemoService implements IDemoService {
   
   

    public String get(String name){
        return "my name is " + name;
    }
}
到这里,可以看到前面已经使用了很多的注解,但是都是报错的,所以现在我们来一个个的实现这些注解吧,很简单,我就直接贴到下面了:
Controller.java
//在类上可以使用
@Target({ElementType.TYPE})
//在运行时起作用
@Retention(RetentionPolicy.RUNTIME)
//让它可以识别
@Documented
public @interface Controller {
   
   

    String value() default "";
}

RequestMapping.java
//在类和方法上可以使用
@Target({ElementType.TYPE, ElementType.METHOD})
//在运行时起作用
@Retention(RetentionPolicy.RUNTIME)
//让它可以识别
@Documented
public @interface RequestMapping {
   
   

    String value() default "";
}

RequestParam.java
//在参数上可以
<think>好的,用户现在想知道`ServletWebServerFactory`在哪个jar里。之前他们遇到了Spring Boot启动时缺少这个Bean的错误,现在可能是在解决依赖问题,需要确认相关jar的存在。 首先,我需要回忆一下Spring Boot的结构。`ServletWebServerFactory`属于Spring Boot的web模块,具体应该在`spring-boot-starter-web`中,但可能具体实现可能在Tomcat、Jetty或Undertow的starter里。不过通常`spring-boot-starter-web`默认包含Tomcat,所以`ServletWebServerFactory`应该来自`spring-boot`项目本身的某个模块。 接下来,我需要确认具体的路径。根据经验,这个接口位于`spring-boot`项目的`spring-boot`模块下的`org.springframework.boot.web.servlet.server`中。对应的jar应该是`spring-boot-{version}.jar`,但可能需要更具体的模块,比如`spring-boot-autoconfigure`,因为自动配置通常会处理这些工厂类。 用户可能的问题在于,他们可能在依赖中排除了Tomcat或者使用了错误的starter,导致这个类没有被正确引入。比如,如果用户排除了Tomcat并尝试使用Jetty,但没有添加对应的Jetty starter,也会出现这个问题。需要提醒用户检查依赖,确保引入了正确的web starter,并且没有排除相关的服务器依赖。 另外,用户可能手动排除了某些依赖,或者使用了自定义的ServletWebServerFactory,这时候需要确认相关的jar是否在classpath中。可能还需要检查Maven或Gradle的依赖树,查看是否有冲突或排除的情况。 总结来说,用户需要知道`ServletWebServerFactory`所在的jar,以便确认是否引入了正确的依赖。应该指出该接口位于`spring-boot`项目的`spring-boot`模块,具体在`spring-boot-{version}.jar`中的`org.springframework.boot.web.servlet.server`下。同时,提醒用户检查是否添加了对应的web starter依赖,比如`spring-boot-starter-web`,并确保没有排除内嵌服务器相关的依赖。</think>--- ### 定位 `ServletWebServerFactory` 所在的 Jar `org.springframework.boot.web.servlet.server.ServletWebServerFactory` 是 Spring Boot 定义内嵌 Servlet 容器(如 Tomcat、Jetty、Undertow)的核心接口,它位于以下 Jar 中: - **核心 Jar **: ```text spring-boot-{version}.jar ``` 具体路径为 `org.springframework.boot:spring-boot` 模块。 --- ### 依赖关系解析 #### 1. **直接依赖来源** 该接口由 Spring Boot 的 **基础模块** 提供,但实际实现类由具体的 Servlet 容器依赖引入: - **Tomcat**(默认): 依赖 `spring-boot-starter-tomcat`(包含在 `spring-boot-starter-web` 中) ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> ``` - **Jetty**: 依赖 `spring-boot-starter-jetty` ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> ``` - **Undertow**: 依赖 `spring-boot-starter-undertow` ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> ``` #### 2. **为什么需要检查依赖?** 若项目中缺少上述 Servlet 容器的依赖Spring Boot 将无法自动配置 `ServletWebServerFactory`,导致启动失败。 --- ### 验证方法 #### 步骤 1:检查项目中是否包含 Web 依赖 - **Maven 项目**:运行以下命令查看依赖树: ```bash mvn dependency:tree | grep "spring-boot-starter" ``` 确认输出中包含 `spring-boot-starter-web` 及其关联的 Servlet 容器(如 `spring-boot-starter-tomcat`)。 - **Gradle 项目**:运行: ```bash gradle dependencies | grep "spring-boot-starter" ``` #### 步骤 2:检查 Jar 中的类是否存在 解压 `spring-boot-{version}.jar`,确认路径中存在: ```text org/springframework/boot/web/servlet/server/ServletWebServerFactory.class ``` --- ### 常见问题场景 #### 1. **依赖冲突** 若手动排除了默认的 Tomcat(例如在 `spring-boot-starter-web` 中排除 Tomcat): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ``` 但未添加其他 Servlet 容器依赖,会导致 `ServletWebServerFactory` 实现类缺失。 #### 2. **错误使用 WebFlux** 若项目中依赖 `spring-boot-starter-webflux`,Spring Boot 会配置为响应式 Web 应用(`REACTIVE` 类型),此时不会注册 `ServletWebServerFactory`。 --- ### 解决步骤 1. **添加 `spring-boot-starter-web` 依赖** 确保至少包含一个 Servlet 容器(默认使用 Tomcat)。 2. **避免排除关键依赖** 检查 `pom.xml` 或 `build.gradle` 中的 `<exclusion>` 配置。 3. **切换 Servlet 容器** 如需使用 Jetty 或 Undertow,显式替换依赖(参考 [Spring Boot 文档](https://spring.io/guides/gs/serving-web-content/))。 --- ### 总结 - **接口位置**: `spring-boot.jar`(由 `org.springframework.boot:spring-boot` 提供)。 - **实现类来源**: 由具体的 Servlet 容器依赖(如 Tomcat、Jetty、Undertow)提供。 - **关键操作**: 检查依赖配置,确保未排除 Servlet 容器库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值