0

過去数か月間、私はどのようにservlet mapping機能するかを理解しようとしてきました (無駄に)。私の脳のどの部分がこの概念を処理できないのかはわかりませんが、理解できないようです.

同様の質問を 4 ~ 5 回しましたが、すべての回答が決定的ではなく、投稿を削除できません。

数十、おそらく数百の重複があることは知っていますが、そのうちの少なくとも 30 を調べましたが、サーブレット マッピングの基本的な概念をまだ把握できていません。私のディレクトリ構造はあまりにも異なっています。

免責事項:私は自分の意思に反して、10 年前のソフトウェアを使用しています。トピックはまだ (ある程度) 関連している必要があります。最近、Java SE7 からかなり古いバージョンに移行しました。

  • J2SE 1.4.2
  • サン アプリケーション サーバー PE 8
  • Sun Deployツール
  • EJB 2.1

エラー:

HTTP ステータス 404 - /send_message

タイプステータス レポート

メッセージ/send_message

説明要求されたリソース (/send_message) は利用できません。

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"> アプリケーションの説明 SendMailApp ejb-jar-ic.jar war-ic.war sendmail                       

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();
        }
    }
}

もちろん、コードは新生的なエラーでいっぱいですが、意味的には私がやろうとしていることはそこにあります。それは間違っていますが、抽象的に考えればそれほど悪くはありません。

*何が起きているか: *

  • SendMailServlet.javaから呼び出すために、何十もの間違ったサーブレット マッピングを試しました。index.jsp
  • 彼らは恐ろしく、哀れなほど間違っています。

localhost:8080/sendmail

  • JSP が正しくロードされました
  • 送信時 (転送先/send_message(すなわちsendmail.SendMailServlet)):

HTTP ステータス 404 - /send_message

タイプステータス レポート

メッセージ/send_message

説明要求されたリソース (/send_message) は利用できません。

Sun-Java-System/Application-Server

2 か月の失敗を列挙する方法がわかりませんが、約 40 ~ 50 の異なるサーブレット マッピングを試しました。

プログラマーとしてどこで失敗しましたか?

4

3 に答える 3

1

私が見る限り、あなたの web.xml は正しいです。あなたはおそらく間違った場所を見ています。

これらすべてのキャッチを、あまり専門化されていない例外 (Exception e) をキャッチする単一のものに変更し、throw new RuntimeException(e); で例外を再スローします。例外を無視しないようにしてください。レスキューする必要がない場合は、RuntimeException でラップして、もう一度スローします。

IPlanet は悪夢です。おそらく、この EJB をルックアップしようとするとエラーが発生しますが、例外を無視しているため、これまでのところ確認できていません。JNDI ルックアップは、常に愚かなエラーの奇妙な原因です。

また、サーブレット インスタンスは再利用されることを意図しているため、destroy も呼び出さないでください。destroy は、ユーザーではなくコンテナによって呼び出されることを意図していました。サーバーがサーブレットを破棄したいときはいつでも適切に破棄する必要があるある種のリソースがある場合、サーバーでそれをオーバーライドできるようにするためだけに存在します。しかし、それはあなたのためではありません。また、それをオーバーライドすることさえほとんど必要ありません。

于 2013-03-04T04:01:25.767 に答える
0

web.xmlのマッピングが見つかりませんでした。また、send_mailURL pattern で使用できるサーブレット構成は 1 つしかありませ/send_messageん。構成を確認してください。

また、あなたのjspで置き換える必要があると思います:

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

と:

action="/send_mail"

つまり、コンテキスト path: を削除します。それ以外の場合は、リクエスト URL として/send_mail変換されます。localhost:8080/sendmail/send_mail

于 2013-03-04T04:11:30.857 に答える
0

犯人が見つかりました。サーブレットで/index転送する必要があるときに転送しようとしていますindex.jspdoPost

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

また、使用法に関する Marcos Eliziário Santos の提案に従っsuper.destroy()てください。コードから削除してください。

于 2013-03-04T04:19:01.887 に答える