javaweb 上篇

一、Tomcat 核心定位与职责

1. Tomcat 是什么?

Tomcat 是 Web 服务器(Servlet 容器),核心作用是:

  • 服务初始化:启动时加载 Web 应用配置(如 web.xml),创建 ServletContext(应用域)和 ServletConfig(Servlet 配置)。
  • 网络通信:监听端口(默认 8080),接收客户端 HTTP 请求。
  • 请求处理:解析请求路径,通过「路由规则」将请求分发到对应的 Servlet 处理,并返回响应。

2. Tomcat 与 Servlet 的关系

Tomcat 是 Servlet 规范的实现者,负责:

  • 解析配置:读取 web.xml 或注解配置,创建 ServletConfig 对象(每个 Servlet 一个),存储初始化参数(如数据库连接信息)。
  • 生命周期管理:控制 Servlet 的 init()service()destroy() 方法调用,无需开发者手动管理。

二、Servlet 规范与实现类

1. Servlet 接口(规范)

  • 地位:Java EE 定义的接口(jakarta.servlet.Servlet),规定了 Servlet 的核心方法(如 initservicedestroy)。
  • 作用:开发者需实现此接口或继承其子类,定义具体的业务逻辑(如处理登录、数据查询)。

2. Servlet 实现类的继承层次

jakarta.servlet.Servlet(接口)  // 爷爷:定义通用方法
├─ jakarta.servlet.GenericServlet(抽象类)  // 儿子:实现通用逻辑(非 HTTP 专用)
│  ├─ jakarta.servlet.http.HttpServlet(抽象类)  // 孙子:HTTP 协议专用,简化开发
  • GenericServlet
    • 实现 Servlet 接口,提供 ServletConfig 封装(通过 getServletConfig() 获取配置)。
    • 适用于非 HTTP 协议(如 FTP),但实际开发中较少直接使用。
  • HttpServlet(重点!):
    • 继承 GenericServlet,专为 HTTP 协议设计,提供 doGetdoPostdoDelete 等方法,直接处理不同类型的 HTTP 请求。
    • 示例
      @WebServlet("/user")
      public class UserServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
              // 处理 GET 请求(如查询用户)
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
              // 处理 POST 请求(如创建用户)
          }
      }
      

三、ServletConfig:单个 Servlet 的配置容器

1. 作用

  • 每个 Servlet 对应一个 ServletConfig 对象,存储 当前 Servlet 的初始化参数(如该 Servlet 独有的配置项)。
  • 提供方法访问配置信息:
    String getInitParameter(String name); // 通过参数名获取值(如数据库 URL)
    Enumeration<String> getInitParameterNames(); // 获取所有参数名
    ServletContext getServletContext(); // 获取当前 Web 应用的上下文(应用域)
    

2. 配置方式

  • web.xml 配置
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>com.example.UserServlet</servlet-class>
        <init-param>
            <param-name>dbUrl</param-name>
            <param-value>jdbc:mysql://localhost:3306/db</param-value>
        </init-param>
    </servlet>
    
  • 注解配置(Servlet 3.0+)
    @WebServlet(
        name = "userServlet",
        urlPatterns = "/user",
        initParams = @WebInitParam(name = "dbUrl", value = "jdbc:mysql://localhost:3306/db")
    )
    

四、ServletContext:Web 应用的全局上下文(应用域)

1. 核心特性

  • 唯一性:每个 Web 应用(部署在 Tomcat 中的一个项目)对应一个 ServletContext 对象,所有 Servlet 共享此对象。
  • 生命周期:与 Web 应用一致(服务器启动时创建,关闭时销毁)。
  • 作用
    • 共享数据:存储所有用户共享、极少修改、数据量小的信息(如全局配置、缓存数据)。
    • 访问资源:获取 Web 应用路径(getRealPath)、读取配置文件(getResourceAsStream)。
    • 日志记录:通过 log(String message) 记录应用级日志。

2. 数据操作方法

// 存:向应用域中存储数据(类似 Map)
setAttribute(String name, Object value);  
// 取:从应用域中获取数据
Object getAttribute(String name);  
// 删:移除应用域中的数据
removeAttribute(String name);  

示例

// 在某个 Servlet 中存储全局用户信息(假设所有用户可见)
User globalUser = new User("admin", "admin");
request.getServletContext().setAttribute("globalUser", globalUser);

// 另一个 Servlet 中获取该数据
User user = (User) request.getServletContext().getAttribute("globalUser");

3. 注意事项

  • 线程安全:数据被所有用户共享,修改时需加锁(如 synchronized),避免并发问题。
  • 数据量:仅存储轻量数据(如配置项、统计计数器),避免大对象占用内存。
  • 用途场景:适合存储「只读或极少修改的全局数据」(如系统版本号、公共参数)。

五、总结:Tomcat 与 Servlet 组件协作流程

  1. Tomcat 启动
    • 解析 web.xml 或注解,创建 ServletContext(应用域)和各 ServletConfig(Servlet 配置)。
  2. 请求到达
    • Tomcat 接收 HTTP 请求,根据 URL 找到对应的 Servlet(通过 web.xml@WebServlet 映射)。
  3. Servlet 处理
    • Tomcat 调用 Servlet 的 service() 方法(HttpServlet 会根据请求方法调用 doGet/doPost 等)。
    • Servlet 通过 this.getServletConfig() 获取自身配置,通过 getServletContext() 访问应用域数据。
  4. 响应返回
    • Servlet 生成响应数据,Tomcat 将其封装为 HTTP 响应,返回给客户端。

通过这种分层协作,Tomcat 实现了「请求接收→路由分发→Servlet 处理」的完整流程,而开发者只需专注于 Servlet 业务逻辑和配置,大幅简化 Web 应用开发。

Javaweb 文章被收录于专栏

JavaWeb 是指使用 Java 技术来开发基于 Web 的应用程序,它结合了 Java 语言的强大功能和 Web 技术的灵活性,广泛应用于各种企业级 Web 应用开发中。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务