Java Servlet上下文路径和注册是正确的,但映射仍然不起作用。我该如何调试/修复它?

Java Servlet上下文路径和注册是正确的,但映射仍然不起作用。我该如何调试/修复它?,java,maven,tomcat,servlets,Java,Maven,Tomcat,Servlets,我不是一个经验丰富的j2ee开发人员,所以如果我遗漏了一些基本的或明显的东西,请提前原谅 我正在使用Tomcat7。 项目通过tomcat7 maven plugin插件和pom.xml中的redeploy目标部署到tomcat实例。Build可以正常工作,唯一奇怪的是它在.war名称的末尾添加了符号,就像mytest.\war一样 Servlet代码非常简单:它只打印调试信息,并在GET请求时用字符串响应 Init部分工作正常。它打印以下映射信息(我想它是正确的): 但是,当我尝试请求http

我不是一个经验丰富的j2ee开发人员,所以如果我遗漏了一些基本的或明显的东西,请提前原谅

我正在使用Tomcat7。 项目通过
tomcat7 maven plugin
插件和
pom.xml
中的
redeploy
目标部署到tomcat实例。Build可以正常工作,唯一奇怪的是它在
.war
名称的末尾添加了
符号,就像
mytest.\war
一样

Servlet代码非常简单:它只打印调试信息,并在GET请求时用字符串响应

Init部分工作正常。它打印以下映射信息(我想它是正确的):

但是,当我尝试请求
http://localhost:8080/mytest/stupid
,它显示来自tomcat的404消息。jsp也是404,root返回一些无效的重定向(至少firefox告诉我们)

我的
web.xml
文件取自此处的一些答案,以符合Servlet 3.0标准:

Servlet代码:

@WebServlet(name = "StupidServlet", loadOnStartup = 1, urlPatterns = {"/stupid"})
public class StupidServlet extends javax.servlet.http.HttpServlet {

    @Override
    public void init() throws ServletException {
        super.init();
        System.out.print("This is STUPID INIT FROM SERVLET!!!!");
        Map servlets =  getServletContext().getServletRegistrations();
        System.out.println("\n===REGISTRATIONS==="+getServletContext().getServletContextName());
        System.out.println("Path="+getServletContext().getContextPath());

        for(String key:servlets.keySet()){
            ServletRegistration servlet = servlets.get(key);
            System.out.println(""+key+servlet.getMappings());
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("STUPID REQUEST IS DONE");
        super.doGet(req, resp);
        resp.getOutputStream().println("My name is Stupid Servlet");
        resp.flushBuffer();

    }
}

看来在找到答案之前我已经一步放弃了

这是调试输出行

Path=/mytest/                     //this is context path
持有解释上下文路径不应以尾随的
/
这也是
#
在部署的war结束时签名的原因(似乎文件名中不支持的符号被转换为#)。但是,我不确定为什么不忽略尾部的
/
。在我看来,这是一个缺陷

因此,我更改了tomcat7 maven插件的配置,将
/mytest/
替换为
/mytest

<configuration>
    <url>http://localhost:8080/manager/text</url>
    <server>tomcat7</server>
    <path>/mytest</path>
</configuration>

感谢@BalusC,我知道如何处理配置更改后收到的
405

目前发布的servlet代码将导致无限循环。你真的拿到404了吗?调试相当简单:运行一个调试器,在
doGet()
方法上放置一个断点,并跟踪代码的执行。如果你不知道如何使用调试器,那就把穷人的
System.out.println()
行放在战略位置,打印感兴趣的变量。实际上是404。我修复了super.service的愚蠢调用,但它实际上从未出现过。如果servlet真的被命中,该修复将导致405错误。顺便说一句,为了得到答案,你一直称每件事都是“愚蠢”也不是真正的激励/尊重。错的不是Java/Servlet API,很明显,
doGet
没有被调用,但我看不出有什么原因。您可以看到,我提供了很多上下文信息,而不仅仅是servlet代码。您的回答是“您的代码未执行!”这不是很有帮助。你能看到题目吗?至于我的标识符,它们与JavaAPI无关,我不是来责备java或冒犯stackoverflow用户的。那些名字和我的代码有关。显然,我的代码中有些东西很愚蠢,因为它不起作用。
<configuration>
    <url>http://localhost:8080/manager/text</url>
    <server>tomcat7</server>
    <path>/mytest</path>
</configuration>
Path=/mytest                     //this is context path