2

次の簡単なアプリケーションがあるとします。

<form action="helloServlet" method="post">

        Give name:<input type="text" name="name" />

        <input type="submit" value="Send"/>
</form>

そして、そのフォームを処理するサーブレット:

package org.servlets.hello;

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

@WebServlet(name="helloServlet", urlPatterns={"/helloServlet"})
public class helloServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
String name = request.getParameter("name");


    PrintWriter out = response.getWriter();

    try {

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet helloServlet</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello  " + name + "</h1>");
        out.println("</body>");
        out.println("</html>");

    } finally { 
        out.close();
    }
} 

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}

}

これで、「Webページ」フォルダにあるWebページから実行すると完全に機能しますが、Webページのサブフォルダで同じことを実行しようとすると、404エラーが発生します(要求されたリソース()は利用できません)。 。サブフォルダをサーブレットを呼び出すための有効な場所にするために何かを変更する必要がありますか?

4

3 に答える 3

1

POSTアクション URL が で始まる場合、"/" それは絶対です。または、現在のページに相対的です

post url であるため<form action="helloServlet"、helloServlet は現在のパスに対して相対的です。

これは、helloservlet の URL にアクセスする方法です。

          Current Page          Servlet URL
Usage 1   /form.html            /helloservlet
Usage 2   /subfolder/form.html  /subfolder/helloservlet

あなたの場合、サーブレットがにマップされているため、使用法1が機能し/helloservletます。

解決:

行を修正

<form action="helloServlet" method="post">

<form action="/{contextPath}/}helloServlet" method="post">

あなたのコンテキストパスはデフォルトの"/"コンテキストパスではないと思います。その場合、ドメインに関連する URL が必要です。{contextpath} を実際のコンテキスト パスに置き換えます。

于 2012-06-19T17:37:57.300 に答える
0

ドメイン相対 URL を使用します。

<form action="${pageContext.request.contextPath}/helloServlet">

サーブレット マッピングですべてのフォルダーを繰り返す必要はありません。

以下も参照してください。

于 2012-06-19T23:37:15.523 に答える
0

わかりました、私は自分でそれを理解しました。他の誰かが同じ問題に遭遇した場合の私の解決策は次のとおりです。私が理解しているように、標準のJava Webプロジェクトのフォルダー構造は次のとおりです。

  • ウェブページ
    • WEB-INF
    • サブフォルダー
  • ソースパッケージ
    • org.whatever.name
  • ライブラリ
  • 構成ファイル

そのため、サブフォルダーに hello.jsp があり、次のようなフォームがあるとします。

<form action="helloServlet" method="post">

そして、次のような org.whatever.name のサーブレット:

@WebServlet(name="helloServlet", urlPatterns={"/helloServlet"})

次に、サーブレットの場所が Web ページ フォルダーに基づいてマップされ、2 つのファイルが相互に検出されません。したがって、サーブレットをサブフォルダーで使用できるようにするには、サーブレットを次のように変更します。

@WebServlet(name="helloServlet", urlPatterns={"SUBFOLDER/helloServlet"})

またはフォーム:

<form action="../helloServlet" method="post">
于 2012-06-19T22:23:27.647 に答える