Tomcat Catalina 上下文 - 将现有 servlet 添加到上下文

2024-01-05

我想将现有的 servlet 添加到上下文中,并且当我使用 (Main.java) 时它可以工作:

Tomcat.addServlet(ctx, "MyServlet", new MyServlet());
ctx.addServletMappingDecoded("/url_pattern", "MyServlet")

但是,我在 servlet 内部有注释来映射 url_pattern(MyServlet.java):

@WebServlet(name = "MyServlet", urlPatterns = { "/url_pattern" })
@MultipartConfig(
  fileSizeThreshold = 1024 * 1024 * 1, // 1 MB
  maxFileSize = 1024 * 1024 * 10,      // 10 MB
  maxRequestSize = 1024 * 1024 * 100   // 100 MB
)

不幸的是,这些注释不起作用。我想从 Main.java 中删除映射并使用 Servlet 注释中的映射。

我使用Tomcat 10.0.0。

主程序.java

import java.io.File;

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

public class Main {

    public static void main(String[] args) throws LifecycleException,
    InterruptedException {
    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8082);

    Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());

    Tomcat.addServlet(ctx, "MyServlet", new MyServlet());
    
    ctx.setAllowCasualMultipartParsing(true);
    ctx.addServletMappingDecoded("/url_pattern", "MyServlet");
    
    
    tomcat.start();
    tomcat.getConnector();
    }
}

嵌入式 Tomcat 背后的想法是在代码中完成通常的 Tomcat 通过配置完成的工作。因此通过注解配置servlet并不像在Tomcat中那么简单。

你会面临两个问题:

注释扫描

之间的主要区别Tomcat#addContext https://tomcat.apache.org/tomcat-10.0-doc/api/org/apache/catalina/startup/Tomcat.html#addContext-java.lang.String-java.lang.String- and Tomcat#addWebapp https://tomcat.apache.org/tomcat-10.0-doc/api/org/apache/catalina/startup/Tomcat.html#addWebapp-java.lang.String-java.lang.String-是后者添加了一些默认值web.xml (the jsp and defaultservlet)并扫描 Servlet 3.0 注释和ServletContainerInitializers.

如果您不需要或不想要默认值web.xml配置,您可以获得相同的东西:

Context ctx = tomcat.addContext("", new File(".").getAbsolutePath());
ctx.addLifecycleListener(new ContextConfig());

资源

