【问题标题】:Connection between servlet and HTML form doesn't workservlet 和 HTML 表单之间的连接不起作用
【发布时间】:2019-08-29 21:19:17
【问题描述】:

我在 HTML 页面和 Java 中的 servlet 之间的连接中遇到了问题。几天前我已经遇到了这个问题,但这是我在项目管理中的错误。 现在,在我看来,我已经做好了一切,但我无法处理它。 特别是,我正在创建一个 HTML 页面,其中包含一个带有调用 servlet 的操作的表单。当我创建一个新的动态 Web 项目时,我的 HTML 页面位于 Eclipse 自动创建的“Web 内容”目录中。

我的 WebServlet 注释是“@WebServlet(/UploadBook)”,表单标签上的操作是“action=UploadBook”。

当我点击页面的提交按钮时,这是我收到的消息:

未找到 在此服务器上找不到请求的 URL /coltraneShop/Administrator/adminColtraneShop/WebContent/UploadBook。

我在 MacOS 上使用 Firefox,并且 apache webServer 已启动。此外,我在 Eclipse 的服务器 tomcat 9 上添加了 Dynamic web 项目,并且没有问题地启动它。

这是我的 servlet Java 代码:

package insertion;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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("/UploadBook")
public class UploadBook extends HttpServlet {
    private static final long serialVersionUID = 1L;


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out= response.getWriter();
    Long productCode= (long) 0;

    //Fetch data from HTML form method POST
    String title= request.getParameter("Title");
    String quantity= request.getParameter("Quantity");
    String yearOfPublication= request.getParameter("yearOfPublication");

    String genre= request.getParameter("Genre");
    String numPages= request.getParameter("numPages");
    String ISBN= request.getParameter("ISBN");
    String publisher= request.getParameter("publisher");

    String writerName1= request.getParameter("writerName1");
    String writerSurname1= request.getParameter("writerSurname1");
    String writerDateOfBirth1= request.getParameter("writerDateOfBirth1");
    String writerGender1= request.getParameter("writerGender1");

    Connection connection= null;

    //Connect to DB
    try {
        connection= connectDB();
    } 
    catch (ClassNotFoundException | SQLException ConnectionException) {
        System.out.println("Error in connection!");
        out.print("Connection to DB is not avaiable. " + ConnectionException.getMessage());
    }

    //Send query to DB
    try {   
        //Preparing statement and query to DB
        PreparedStatement statementProduct = connection.prepareStatement("INSERT INTO coltraneShop.Product (Category, `Title`, Quantity, `Year of publication`)"
                + "VALUES ('Book', ?, ?, ?);", Statement.RETURN_GENERATED_KEYS);

        //Passing parameters
        statementProduct.setString(1, title);
        statementProduct.setInt(2, Integer.parseInt(quantity));
        statementProduct.setInt(3, Integer.parseInt(yearOfPublication));

        int affectedRows= statementProduct.executeUpdate();
        if(affectedRows == 0)
            throw new SQLException("Creating product failed, no rows affected.");

        //Return ID of product insert in DB
        ResultSet resultSet = statementProduct.getGeneratedKeys();
        if(resultSet.next())
            productCode= resultSet.getLong(1);  

        statementProduct.close();
        out.print("<p>Added a product</p><br>");

        PreparedStatement statementBook = connection.prepareStatement("INSERT INTO coltraneShop.Book VALUES (?, ?, ?, ?, ?);");
        statementBook.setString(1, genre);
        statementBook.setInt(2, Integer.parseInt(numPages));
        statementBook.setLong(3, Long.parseLong(ISBN));
        statementBook.setString(4, publisher);
        statementBook.setLong(5, productCode);

        int affectedRowsBook= statementBook.executeUpdate();
        if(affectedRowsBook == 0)
            throw new SQLException("Creating book failed, no rows affected.");

        statementBook.close();
        out.print("<p>Added a book</p><br>");


        PreparedStatement statementWriter1 = connection.prepareStatement("INSERT INTO coltraneShop. VALUES (?, ?, ?, ?);");
        statementWriter1.setString(1, writerName1);
        statementWriter1.setString(2, writerSurname1);
        statementWriter1.setString(3, writerDateOfBirth1);
        statementWriter1.setString(4, writerGender1);

        int affectedRowswriter1= statementWriter1.executeUpdate();
        if(affectedRowswriter1 == 0)
            throw new SQLException("Creating writer failed, no rows affected.");

        statementWriter1.close();
        out.print("<p>Added a writer</p><br>");

        int elementInRequest= request.getContentLength();
        if(elementInRequest > 10) {

            int numAdditionalWriter= (elementInRequest - 10) / 4;

            for(int i=0; i<(numAdditionalWriter); i++) {
                PreparedStatement statementAdditionalWriter= connection.prepareStatement("INSERT INTO coltraneShop. VALUES (?, ?, ?, ?);");
                statementAdditionalWriter.setString(1, ("writerName" + (i+2)));
                statementAdditionalWriter.setString(2, ("writerSurname" + (i+2)));
                statementAdditionalWriter.setString(3, "writerDateOfBirth" + (i+2));
                statementAdditionalWriter.setString(4, "writerGender" + (i+2));

                int affectedRowsAdditionalWriter= statementAdditionalWriter.executeUpdate();
                if(affectedRowsAdditionalWriter == 0)
                    throw new SQLException("Creating addtional writer failed, no rows affected.");

                statementAdditionalWriter.close();
                out.print("<p>Added a writer</p><br>");
            }
        }

    } 
    catch (SQLException exceptionInQuery) {
        System.out.println("Error in the query");
        out.print("Error in statement or process of sending queries to the database. " + exceptionInQuery.getMessage());
    }

