Использование сервлета для поиска в базе данных

0

Я пытаюсь использовать сервлет и файл jsp, чтобы позволить пользователю искать в базе данных фильмов, чтобы найти фильм, который они хотят. Я использовал раскрывающуюся таблицу, чтобы пользователи могли выбирать, что искать, а затем я дал им поле ввода для ввода их поискового запроса. Тем не менее, мой сервлет просто продолжает показывать, что я не найден, хотя я знаю, что значение находится внутри базы данных.

advancedsearch.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
    import="java.sql.*"
    import="java.io.*"
    %>

<%@ include file = "constants.jsp" %>

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <title>Movie</title>
        <style>
            .affix {top: 0; width: 100%;}
            .affix + .container-fluid {padding-top: 50px;}
            .nav-wrapper {min-height: 50px;}
            #section1 {padding-top: 50px; min-height: 550px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            #section2 {padding-top: 50px; min-height: 1000px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            #section3 {padding-top: 20px; min-height: 400px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            .add {width:600px;}
        </style>
        <script>
            //Smooth Scrolling
            $.fn.scrollBottom = function() { 
                return $(document).height() - this.scrollTop() - this.height(); 
            };
            window.onscroll = function() {myFunction()};
            $(document).ready(function(){
                $("a").on('click', function(event) {
                    if (this.hash !== "") {
                        event.preventDefault();
                        var hash = this.hash;
                        $('html, body').animate({
                            scrollTop: $(hash).offset().top
                        }, 400, function(){
                            window.location.hash = hash;
                        });
                    }
                });
            });
        </script>
    </head>
    <body>
        <%
        // Show username on page
        %>
        <%@ include file = "header.html" %>
        <div class="nav-wrapper">
            <nav id="site-navigation" class="container-fluid navbar navbar-inverse" data-spy="affix" data-offset-top="160" style="margin:auto;">
                <div class="navbar-header">
                    <a class="navbar-brand" href="#top" style="font-size: 30px;"><b>Movie</b></a>
                </div>
                <ul class="nav navbar-nav">
                    <li><a href = "booking.jsp">Bookings</a>
                    <li><a href = "review.jsp">Reviews</a>
                    <li class="active"><a href="#top">Main Admin Page</a></li>
                    <li><a href="updateanddelete.jsp">Update&sol;Delete</a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                </ul>
            </nav>
        </div>

        <section id="section1" class="container-fluid">
            <legend><h1 style="text-align: center;">Advanced search</h1></legend>

            <form action="SearchMovie" method="post">
                    <div class="form-group">
                        <label for="searchType">Search by: <input type="hidden" class="form-control add" required></label>
                            <select name="searchType">
                                <option value = "title">Title</option>
                                <option value = "genre">Genre</option>
                                <option value = "Actor">Actor</option>
                            </select>
                        <input type = "submit" value = "Search">
                    </div>
                    <div class="form-group">
                    <label for="query">Search term <input type="text" class="form-control add" name="search" placeholder="search" /></label>
                    </div>
                </form>


</body>
</html>

advancedsearch.jsp отображает страницу, которая позволяет пользователям выбирать категорию и вводить свой поисковый запрос.

SearchMovie.java

package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.sql.*;
import java.util.*;

/**
 * Servlet implementation class SearchMovie
 */
@WebServlet("/SearchMovie")
public class SearchMovie extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        response.setContentType("text/html");
        HttpSession session = request.getSession(true);
        List movielist = new ArrayList();

        String searchType = "";
        String search = "";

        searchType = request.getParameter("searchType");
        search = request.getParameter("search");

        String sqlStr = null;

        if(searchType.equals("title")){
            sqlStr = "Select Moviename, genre, duration, cast, release_date, summary, timeslot FROM movie where Moviename like '%" + search + "%'";
        }
        else if(searchType.equals("genre")) {
            sqlStr = "Select Moviename, genre, duration, cast, release_date, summary, timeslot FROM movie where genre like '%" + search + "%'";
        }
        else if(searchType.equals("Actor")) {
            sqlStr = "Select Moviename, genre, duration, cast, release_date, summary, timeslot FROM movie where cast like '%" + search + "%'";
        }else {
            System.out.println("How did you not select from the drop down table?");
        }
        System.out.println(sqlStr);
        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/database?user=root&password=password&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC");

            try{

                Statement statement = conn.createStatement();
                ResultSet rs = statement.executeQuery(sqlStr);


                while (rs.next()) {
                    List movie = new ArrayList();
                    movie.add(rs.getInt(1));
                    movie.add(rs.getString(2));
                    movie.add(rs.getString(3));
                    movie.add(rs.getString(4));
                    movie.add(rs.getString(5));
                    movie.add(rs.getString(6));

                    movielist.add(movie);
                }
            } catch (SQLException s){
                System.out.println("Value could not be found");
            }
            } catch(Exception e){
                e.printStackTrace();
        }
            request.setAttribute("movielist", movielist);
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/searchresult.jsp");
            dispatcher.forward(request, response);
    }

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SearchMovie() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */

}

SearchMovie.java - это сервлет, который должен выполнять операторы sql и отправлять результаты на страницу отображения.

searchresult.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
    import="java.util.*"
    import="java.io.*"
    %>