即使启用注释扫描后,Tomcat 也不会找到您的 servlet,因为它会查找/WEB-INF/classes你的docBase(您将其设置为当前文件夹)。这可能是一个空文件夹。如果您希望 Tomcat 也扫描应用程序中的类,您需要:

  1. 找到包含您的 JAR 文件或目录Main class,
  2. 将该 JAR 的内容安装到/WEB-INF/classes您的应用程序的(虚拟)文件夹(参见汤姆猫资源 http://tomcat.apache.org/tomcat-9.0-doc/config/resources.html):
public static void main(String[] args) throws LifecycleException, InterruptedException {
   ...
   // Add the JAR/folder containing this class to PreResources
   final WebResourceRoot root = new StandardRoot(ctx);
   final URL url = findClassLocation(Main.class);
   root.createWebResourceSet(ResourceSetType.PRE, "/WEB-INF/classes", url, "/");
   ctx.setResources(root);
   ...
}

/*
 * Tries to find the URL of the JAR or directory containing {@code clazz}.
 */
private static URL findClassLocation(Class< ? > clazz) {
    return clazz.getProtectionDomain().getCodeSource().getLocation();
}

Summary

最后你会得到:

    public static void main(String[] args) throws LifecycleException {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8082);
        final Context ctx = tomcat.addContext("", Paths.get(".").toAbsolutePath().toString());
        // Add the standard ContextConfig, which scans for annotations
        ctx.addLifecycleListener(new ContextConfig());
        // Add the JAR/folder containing this class to PreResources
        final WebResourceRoot root = new StandardRoot(ctx);
        final URL url = findClassLocation(Main.class);
        root.createWebResourceSet(ResourceSetType.PRE, "/WEB-INF/classes", url, "/");
        ctx.setResources(root);
        // Run Tomcat
        tomcat.getConnector();
        tomcat.start();
        tomcat.getServer().await();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat Catalina 上下文 - 将现有 servlet 添加到上下文 的相关文章

  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • Javadoc 1.5 和 1.6 中缺少 enum.valueOf(String name)

    这可能是一个愚蠢的问题 但我正在使用该方法enum valueOf String name 那里没问题 只是当我检查 javadoc 以了解有关此方法的更多信息时 我找不到它 有javadoc用于valueOf Class
  • 无法实例化接收器 com.parse.GcmBroadcastReceiver

    我正在编写一个使用 GCM 通知和解析推送的离子应用程序 这个应用程序正在使用这些插件 com ionic keyboard 1 0 3 Keyboard com phonegap plugins PushPlugin 2 4 0 Push
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • Java Spring 应用程序存在内存泄漏。系统非堆内存不断增加

    我已使用 yourkit 分析器监视我的 Web 应用程序 保留最大大小的主要对象是 SessionFactoryImpl webappclassloader 和 CGlib 对象显示 spring crone调度程序会导致内存泄漏吗 我尝
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • Java 泛型:如何为泛型类型指定类类型?

    我有一个 POJO 指定为 MyClass u where U是泛型类型参数 我正在尝试编写一个接受类引用的实用方法Class u
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我

随机推荐

  • 未找到类异常 - 在 Kohana 3.1 上制作 Helper

    全新安装了 Kohana 3 1 尝试着打造自己的帮手 我在 application classes helpers 目录中创建了一个助手 我已将文件称为 javascript php 该类称为 Helper Javascript 并且有一
  • 如何为所有按钮添加一个事件监听器

    如何向多个按钮添加事件侦听器并根据单击的按钮获取每个按钮的值 例如
  • 为 apache commons 快速傅立叶变换算法构建示例数据

    我想使用 Apache math commons 实现 FFT 快速傅里叶变换器类 来处理一些虚拟数据 这些数据的 8 个数据样本构成一个完整的正弦波 最大振幅为 230 我尝试的代码片段如下 private double transfor
  • 我应该在什么上下文中使用 AlertDialog.Builder?

    谁能解释一下我应该使用 AlertDialog Builder 类的上下文吗 我是 Android 应用程序开发的新手 坦率地说 我不明白何时使用哪个上下文 比如说 我想为 AlertDialog Builder 类创建一个对象 Alert
  • 隐藏 WinForms TreeView 加号

    我有一个 WinForms TreeView 有一个主节点和几个子节点 如何隐藏主节点中的 加号 审查财产 ShowRootLines false When ShowRootLines为 false 时 根节点不会显示加号 减号 但必要时仍
  • 如何以编程方式实现摇动动画?

    如何以编程方式在 android 中实现摇动 摆动动画 有一个AndroidView动画 https github com daimajia AndroidViewAnimations通过这个库我们就可以得到效果了 但我不想为此目的使用任何
  • 导出为 PDF 时表格行没有分页符

    将表格导出为 PDF 时 表格行不会分页 我尝试使用以下方法在每个表行上进行分页 tr 表格行中断如下 导出为 PDF 在浏览器内查看 我希望表行 Vrsta blaga storitve 保持紧凑 因此 单元格不会显示在不可打印区域中 如
  • 如何更改复选框选择时行的背景颜色

    我有 html 表 还有一些带有复选框的行 在选择复选框时 我想用一些背景颜色突出显示该行 table tr td td tr table
  • java.io.FileNotFoundException:/storage/emulated/0/Notes/fact50Result.txt:打开失败的ENOENT(没有这样的文件或目录)

    我正在尝试将阶乘计算的结果导出到 txt 文件中 我发现这段代码从这篇文章中看起来非常简单here https stackoverflow com questions 8152125 how to create text file and
  • 用层次结构和类替换数组可以吗?

    在我的实现中 我应该使用一个长数组 但数组的问题是它的索引对我来说没有多大意义 相反 我想使用层次结构类 然而 有时我需要以批量方式处理它们 例如在计算差异和导数或平均值时 所有成员都是double并且看起来对齐不会产生任何问题 下面是一个
  • MomentJS 设置时区而不更改时间

    我正在尝试在 moment js 中设置日期的时区而不更改时间值 我得到一个 UTC 日期 date toString Sun Sep 27 2015 00 00 00 GMT 0000 我需要设置时区而不更改时间 Sun Sep 27 2
  • WeakHashMap 的 keySet 条目永远不会为空吗?

    如果我迭代 WeakHashMap 的键集 是否需要检查 null 值 WeakHashMap
  • Objective-C++ 的缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 照片上传 CodeIgniter

    当我使用 CodeIgniter 上传照片时 图像的名称会更改为随机名称 例如 107fb08f4a11cc37a040237cdcf0e48a jpg 我在视图中显示数据库中的图像时遇到问题 因为它显示的是原始上传名称而不是新名称 如何禁
  • Vaadin - 根据内容为表格单元格着色

    我在这里有一个非常基本的示例 我尝试根据该单元格中存在的特定字符串值为特定单元格着色 我输入打印语句 然后点击返回 绿色 返回 橙色 等点 但在运行时我只得到灰色和白色交替的行颜色 而不是我的特定单元格颜色 我使用的 css 是直接从 va
  • Octave 中的折叠功能

    Octave 中的一维向量是否有折叠 减少 聚合等 的标准实现 如果没有 有没有办法在不使用循环语句的情况下表达折叠 The miscellaneous http octave sourceforge net miscellaneous i
  • 使用 MQTT Android 服务从飞行模式重新连接

    我正在实现此处找到的 Dale Lane MQTT Android 服务示例http dalelane co uk blog p 1599 http dalelane co uk blog p 1599 这个例子对于我的特定目的来说工作得很
  • 访问 YouTube 用户上传 Feed 中超过 start_index=1000 的项目

    我目前正在尝试从 YouTube 用户上传源中提取有关视频的数据 此 Feed 包含特定用户上传的所有视频 可通过以下请求从 API 访问 http gdata youtube com feeds api users USERNAME up
  • WPF 圆角文本框

    我不了解WPF 现在正在学习它 我一直在寻找圆角TextBox在 WPF 中 于是我用Google搜索了一下 找到了一段XAML
  • Tomcat Catalina 上下文 - 将现有 servlet 添加到上下文

    我想将现有的 servlet 添加到上下文中 并且当我使用 Main java 时它可以工作 Tomcat addServlet ctx MyServlet new MyServlet ctx addServletMappingDecode