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

时间:2011-08-07 18:44:48

标签: java tomcat servlets

我认为最简单的可能 你好世界的例子(见下文)。但是在要求的时候 “http:// localhost:8080 / hello”通过firefox, 它给了我 “请求的资源(/ hello /)不可用” 错误。

环境:在Windows 7上新安装的tomcat 6.0.32。

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

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

  2. 我设置了“&lt; load-on-startup&gt;” 这向我展示了servlet的init条目 调用,但doGet()永远不会被调用。

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

  4. 我已经尝试过用hello启动tomcat 已经在webapps中的目录,其中包含hello.war webapps,并使用管理器应用程序进行部署。 所有行为都是一样的。

  5. 我考虑过的一些可能性:

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

    2. localhost:8080 / hello应该是 localhost:8080 /.../你好,但如果是的话,那是什么 ......应该是?

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

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

      [已添加8/8/2011] 关于使用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();
        }
      }
      

4 个答案:

答案 0 :(得分:4)

使用Java Servlet应用程序(Java EE的一部分,但不是Java EE的总和),应用程序在所谓的“上下文路径”下具有servlet。必须指定此“上下文路径”才能将任何请求映射到应用程序。

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

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

当然,一旦请求被发送到上下文路径,就需要匹配它。这就是web.xml的用武之地。虽然可以使用root作为匹配器(对上下文路径的每个请求都由同一个进程处理),但通常使用一个模式(例如* .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

答案 1 :(得分:2)

您正在使用Web应用程序部署hello servlet。假设webapp位于Tomcat的helloapp目录中的helloapp.war文件夹或存档webapps中,则可以在http://localhost:8080/helloapp/hello

访问您的sevlet

答案 2 :(得分:1)

您需要将软件包重命名为ROOT.war(或ROOT目录),或修改ROOT.xml context.xml文件以指向hello文件夹。

答案 3 :(得分:0)

如果你去/ hello / hello我打赌你会看到你的应用程序。如果您使用的是tomcat,请使用context.xml。 您可能不需要使用它来使webapp工作,但是如果您在tomcat下部署,那么当您拥有context.xml文件时,事情会更加连贯。

在/ yourtomcatinstall / webapps / hello / META-INF /中创建一个包含此信息的context.xml文件“

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/hello">
</Context>

将web.xml中servlet的url映射更改为/和/或/ *可以为servlet创建多个url映射。