<%@ include file = "constants.jsp" %>

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <title>Movie</title>
        <style>
            .affix {top: 0; width: 100%;}
            .affix + .container-fluid {padding-top: 50px;}
            .nav-wrapper {min-height: 50px;}
            #section1 {padding-top: 50px; min-height: 550px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            #section2 {padding-top: 50px; min-height: 1000px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            #section3 {padding-top: 20px; min-height: 400px; background-color: #EFEFEF; border-bottom: 1px solid #D6D6D6;}
            .add {width:600px;}
        </style>
        <script>
            //Smooth Scrolling
            $.fn.scrollBottom = function() { 
                return $(document).height() - this.scrollTop() - this.height(); 
            };
            window.onscroll = function() {myFunction()};
            $(document).ready(function(){
                $("a").on('click', function(event) {
                    if (this.hash !== "") {
                        event.preventDefault();
                        var hash = this.hash;
                        $('html, body').animate({
                            scrollTop: $(hash).offset().top
                        }, 400, function(){
                            window.location.hash = hash;
                        });
                    }
                });
            });
        </script>
    </head>
    <body>
        <%
        // Show username on page
        %>
        <%@ include file = "header.html" %>
        <div class="nav-wrapper">
            <nav id="site-navigation" class="container-fluid navbar navbar-inverse" data-spy="affix" data-offset-top="160" style="margin:auto;">
                <div class="navbar-header">
                    <a class="navbar-brand" href="#top" style="font-size: 30px;"><b>Movie</b></a>
                </div>
                <ul class="nav navbar-nav">
                    <li><a href = "booking.jsp">Bookings</a>
                    <li><a href = "review.jsp">Reviews</a>
                    <li class="active"><a href="#top">Main Admin Page</a></li>
                    <li><a href="updateanddelete.jsp">Update&sol;Delete</a></li>
                </ul>
                <ul class="nav navbar-nav navbar-right">
                </ul>
            </nav>
        </div>
        <div class = "section1">
        <table align="center">
        <%
            List movielist = new ArrayList();
            movielist = (ArrayList)request.getAttribute("movielist");
            if(movielist != null && movielist.size() > 0) {

        %>
        <h2 align="center">Result</h2>

        <tr>

            <th>Movie</th>

            <th>Genre</th>

            <th>Duration</th>

            <th>Cast</th>

            <th>Release date</th>

            <th>Summary</th>

            <th>Time slot</th>

        </tr>

        <%

        for(int i=0;i<movielist.size();i++){

        List movie=(List)movielist.get(i);

        %>

        <tr>

        <td><%=movie.get(1) %></td>

        <td><%=movie.get(2) %></td>

        <td><%=movie.get(3) %></td>

        <td><%=movie.get(4) %></td>

        <td><%=movie.get(5) %></td>

        <td><%=movie.get(6) %></td>

        <td><%=movie.get(7) %></td>

        </tr>

        <%

            }

        }else{

        %>
        <tr>

            <td> No records found </td>

        </tr>

        <%}%>

        </table>
        </div>
    </body>

</html>

Наконец, searchresult.jsp отображает данные, полученные из базы данных.

Мне нужна помощь, так как страница результатов не найдена даже тогда, когда запрос находится внутри базы данных.

Изменение: у меня возникла ошибка в моем затмении при ее запуске.

Это ошибка, которую я получаю при поиске фильма, например "мстители".

java.lang.NumberFormatException: For input string: "avengers"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeDouble(MysqlTextValueDecoder.java:228)
    at com.mysql.cj.result.StringConverter.createFromBytes(StringConverter.java:110)
    at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeByteArray(MysqlTextValueDecoder.java:238)
    at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:129)
    at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:233)
    at com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getNonStringValueFromRow(ResultSetImpl.java:628)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:827)
    at servlet.SearchMovie.doPost(SearchMovie.java:59)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
  • 0
    Это слишком много кода. Пожалуйста, используйте отладчик, чтобы сузить его. Начните с сервлета. Входные параметры соответствуют ожиданиям? Пройдите по коду и проверьте, работает ли он так, как задумано.
  • 0
    Я подозреваю, что это как-то связано с movie.add(rs.getString(1)); часть, так как я получаю ошибку. Я добавлю эту ошибку в вопрос. Но я понятия не имею, что делать с этой частью, так как я адаптировал этот код от Google, и я не очень понимаю, что делает часть movie.add.
Теги:
jsp
servlets
model-view-controller

1 ответ

1

Запрос, который вы используете для получения информации для каждого фильма, следующий:

Select Moviename, genre, duration, cast, release_date, summary, timeslot FROM movie where Moviename like '%" + search + "%'"

Когда вы его запускаете, вы пытаетесь сделать следующее с набором результатов:

while (rs.next()) {
List movie = new ArrayList();
movie.add(rs.getInt(1));
movie.add(rs.getString(2));
movie.add(rs.getString(3));
movie.add(rs.getString(4));
movie.add(rs.getString(5));
movie.add(rs.getString(6));

movielist.add(movie);
}

Это приведет к movie.add(rs.getInt(1)); поскольку первым элементом, возвращаемым вашим запросом, будет String, так как вы извлекаете Moviename, следовательно, вы видите NumberFormatException.

Помимо этого, я немного смущен в отношении того, что вы делаете с полученной информацией.

У вас есть список вызовов movie, который я только предположить, хранит String. Вы добавляете в него различные элементы и добавляете это в свою очередь к другому списку, называемому movielist. Насколько я понимаю, это неправильно. У вас должен быть объект с именем Movie со всеми полями, которые вам нужно описать. Результаты вашего результирующего набора затем будут использованы для создания нового объекта Movie который затем будет добавлен в movielist.

Полагаю, вам нужно пересмотреть свой подход здесь.

  • 0
    Спасибо за ответ. Изначально я использовал movie.add(rs.getString(1)); для первой части, но я получил еще одну ошибку, в которой говорилось, что размер индекса слишком велик, поэтому я использовал вместо него getInt() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню