【问题标题】:Tomcat configuration for servletsservlet 的 Tomcat 配置
【发布时间】:2009-07-11 18:23:05
【问题描述】:

我已经安装了 Tomcat 并且一直在对其进行测试:我编写了一些 .html 和 .jsp 文件,然后在服务器中进行了尝试。它们似乎可以正确地协同工作。例如:我正在尝试的这些文件允许我将文件上传到服务器并将其名称写入数据库(MySQL)。完成后,我有一个按钮,允许我上传另一个文件,或者我可以查询存储在数据库中的文件的名称。

当我需要运行一个 servlet 时,我的问题就出现了。我正在尝试一个基本的:

package HelloWorldServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class HelloWorldServlet extends HttpServlet {

  public void init(ServletConfig conf)
    throws ServletException
  {
    super.init(conf);
  }
  public void service(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException
  {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();

    out.println("<html>");
    out.println("<body>");
    out.println("<h1>Hello World</h1;>");
    out.println("</body>");
    out.println("</html>");
  }
} 

从中我得到一个 .class 文件。我把这个文件放在:webapps/HelloWord/web-inf/classes

我真的不知道如何修改 web.xml 文件以及如何从 .html 或 .jsp 页面调用这个 servlet。

【问题讨论】:

    标签: java tomcat servlets


    【解决方案1】:

    首先,您的 web-inf 目录必须为大写(WEB-INF)。

    基本的 web.xml 如下所示:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <!DOCTYPE web-app 
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
        "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
        <servlet>
          <!-- 
            This is arbitrary name for your servlet,
            used in servlet-mapping below
           -->
          <servlet-name>HelloWorld</servlet-name>
    
          <!-- Name of your servlet class -->
          <servlet-class>HelloWorldServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
          <servlet-name>HelloWorld</servlet-name>
    
          <!--
             Here you say location (under context) where your servlet
             can receive requests.
           -->
          <url-pattern>/hello-world</url-pattern>
        </servlet-mapping>
    </web-app>
    

    您的 web.xml 必须保存在 &lt;your-app&gt;/WEB-INF/web.xml 路径中。

    现在,只要浏览器访问您服务器上的http://localhost/HelloWorld/hello-world,我们就会调用您的servlet,因为它映射到/hello-world,并且因为您的应用程序部署在HelloWorld 目录中(因此映射到/HelloWorld 上下文)。

    【讨论】:

    • 嗨。我按照你说的做了一切,现在我得到了一个不同的错误。当我将代码粘贴到此页面时,我忘记了第一行:“package HelloWorldServlet;”它会让事情变得不同吗?如果不是,我会发布我得到的错误。谢谢
    • @Charles - 添加一个包将 servlet 的完全限定类名更改为 HelloWorldServlet.HelloWorldServlet,它需要在文件 WEB-INF/classes/HelloWorldServlet/HelloWorldServlet.class 中
    • 想象所描述的 servlet 使用属于 HelloWorldServlet 包中包含的类 (writeLog) 的方法。我将 writeLog.class 放在与 HelloWorldServlet.class 相同的文件夹中吗?我还需要修改什么吗?谢谢
    • 是的。把它放在同一个文件夹中。您无需修改​​任何其他内容。
    • 是否可以在同一个包中拥有多个扩展 HttpServlet 的类?我试过了,但我认为当我在 web.xml 中引入它时出现错误。我不知道我是否可以在同一个包中做到这一点(那么我应该如何修改 web.xml?)或者我是否定义这个类在一个新包中(web.xml 对我来说仍然是一个问题)。谢谢
    【解决方案2】:

    首先将 Servlet 类映射到一个名称。然后将名称映射到 url 模式。 url 模式可以是单个路径,也可以是“globbing”模式,例如 /path/* 或只是 /*

    类似:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="TestApp" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <display-name>Test App</display-name>
        <servlet>
            <servlet-name>HelloWorld</servlet-name>
            <servlet-class>HelloWorldServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloWorld</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    </web-app>
    

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 1970-01-01
      • 2017-11-11
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2012-05-27
      • 2010-09-09
      • 1970-01-01
      相关资源
      最近更新 更多