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 应用开发中。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务