0

JSP からサーブレットにデータを送信するための単純な HTML フォームを作成しようとしています。404 not found 例外が発生します。私のリクエスト URL:http://*****:80**/myapps/more/test.html

HTML

<form id="userForm" action="/more/loginServlet" method="post">
   <input id="Submit"  value="Submit" type="submit">
</form>

web.xml


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

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>                    
        <servlet-class>com.more1.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/more/loginServlet</url-pattern>
    </servlet-mapping>
</web-app>

サーブレット コード


package com.more1;

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

    System.out.println("===========================");
    // System.out.println(request.getParameter("service_number"));
 }
4

2 に答える 2

3

フォーム アクション URL が間違っています。それは文脈にとどまるべきで/myappsあり、外に出てはなりません。404 エラーは、要求された URL が有効なリソースを指していないことを意味します。ブラウザのアドレスバーに表示されているリクエスト URL を注意深く見ていれば、その/myapps部分が消えていることに気付いたはずです。

それに応じて修正します。

<form id="userForm" action="/myapps/more/loginServlet" method="post">

または、現在 (ブラウザのアドレス バーの URL に従って) 既に に座っているので、次のようにします/myapps/more

<form id="userForm" action="loginServlet" method="post">

または、コンテキスト パスの動的性が心配な場合は、HttpServletRequest#getContextPath()次のようにインライン化します。

<form id="userForm" action="${pageContext.request.contextPath}/more/loginServlet" method="post">

別の方法は、HTML<base>タグを導入することです。

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


具体的な問題とは関係ありませんが、サーブレットを学習する際に、適切で最新のチュートリアルを読んでいることは間違いありませんか? あなたのweb.xmlルート宣言は、すでに 10 年以上前の Servlet 2.3 のものです。現在、すでに Servlet 3.0 を使用しています。健全な Hello World の例と健全なチュートリアルへのリンクについては、サーブレットの wiki ページから始めてください。

于 2013-01-21T12:31:25.233 に答える
1

アプリはmyappsコンテキスト パスにデプロイされているようです (HTML ページの URL は です/myapps/more/test.html)。しかし、フォームは に送信され/more/loginServletます。に提出する必要があり/myapp/more/loginServletます。

ページでコンテキスト パスをハードコーディングしないようにするには、JSTL タグを使用します。

<form action="<c:url value='/more/loginServlet'/>" ...>

または明示的にコンテキスト パスを前に追加します。

<form action="${pageContext.request.contextPath}/more/loginServlet" ...>
于 2013-01-21T12:33:34.033 に答える