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 添加到上下文 的相关文章

  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 将过滤器添加到 Eclipse 中的 Project Explorer

    我想向 Project Explorer 添加一个新的过滤器 以向用户隐藏一些在 Eclipse RCP 应用程序中自动创建的项目 到目前为止我已经找到了两个扩展点 org eclipse ui ide resourceFilters 允许
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 正则表达式获取字符串中的第一个数字和其他字符

    我是正则表达式的新手 想知道如何才能只获取字符串中的第一个数字 例如100 2011 10 20 14 28 55 在这种情况下 我希望它返回100 但该数字也可以更短或更长 我在想类似的事情 0 9 但它单独获取每个数字 100 2001
  • 是否有任何API可以将Microsoft Exchange服务器与Java应用程序集成以进行任务同步?

    我正在尝试将 Java Web 应用程序与 Microsoft Exchange 服务器集成以实现双向日历 即任务 同步 是否有用于此集成的 Java 开源 商业 API 谢谢 文卡特 看一眼j 交易所 http sourceforge n
  • 如何在 Eclipse 中使用其他外部 jar 依赖项创建不可运行/不可执行的 jar

    我无法通过 Eclipse 导出向导创建普通的 jar 不可运行 不可执行 它仅创建 jar 文件 但不会导出依赖的 jar 从而在从其他类调用导出的 jar 的方法时出现错误 请帮助 非常感谢 kurellajunior的建议 它是通过使
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 当您在数组列表上调用remove(object o)时,它如何比较对象?

    当您在 java 中的数组列表上调用remove object o 时 它如何比较对象以找到要删除的正确对象 它使用指针吗 或者它使用 Comparable 接口来比较对象吗 ArrayList remove 依赖于对象的实现Equal方法
  • 如何在Java媒体框架中学习.wav持续时间?

    我正在尝试使用 java 媒体框架将 mov 文件与 wav 文件合并 因此我需要知道它们的持续时间 我怎样才能做到这一点 任何想法 将不胜感激 您可以使用以下方式了解声音文件的持续时间 即 VitalyVal 的第二种方式 import
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 为什么这个私人浮动字段变为零?

    我有一些奇怪的行为 我很难向自己解释 称为 textureScale 的浮点字段变为零 如果某些代码正在更改该值 则可以解释这一点 然而 我希望能够通过将其设置为 私有最终浮点 来导致构建失败 或者至少是运行时异常 那么无论更改该值都将失败
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 每次我们调用浏览器时,在 selenium 中使用 driver.manage().window().maximize() 是否好?

    We use driver manage window maximize 最大化浏览器 我在网上看到一些使用的例子driver manage window maximize 尽管不需要最大化浏览器 例如 gmail 登录 我还看到使用 se
  • 为什么应该首选 Java 类的接口?

    PMD https pmd github io 将举报以下违规行为 ArrayList list new ArrayList 违规行为是 避免使用 ArrayList 等实现类型 而是使用接口 以下行将纠正违规行为 List list ne

随机推荐

  • 未找到类异常 - 在 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