【问题标题】:How to handle servlet?如何处理servlet?
【发布时间】:2017-03-22 19:33:34
【问题描述】:

我正在尝试创建一个简单的 servlet 应用程序,但是当我将它部署到我的 Tomcat 服务器 (8.5) 中时,localhost:8080 给了我405 方法不允许错误。 我不知道如何处理这个错误

我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.devcolibri</groupId>
    <artifactId>com.devcolibri.servlet</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>

</project>

我的 MainServlet.java

    package com.devcolibri.servlet;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;

    public class MainServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        PrintWriter out = resp.getWriter();
        out.print("<h1>Hello Servlet</h1>");

    }
}

我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <servlet>
        <servlet-name>mainServlet</servlet-name>
        <servlet-class>com.devcolibri.servlet.MainServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>mainServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

【问题讨论】:

  • 您试图如何访问您的 servlet?只需在浏览器中访问它的 URL?还是您要向其发布表单数据?
  • @JonSampson 是的,只需访问它的 URL
  • 我没有看到您发布的内容有问题,除了您可以尝试将&lt;scope&gt;provided&lt;/scope&gt; 添加到javax.servletjavax.servlet 依赖项中pom.xml。当您尝试访问未实现以返回您的请求的 servlet 资源时,将返回 405。因此,如果您对您的 URL 进行了 POST/PUT/HEAD,您会看到。您实现了 doGet 并且您的浏览器应该执行 GET,所以。 . . .
  • 给你的问题一个合适的标题,真正表达问题。如果您想引起知道答案的人的注意,那就是。

标签: java maven tomcat servlets


【解决方案1】:

我想我错过了明显的:我怀疑你的战争文件没有部署在斜线上。它可以部署在您的工件 ID 下。要将其部署在主机的根目录上需要更多配置。试试http://localhost:8080/com.devcolibri.servlet/

编辑:

或者http://localhost:8080/com.devcolibri.servlet-1.0-SNAPSHOT/应该是你的war文件名。

【讨论】:

    【解决方案2】:

    似乎访问 servlet 的方式不适用于受保护类型的 doGet 方法。请尝试公开 doGet。

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    
        PrintWriter out = resp.getWriter();
        out.print("<h1>Hello Servlet</h1>");
    
    }
    

    有关受保护和公开的更多信息,您可以参考这里:what is the difference between public service() method and protected service() method of httpservlet

    【讨论】:

    • 这可能不是正确的途径。 doGet 受到保护,HttpServlet 中只有一个版本。在这种情况下,我们不处理 service 方法。见Java Servlet return error 405 (Method Not Allowed) for POST request
    • @Jon Sampson,如果您看到可以清楚地看到适用于公共和受保护的评论,则问题仅在于 IllegalStateException 并且一旦删除此异常,两者都可以正常工作。如果我错了,请纠正我。
    • 我很犹豫,因为我已经使用 protected 部署了 servlet。但是,在这种情况下,您可能是正确的。我们来看看@socm_ 怎么说。
    • 非常感谢,我的war文件建错了。受保护的 doGet 函数是正确的@JonSampson
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2020-05-25
    • 2013-04-20
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多