java - HTTP 状态 404 -/<servlet-name> - 请求的资源 [ServletName] 不可用

标签 java jakarta-ee servlets

这个问题在这里已经有了答案:





Servlet returns "HTTP Status 404 The requested resource (/servlet) is not available"

(19 个回答)


5年前关闭。




在过去的几个月里,我一直试图弄清楚 servlet mapping工作(无济于事)。 我不知道我大脑的哪个部分无法处理这个概念,但我似乎无法弄清楚。

我已经问了 4-5 个类似的问题,但所有的回答都没有定论……而且我无法删除这些帖子。

我知道有几十个,也许是几百个重复,但我已经浏览了至少 30 个,但仍然无法掌握 servlet 映射的基本概念。 我的目录结构太不同了。

免责声明:我违背自己的意愿使用了 10 年前的软件。主题应该仍然(有点)相关。我最近从 Java SE7 转换到了一个更旧的版本。

  • J2SE 1.4.2
  • Sun 应用服务器 PE 8
  • Sun 部署工具
  • EJB 2.1


  • 错误:

    HTTP Status 404 - /send_message

    type Status report

    message /send_message

    description The requested resource (/send_message) is not available.

    Sun-Java-System/Application-Server



    申请结构:

    ├───SendMail_app
        │   index.jsp
        │   SendMailApp.ear
        │
        └───sendmail
                SendMail.class
                SendMail.java
                SendMailBean.class
                SendMailBean.java
                SendMailHome.class
                SendMailHome.java
                SendMailServlet.class
                SendMailServlet.java
    


    注:我的导师指出,旧版本的 Java 不需要 META-INF , 或 WEB-INF明确地在目录结构中。这不是我不幸的决定。据说这是2005年的常态。

    应用程序.xml

    <?xml version='1.0' encoding='UTF-8'?>
    

    http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
    应用说明
    发送邮件应用程序

    ejb-jar-ic.jar



    war -ic.war
    发送邮件




    web.xml

    <?xml version='1.0' encoding='UTF-8'?>
    <web-app 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>WebApp</display-name>
        <servlet>
            <display-name>SendMailServlet</display-name>
            <servlet-name>SendMailServlet</servlet-name>
            <servlet-class>sendmail.SendMailServlet</servlet-class>
        </servlet>
        <servlet>
            <display-name>index</display-name>
            <servlet-name>index</servlet-name>
            <jsp-file>/index.jsp</jsp-file>
        </servlet>
        <servlet-mapping>
            <servlet-name>SendMailServlet</servlet-name>
            <url-pattern>/send_message</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
            <servlet-name>index</servlet-name>
            <url-pattern>/index</url-pattern>
        </servlet-mapping>
    </web-app>
    

    sun-web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd">
    <sun-web-app>
        <context-root>sendmail</context-root>
        <session-config>
            <session-manager persistence-type="memory">
                <manager-properties/>
                <store-properties/>
            </session-manager>
            <session-properties/>
                <cookie-properties/>
            </session-config>
            <cache enabled="true" max-entries="4096" timeout-in-seconds="30">
                <default-helper/>
            </cache>
            <class-loader delegate="true"/>
            <jsp-config/>
            <parameter-encoding default-charset="UTF8"/>
    </sun-web-app>
    

    **EAR 文件:C:\ejb_apps\SendMail_app\SendMailApp.ear
    EAR 显示名称:SendMailApp

    ├───META-INF
        │   application.xml
        │   sun-application.xml
        |   sun-j2ee-ri.project
        │
        └───ejb-jar-ic.jar
        |___war-ic.war
    


    war -ic.war
    WAR 显示名称:WebApp
    上下文根:sendmail

    ├───WEB-INF
    |    │   classes
    |    │      |____sendmail
    |    |----lib
    |    |----tags
    |    |----wsdl
    |    │----sun-j2ee-ri.project
    |    |----sun-web.xml
    |    |----web.xml
    |
    |____index.jsp
    


    ejb-jar-ic.jar
    JAR 显示名称:SendMailJAR

    ├───META-INF
    |    |----wsdl
    |    |----ejb-jar.xml
    |    |----sun-ejb-jar.xml
    |    │----sun-j2ee-ri.project
    |
    |____sendmail
           |----SendMail.class
           |----SendMailBean.class
           |----SendMailHome.class
    


    索引.jsp

    <%@ page import="sendmail.*" %>
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8"/>
            <title>Hermod</title>
            <link rel="stylesheet" href="master.css"/>
        </head>
    
        <body>
            <section id="sendmail_form">
                <form method="post" action="/sendmail/send_message">
                    <label>From</label><input type="email" name="from" size="32" maxlength="256"/><br>
                    <label>To</label><input type="email" name="from" size="32" maxlength="256"/><br>
                    <label>CC</label><input type="email" name="cc" size="32"/><br>
                    <label>BCC</label><input type="email" name="bcc" size="32"/><br>
                    <label>Subject</label><input type="text" name="subject" size="32" maxlength="256"/><br>
                    <label>Body</label><input type="text" name="body" size="32"/><br>
    
                    <button id="submit" type="submit">Submit</button>
                    <button id="clear" type="reset">Clear</button>
                </form> 
            </section>
    
            <section id="sendmail_result">
                <!--${requestScope.message_status}-->
            </section>
        </body>
    </html>
    

    SendMailServlet.java
    package sendmail;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.naming.InitialContext;
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.rmi.PortableRemoteObject;
    import javax.ejb.CreateException;
    import java.io.IOException;
    
     public class SendMailServlet extends HttpServlet {
        private ServletContext context = null;
    
        public SendMailServlet(){
            super();
        }
    
        public void init(ServletConfig config) throws ServletException {
            context = config.getServletContext();
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {
    
            try {
                Context initial = new InitialContext();
                Object objref = initial.lookup("java:comp/env/ejb/SendMail");
                SendMailHome home = (SendMailHome)PortableRemoteObject.narrow(objref, SendMailHome.class);
                SendMail sendmail = home.create();
    
                String status = sendmail.send(request);
    
                request.setAttribute("message_status", "status");
                RequestDispatcher RD = context.getRequestDispatcher("/index");
                RD.forward(request, response);
    
            } catch (ServletException SE){
                //TODO: log exception
            } catch (IOException IOE){
                //TODO: log exception
            } catch (CreateException CE){
                //TODO: log exception
            } catch (NamingException NE){
                //TODO: log exception
            } finally {
                super.destroy();
            }
        }
    }
    

    当然,代码中充满了新奇的错误,但从语义上讲,我正在尝试做的事情就在那里。这是错误的,但如果你抽象地思考它,它并没有那么糟糕。

    *发生了什么: *
  • 我尝试了几十个不正确的 servlet 映射来尝试调用 SendMailServlet.java来自 index.jsp
  • 他们是可怕的,可悲的不正确。

  • localhost:8080/sendmail
  • JSP 正确加载
  • 提交时(转发至 /send_message(即 sendmail.SendMailServlet)):


  • HTTP Status 404 - /send_message

    type Status report

    message /send_message

    description The requested resource (/send_message) is not available.

    Sun-Java-System/Application-Server



    我不确定如何列举 2 个月的失败,但我尝试了大约 40-50 种不同的 servlet 映射。

    作为一名程序员,我在哪里失败了?

    最佳答案

    据我所知,您的 web.xml 是正确的。你可能看错地方了。

    将所有这些捕获更改为单个捕获不太专业的异常(异常 e)并使用 throw new RuntimeException(e) 重新抛出异常;尽量不要忽略异常。如果您没有任何事情要做救援,那么只需将其包装在 RuntimeException 中并再次抛出它。

    IPlanet 是一场噩梦,当您尝试查找此 EJB 时,您可能会遇到错误,但由于您忽略了异常,因此到目前为止您还没有看到它。 JNDI 查找始终是愚蠢错误的奇怪来源。

    并且请不要调用 destroy ,因为它不是必需的,因为 Servlet 实例是为了被重用。 destroy 是由容器调用的,而不是用户调用的。它只是在那里,所以如果您有某种资源需要在服务器想要处理您的 Servlet 时正确处理,您可以在服务器中覆盖它。但它不适合你。甚至覆盖它也很少需要。

    关于java - HTTP 状态 404 -/<servlet-name> - 请求的资源 [ServletName] 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194219/

    相关文章:

    java - Elasticsearch 中的 log4j 升级

    java - JSP 超文本链接到索引页

    Java-EE SSE 聊天

    java - session 超时后如何重定向到指定页面

    java - Gradle 同步失败 : Could not find com. android.tools.build :gradle:4. 0.1

    java - 与 Integer.MAX_VALUE 比较并使用 System.out.println 时,for 循环提前终止

    java - 如何在jpql中选择列表元素的属性

    java - 在本地主机上通过 Java EE 读取电子邮件 Outlook

    java - servlet 类的 doPost 方法没有给出所需的结果

    java - Servlet - 获取客户端公共(public)IP