java - Tomcat 6 无法识别 <url-mapping>

标签 java tomcat servlets

我有我认为最简单的可能 Hello World 示例(见下文)。但是当要求 “http://localhost:8080/hello” 通过 firefox, 它给了我 “请求的资源 (/hello/) 不可用” 错误。

环境:Windows 7新装tomcat 6.0.32

其他信息: 1.“类似问题”均未提供任何线索。

  1. 从实验来看,tomcat 似乎不是 执行从 localhost:8080/hello 到我的 servlet 的映射。

  2. 我设置了“” 这向我展示了 servlet 的初始化条目 被调用,但永远不会调用 doGet()。

  3. 日志文件显示没有错误。

  4. 我试过用 hello 启动 tomcat 目录已经在 webapps 中,其中有 hello.war webapps,并使用管理器应用程序进行部署。 所有人都以同样的方式行事。

我考虑过的一些可能性:

  1. 根据文档,我应该 不需要使用 context.xml 文件,我的实验 使用 context.xml 生成相同的资源未找到 错误。

  2. localhost:8080/hello 应该改为 localhost:8080/.../hello,但如果是这样,那是什么 应该是……?

  3. 尾随/(例如/hello 与/hello/)。我变了 url-pattern 为“/hello/*”,但同样失败 方式。

我认为问题很简单,但我不能 看到它。

[2011 年 8 月 8 日添加] 关于使用 context.xml 的答案是正确的;谢谢。 环顾四周,似乎另一种方式 达到同样的效果就是把这个 进入我的 web.xml 文件。

<context-param>
<param-name>ContextPath</param-name>
<param-value>/dts</param-value>
</context-param>

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>test.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

HelloServlet.java: 封装测试;

import java.io.*;

import javax.servlet.http.*;
import javax.servlet.*;

public class HelloServlet extends HttpServlet {

  public void init()
  {
    System.out.println("\nHelloServlet.init");
  }

  public void doGet (HttpServletRequest req,
                     HttpServletResponse res)
    throws ServletException, IOException
  {
    System.out.println("\nHelloServlet.doGet");
    PrintWriter out = res.getWriter();
    out.println("Hello, world!");
    out.close();
  }
}

最佳答案

对于 Java Servlet 应用程序(Java EE - Java Enterprise Edition 的一部分,但不是全部),应用程序在所谓的“上下文路径”下具有 servlet。必须指定此“上下文路径”,以便将任何请求映射到应用程序。

Apache Tomcat 使此上下文路径非常容易配置,可以通过 server.xml(不推荐)或单独的上下文文件(推荐)。两种方式都指定在哪里可以找到您的 Web 应用程序目录(一个解压的 Web 应用程序存档,或 WAR 文件)以及将它放在服务器上的上下文路径中的什么位置。

正如 Vlad 已经说过的,如果您将 war 文件部署到 Tomcat 的 webapps 目录并启用自动安装(我相信默认情况下是启用的),Tomcat 会将 .war 解压到该位置下的目录中并使用 war 的名称作为其上下文路径。他的示例 war 文件名为“helloapp.war”,因此,在默认设置下,它会接收对 http://localhost:8080/helloapp 的任何请求,因为它的上下文路径变成了 helloapp。

当然,一旦将请求发送到上下文路径,就需要对其进行匹配。这就是 web.xml 发挥作用的地方。虽然可以将根用作匹配器(对上下文路径的每个请求都由同一进程处理),但通常会使用一个模式(例如 *.do、*.action 等),以便各个请求helloapp 很容易区分(更容易阅读和调试 http://localhost:8080/helloapp/login.actionhttp://localhost:8080/helloapp/doSomethingElse.action 而不是通过一些参数和 http://localhost:8080/helloapp 在我看来相同的路径被识别)

因此,上下文路径到达您的应用程序,然后您的应用程序必须在 web.xml 上进行查找以查看将实际请求发送到哪里。在您的示例中,如果您的 webapp 部署在 helloapp 的上下文路径中,要使用正确的映射访问它,您只需附加/hello,因此请求变为 http://localhost:8080/helloapp/hello

关于java - Tomcat 6 无法识别 <url-mapping>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6974915/

相关文章:

java - 无法在 JPanel 上移动 JLabel

java - Tomcat问题重新部署:

java - 使用docker部署时tomcat的授权设置问题

java - 测试server.xml中配置的所有数据源

java - 如何将标签添加到选项卡式 Pane 上的额外空间

java - 12 Factor Apps - 将管理/管理任务作为一次性流程运行

java - 如果表单字段包含空格,Spring 命令对象将针对整数字段抛出 NumberFormatException

java - HTTP 状态 500 - servlet jersey 的 Servlet.init() -servlet 抛出异常

java - Java 磁盘缓存 http 库 : Does it exist?

java - 仅当从 servlet 访问时,带有日语的自定义 404 错误页面在 Tomcat 5 上变得不可读