我认为最简单的可能 你好世界的例子(见下文)。但是在要求的时候 “http:// localhost:8080 / hello”通过firefox, 它给了我 “请求的资源(/ hello /)不可用” 错误。
环境:在Windows 7上新安装的tomcat 6.0.32。
其他信息: 1.“类似问题”都没有提供任何线索。
从实验中看来,tomcat似乎不是 从localhost:8080 / hello到我的servlet进行映射。
我设置了“< load-on-startup>” 这向我展示了servlet的init条目 调用,但doGet()永远不会被调用。
日志文件没有显示错误。
我已经尝试过用hello启动tomcat 已经在webapps中的目录,其中包含hello.war webapps,并使用管理器应用程序进行部署。 所有行为都是一样的。
我考虑过的一些可能性:
根据文件,我应该 不需要使用context.xml文件和我的实验 使用context.xml生成相同的资源未找到 错误。
localhost:8080 / hello应该是 localhost:8080 /.../你好,但如果是的话,那是什么 ......应该是?
尾随/(例如/ hello与/ hello /)。我变了 url-pattern为“/ hello / *”,但它失败了 方式。
我认为问题很简单,但我不能 看到它。
[已添加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();
}
}
答案 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.action
和http://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
答案 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映射。