    try {
        connection.close();
    } 
    catch (SQLException closeConnectionException) {
        System.out.println("Problem in closing connection");
        out.print("Problem in closing connection. " + closeConnectionException.getMessage());
    }

    out.close();
}

private Connection connectDB() throws ClassNotFoundException, SQLException {
        Connection connection= null;
        Class.forName("com.mysql.cj.jdbc.Driver");
        connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/coltraneShop?useTimezone=true&serverTimezone=UTC", "root", "");
        return connection;
}

}

这是我的 HTML 表单代码:

<head>
    <title>Insert book in the database</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta charset="UTF-8">
    <!--Bootstrap CSS-->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    <script src="administrator.js"></script>
</head>

<body>
    <form action="UploadBook" method="POST">
        <div class="container">

            <div class="form-group">
                <label> <strong>Title:</strong> </label>
                <input type="text" name="Title" class="form-control" placeholder="Title of book" maxlength="50" required>
            </div>

            <div class="form-group">
                <label> <strong>Quantity:</strong> </label>
                <input type="text" class="form-control" name="Quantity" placeholder="Max quantity in stock can be 999" maxlength="3" pattern="[0-9]{1,3}" onkeydown="return isNumberKey(event)" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Year of publication:</strong> </label>
                <input type="text" class="form-control" name="yearOfPublication" placeholder="Year of publication" maxlength="4" pattern="[0-9]{1,4}" onkeydown="return isNumberKey(event)" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Genre:</strong> </label>
                <select class="form-control" name= "Genre" required>
                    <option value="History" >History</option>
                    <option value="Fantasy">Fantasy</option>
                    <option value="Child">Child</option>
                    <option value="Art">Art</option>
                    <option value="Music">Music</option>
                    <option value="Thriller">Thriller</option>
                    <option value="Travel">Travel</option>
                    <option value="Biography">Biography</option>
                    <option value="Poetry">Poetry</option>
                    <option value="Romance">Romance</option>
                    <option value="Science">Science</option>
                </select>
            </div>

            <div class="form-group">
                <label> <strong>Number of pages:</strong> </label>
                <input type="text" class="form-control" name="numPages" placeholder="Max length: 99.999 pages" maxlength="5" pattern="[0-9]{1,5}" onkeydown="return isNumberKey(event)" required></input>
            </div>

            <div class="form-group">
                <label> <strong>ISBN:</strong> </label>
                <input type="text" class="form-control" name="ISBN" placeholder="13-digit code" maxlength="13" pattern="[0-9]{1,13}" onkeydown="return isNumberKey(event)" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Publisher:</strong> </label>
                <input type="text" class="form-control" name="publisher" placeholder="The name of the publishing house" maxlength="30" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Writer's name:</strong> </label>
                <input type="text" class="form-control" name="writerName1" placeholder="The name of the Writer" maxlength="20" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Writer's surname:</strong> </label>
                <input type="text" class="form-control" name="writerSurname1" placeholder="The surname of the Writer" maxlength="20" pattern="[A-z]{1,20}" required></input>
            </div>

            <div class="form-group">
                <label> <strong>Writer's date of birth:</strong> </label>
                <input type="date" class="form-control" name="writerDateOfBirth1"></input>
            </div>

            <div class="form-group">
                <label> <strong>Writer's gender:</strong> </label>
                <input type="text" class="form-control" name="writerGender1" placeholder="Gender of writer: can be 'M' or 'F' or 'N(on defined)'" maxlength="1" pattern="^(M|F|N)" ></input>
            </div>

            <div class="form-group" id="containerWriters">
                <button type="button" class="btn btn-outline-success" id="addWriterButton" onclick="addWriter()"> Add Writer </button>
                <button type="button" class="btn btn-outline-danger" id="removeWriterButton" onclick="removeWriter()"> Remove Writer </button>
            </div>

            <!--Submit all data -->
            <input type="submit" class="btn btn-primary btn-lg btn-block" value="Insert" id="submit"></input>

        </div> <!--Container div-->
    </form>

    <!-- Bootstrap jQuery, Ajax and JavaScript-->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
</body>

非常感谢你帮助我。

【问题讨论】:

    标签: java html servlets


    【解决方案1】:

    看起来您直接从文件系统加载文件并尝试调用此 servlet。这是不正确的。通过您的 Tomcat 加载此 HTML,即通过像

    这样的 URL

    http://localhost:8080/.../xxx.html.

    如果由于某种原因您仍想在没有 Tomcat 的情况下使用静态 HTML,则将 HTML 中的 servlet URL 更改为完整的 URL,如下所示:

    &lt;form action="http://localhost:8080/.../UploadBook" method="POST"&gt;

    如果这不是您的情况,请提供更多信息,您是如何在浏览器中加载 HTML 的。

    【讨论】:

    • 好吧,如果我这样做,工作!但我试图不按照你的建议做,因为如果我在项目中更改路径的结构,它仍然无法正常工作。事实上,我总是看到它完成了,因为我试图自己做。但是,如果您向我解释为什么您的方法更好,我将很乐意学习。非常感谢。
    • 我建议您了解 Web 应用程序的工作原理。简而言之:您将代码(servlet、静态 HTML、JSP、JavaScript、图像、CSS 的 .class 文件)打包到 WAR 中并将其部署在某个服务器上。您的用户将无法访问您的磁盘。它们将通过您的应用程序服务器加载 HTML,例如 https://your.server.com/yourapp/.../xxx.html。这就是为什么以稍后将在普通服务器上使用的相同模式对其进行测试的原因。
    猜你喜欢
    • 2022-01-13
    • 2012-08-02
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多