1

私はJavaサーブレットを構築しようとしています。教授がクラスに与えた指示に従ってすべてを実行しましたが、奇妙なエラーが発生します。

背景:私はJavaEEHeliosとTomcat7を使用しています。

Eclipseで新しい動的Webプロジェクトを開始し、ユーザーの名前を取得してサーブレットに送信するindex.jspページを作成し、Hello、[username]を出力することになっています。コードはすべて、教授が私たちに提供したサンプルコードであり、私のクラスの他の人々のために機能します。

ServletHomeという新しいサーブレットを作成しました。これはサーブレットというパッケージに含まれています。

Eclipseからプログラムを実行すると、Tomcatが正常に起動します。問題はありません。index.jspページに移動できますが、問題ないようです。

問題は、名前を入力して「送信」ボタンを押すと、「要求されたリソース(/ MyFirstServlet / ServletHome)は利用できません」というメッセージとともにtomcat404エラーが発生することです。

何か案は?

ありがとう!!

---編集:コード---

index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="ServletHome" method="POST">
    First Name: <input type="text" name="firstName" size="20"><br>
    Last Name: <input type="text" name="lastName" size="20"> <br>
    <br> <input type="submit" value="Submit">
</form>
</body>
</html>

ServletHome.java:

package servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ServletHome extends HttpServlet {

private static final long serialVersionUID = 1L;
public ServletHome() {
    super();
}

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

/**
 * The function that gets the name and returns an HTML file with Hello to them
 * @param request
 * @param response
 * @throws ServletException
 * @throws IOException
 */
protected void doPost(HttpServletRequest request,
                                            HttpServletResponse response) 
throws ServletException, IOException {

    //set type of output
    response.setContentType("text/html;charset=UTF-8");

    //get writer
    PrintWriter out = response.getWriter();

    //get first name
    String firstName = request.getParameter("firstName").toString();

    //get last name
    String lastName = request.getParameter("lastName").toString();

    //write the file
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Test Title</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<p>Welcome, " + firstName + " " + lastName + "!</p>");
    out.println("</body>");
    out.println("</html>");

    out.close();
}
}

web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>ServletHome</servlet-name>
            <servlet-class>servlets.ServletHome</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ServletHome</servlet-name>
            <url-pattern>/servlets/*</url-pattern>
        </servlet-mapping>
</web-app> 
4

1 に答える 1

5

次の理由により、リソースを使用できません:

  1. アクション属性が間違っている、または;
  2. サーブレットを正しくマップしていません。これを行うには、次のことができます。

Tomcat 7 を使用しているため、@WebServlet アノテーションを使用します。

@WebServlet( name = "ServletName", urlPatterns = { "/path/to/your/servlet/myName" } )
public class ServletName extends HttpServlet {
    // your code here
}

または、web.xml でサーブレットをマップします。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <!-- more code here... -->
    <servlet>
        <servlet-name>ServletName</servlet-name>
        <servlet-class>yout.package.here.ServletName</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletName</servlet-name>
        <url-pattern>/path/to/your/servlet/myName</url-pattern>
    </servlet-mapping>
    <!-- more code here... -->
</web-app>

注意が必要なもう 1 つの点は、サーブレットで処理する HTTP メソッド (get、post など) に対応する doXXX メソッドを実装する必要があることです。

フォームからこのサーブレットをリクエストするには、action 属性を次のように設定する必要があります。

<form action="/path/to/your/servlet/myName">
    <!-- form fields here... -->
</form>

最後に、フォームの method 属性を使用して、ブラウザがサーブレットのリクエストに使用する HTTP メソッドを選択できます。指定しない場合、デフォルトのメソッドはgetです。既に述べたように、get メソッドを使用する場合は、サーブレットに doGet メソッドを実装する必要があります。

于 2012-07-23T21:01:44.983 に答える