嵌入式Tomcat学习-第三天

写在前面

什么是嵌入式 Tomcat?

嵌入式 Tomcat 是将 Apache Tomcat 服务器作为库文件集成到 Java 应用程序中的技术方案。它允许开发者通过编程方式直接启动、配置和管理 Tomcat,无需依赖独立安装的 Tomcat 服务器,适用于构建轻量级、自包含的 Web 应用或微服务。

版本特性(11.0.3)

  • Servlet/JSP 规范支持
    支持 Servlet 6.0 和 JSP 4.0 规范(基于 Jakarta EE 10 平台)。
  • 轻量级嵌入
    通过 tomcat-embed-core 等依赖包实现核心功能集成,无需完整 Tomcat 安装。
  • Java 版本要求
    最低要求 Java 17 及以上版本。
  • 性能优化
    改进的 HTTP/2 支持、连接器性能调优及内存管理优化。

核心优势

  • 简化部署
    应用与服务器一体化,直接打包为可执行 JAR 文件,适合云原生场景。
  • 灵活配置
    通过代码动态配置端口、上下文路径、SSL 等参数,无需 server.xml 文件。
  • 开发便捷
    与 Spring Boot、Micronaut 等框架无缝集成,快速构建独立 Web 服务。
  • 资源占用低
    仅加载必要的组件,启动速度快,适合资源受限环境。

典型应用场景

  • 微服务架构中的独立服务节点
  • 快速原型开发或测试环境
  • 命令行工具集成 Web 接口
  • 需要定制化 Web 容器行为的场景

集成struts2

什么是struts2

Apache Struts 是一款免费、开源的MVC框架,用于构建优雅且现代化的Java Web应用程序。它遵循"约定优于配置"的设计理念,通过插件架构实现高度可扩展性,并自带支持REST、AJAX和JSON等技术的插件。

如何集成到tomcat中

Struts2官方文档

pom.xml添加struts2依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lhstack.tomcat</groupId>
    <artifactId>tomcat-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- 2025-02-16 新增 -->
        <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>7.0.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>11.0.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>11.0.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-websocket -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>11.0.3</version>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>aliyun</id>
            <name>阿里云</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>

</project>

在webapp目录下创建web.xml

image-dupg.png

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Basic Struts2</display-name>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index</welcome-file>
    </welcome-file-list>
</web-app>

在resource目录下面创建struts.xml

image-jyxj.png

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true"/>

    <package name="com.lhstack.tomcat.struts" extends="struts-default">
        <!-- 访问index路径会渲染WEB-INF/jsp/index.jsp -->
        <action name="index">
            <result>WEB-INF/jsp/index.jsp</result>
        </action>
    </package>
</struts>

移动index.jsp到WEB-INF下

image-xkrp.png

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

${pageContext.request.requestURI}
</body>
</html>

启动项目访问

image-xwbt.png

image-lpql.png

struts2渲染jsp携带参数

创建HelloAction.java

image-mpws.png

package com.lhstack.tomcat.struts;

import org.apache.struts2.ActionSupport;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

public class HelloAction extends ActionSupport {

    private Map<String,String> param;

    @Override
    public String execute() throws Exception {
        param = Map.of("date", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        return SUCCESS;
    }

    public Map<String, String> getParam() {
        return param;
    }
}

修改struts.xml配置

新增HelloAction配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true"/>

    <package name="com.lhstack.tomcat.struts" extends="struts-default">
        <!-- 访问index路径会渲染WEB-INF/jsp/index.jsp -->
        <action name="index">
            <result>WEB-INF/jsp/index.jsp</result>
        </action>
        <!-- 新增hello action -->
        <action name="hello" class="com.lhstack.tomcat.struts.HelloAction">
            <result name="success">WEB-INF/jsp/hello.jsp</result>
        </action>
    </package>
</struts>

创建hello.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello World!</title>
</head>
<body>
<h2><s:property value="param.date" /></h2>
</body>
</html>

启动项目,通过浏览器访问

image-xxfg.png

image-wtje.png

struts返回json内容

pom.xml增加json插件依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lhstack.tomcat</groupId>
    <artifactId>tomcat-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- 2025-02-16 新增 -->
        <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>7.0.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin -->
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-json-plugin</artifactId>
            <version>7.0.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>11.0.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>11.0.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-websocket -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>11.0.3</version>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>aliyun</id>
            <name>阿里云</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>

</project>

修改struts.xml

image-mwxx.png

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <constant name="struts.devMode" value="true"/>

    <package name="com.lhstack.tomcat.struts" extends="struts-default,json-default">
        <!-- 访问index路径会渲染WEB-INF/jsp/index.jsp -->
        <action name="index">
            <result>WEB-INF/jsp/index.jsp</result>
        </action>

        <action name="hello" class="com.lhstack.tomcat.struts.HelloAction">
            <result name="success">WEB-INF/jsp/hello.jsp</result>
        </action>
        <action name="json" class="com.lhstack.tomcat.struts.JsonAction" method="json">
            <!--      type=json      -->
            <result name="success" type="json">
                <!--       data为JsonAction中的data参数         -->
                <param name="root">data</param>
            </result>
        </action>
    </package>
</struts>

创建JsonAction.java

image-exsg.png

package com.lhstack.tomcat.struts;

import org.apache.struts2.action.Action;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

public class JsonAction {

    private Map<String, String> data;

    public String json() {
        data = Map.of("date", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),"name","lhstack");
        return Action.SUCCESS;
    }

    public Map<String, String> getData() {
        return data;
    }
}

启动项目并测试

image-cger.png

image-sspt.png

结尾

源码

今天写了如何在嵌入式tomcat中集成struts,并且实现jsp渲染和在jsp中使用strtus的tag标签以及json数据返回


嵌入式Tomcat学习-第三天
https://blog.lhstack.xyz/archives/tomcat-thirdday
作者
lhstack
发布于
2025年02月16日
许可协议