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

时间:2013-03-04 03:42:41

标签: java java-ee servlets

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

我已经提出了4-5个类似的问题,但所有回复都没有结果......我无法删除帖子。

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

免责声明:我使用10年前的软件,违背我的意愿。这些主题仍然(有些)相关。我最近从Java SE7过渡到了更旧的版本。

  • J2SE 1.4.2
  • Sun Application Server PE 8
  • Sun Deploytool
  • EJB 2.1

错误:

  

HTTP状态404 - / send_message

     

类型状态报告

     

消息 / send_message

     

description 请求的资源(/ send_message)不可用。

     

太阳Java的系统/应用程序服务器


申请结构:

├───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-INFWEB-INF明确地位于目录结构中。这不是我不幸的决定。据说这是2005年的常态。


application.xml中

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

http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">  应用说明      SendMailApp   EJB-JAR-ic.jar        战争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

战ic.war WAR显示名称:WebApp Context Root: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

的index.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状态404 - / send_message

     

类型状态报告

     

消息 / send_message

     

description 请求的资源(/ send_message)不可用。

     

太阳Java的系统/应用程序服务器

我不知道如何列举2个月的失败,但我尝试过~40-50个不同的servlet映射。

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

3 个答案:

答案 0 :(得分:1)

到目前为止,我看到你的web.xml是正确的。你可能看错了地方。

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

IPlanet是一场噩梦,当您尝试查找此EJB时可能会出现错误,但是由于您忽略了迄今为止无法看到的异常。 JNDI查找始终是愚蠢错误的奇怪来源。

并请,也不要因为不需要而调用destroy,因为Servlet实例应该被重用。 destroy意味着由容器而不是用户调用。它只是存在,所以你可以在你的服务器中覆盖它,如果你有一种资源,只要服务器想要处理你的Servlet需要妥善处理。但它也不适合你。甚至覆盖它也很少有必要。

答案 1 :(得分:0)

web.xml我找不到send_mail的任何映射,并且只有一个servlet配置可用于网址格式/send_message,因此请验证您的配置。

另外我认为在 jsp 中你应该替换:

action="${pageContext.request.contextPath}/send_mail"

使用:

action="/send_mail"

即。删除上下文路径:/send_mail,否则将转换为localhost:8080/sendmail/send_mail作为请求网址。

答案 2 :(得分:0)

找到了罪魁祸首。当您转发到servlet /index中的index.jsp时,您正试图转发doPost

//wrong line
//RequestDispatcher RD = context.getRequestDispatcher("/index");
//solved!
RequestDispatcher RD = context.getRequestDispatcher("index.jsp");

另外,请遵循MarcosElisirio Santos关于super.destroy()用法的建议,只需将其从代码中删除即可。