0

ユーザーが入力したSQLコマンドの結果をサーブレットに出力させようとしています。現在、サーブレットは、コマンドに「SELECT」、「INSERT」、または「DELETE」が含まれていないことを正しく検出し、エラーメッセージを出力します。コマンドが有効な場合、何も出力されません。これは、データベースに接続しようとしている場所、または出力を「出力」に出力しようとしている場所のいずれかで問題が発生している可能性があることを意味します。

databaseServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

@SuppressWarnings("serial")
public class databaseServlet extends HttpServlet {
    private Connection conn;
    private Statement statement;

    public void init(ServletConfig config) throws ServletException {
        try {
            Class.forName(config.getInitParameter("databaseDriver"));
            conn = DriverManager.getConnection(
                    config.getInitParameter("databaseName"),
                    config.getInitParameter("username"),
                    config.getInitParameter("password"));
            statement = conn.createStatement();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<xml version = \"1.0\"?>");
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD " +
            "XHTML 1.0 Strict//EN\" \"http://www.w3.org" +
            "/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
        out.println("<html xmlns = \"http://www.w3.org/1999/xhtml\">");
        out.println("<head>");
        out.println("<title>MySQL Servlet</title>");
        out.println("<style type='text/css'>");
        out.println("body{background-color: blue}");
        out.println("</style>");
        out.println("</head>");
        out.println("<body>");

        String query = request.getParameter("query");

        if (query.toLowerCase().contains("select")) {
            //SELECT Queries
            try {
                ResultSet resultSet = statement.executeQuery(query);
                ResultSetMetaData metaData = resultSet.getMetaData();
                int numberOfColumns = metaData.getColumnCount();
                for(int i = 1; i<= numberOfColumns; i++){
                    out.printf("%20s\t", metaData.getColumnName(i));
                }
                out.println();

                while (resultSet.next()){
                    for (int i = 1; i <= numberOfColumns; i++){
                        out.printf("%20s\t", resultSet.getObject(i));
                    }
                    out.println();
                 }
            }
            catch (Exception f) {
                f.printStackTrace();
            }
        }
        else if (query.toLowerCase().contains("delete") || query.toLowerCase().contains("insert")) {
            //DELETE and INSERT commands
            try {
                conn.prepareStatement(query).executeUpdate(query);
                out.println("\t\t Database has been updated!");
            }
            catch (Exception l){
                l.printStackTrace();
            }
        }
        else {
            //Not a valid response
            out.println("\t\t Not a valid command or query!");
        }

        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}

dbServlet.jsp

<?xml version = "1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- dbServlet.html -->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
    <title>MySQL Servlet</title>
    <style type="text/css">
        body{background-color: green;}
    </style>
</head>
<body>
    <h1>Hello World!</h1>
    <h2>This is the MySQL Servlet</h2>
    <form action = "/database/database" method = "get">
    <p>
        <label>Enter your query and click the button to invoke a MySQL Servlet
            <input type = "text" name = "query" />
            <input type = "submit" value = "Run MySQL Servlet" />
        </label>
    </p>
    </form>
</body>
</html>

もう1つの潜在的な障害点は、web.xmlファイルで初期化されたデータベースファイルへのパスである可能性があると考えました。オンラインで見つけた例にはポートが含まれていましたが、ポート番号を削除する必要があるかどうか疑問に思っています。MySQLに使用するデフォルトのポートを知っている人はいますか?

これは、以下のxmlファイルから私が話している特定の行です:jdbc:mysql:// localhost:3309 / project4

web.xml

<web-app 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" version="2.4">
  <!-- General description of the web application -->
  <display-name>
    MySQL Servlet
  </display-name>
  <description>
    This web application allows the user to connect to a database, sumbit queries, and make changes.
  </description>
  <!-- Servlet definitions -->
  <servlet>
    <servlet-name>database</servlet-name>
    <description>
        A servlet that handles SQL commands submitted by the user.
    </description>
    <servlet-class>
        databaseServlet
    </servlet-class>
    <init-param>
        <param-name>databaseDriver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </init-param>
    <init-param>
        <param-name>databaseName</param-name>
        <param-value>jdbc:mysql://localhost:3309/project4</param-value>
    </init-param>
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>pass</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>database</servlet-name>
    <url-pattern>/database</url-pattern>
  </servlet-mapping>
</web-app>
4

1 に答える 1

0

ポート3309を使用していて、ポート3306を使用する必要がありました。

問題

jdbc:mysql://localhost:3309/project4

解決

jdbc:mysql://localhost:3306/project4
于 2012-11-15T22:41:09.240 に答える