Java Servlet上下文路径和注册是正确的,但映射仍然不起作用。我该如何调试/修复它?
我不是一个经验丰富的j2ee开发人员,所以如果我遗漏了一些基本的或明显的东西,请提前原谅 我正在使用Tomcat7。 项目通过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
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