我有我认为最简单的可能 Hello World 示例(见下文)。但是当要求 “http://localhost:8080/hello” 通过 firefox, 它给了我 “请求的资源 (/hello/) 不可用” 错误。
环境:Windows 7新装tomcat 6.0.32
其他信息: 1.“类似问题”均未提供任何线索。
从实验来看,tomcat 似乎不是 执行从 localhost:8080/hello 到我的 servlet 的映射。
我设置了“
” 这向我展示了 servlet 的初始化条目 被调用,但永远不会调用 doGet()。 日志文件显示没有错误。
我试过用 hello 启动 tomcat 目录已经在 webapps 中,其中有 hello.war webapps,并使用管理器应用程序进行部署。 所有人都以同样的方式行事。
我考虑过的一些可能性:
根据文档,我应该 不需要使用 context.xml 文件,我的实验 使用 context.xml 生成相同的资源未找到 错误。
localhost:8080/hello 应该改为 localhost:8080/.../hello,但如果是这样,那是什么 应该是……?
尾随/(例如/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.action
和 http://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/