質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.95%

javax.servlet.ServletException: javax.servlet.jsp.JspException

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,881

前提・実現したいこと

orde byをsqlで二回打っているためか
下記のエラーが出てしまいます。
改善の点を教えていただきたいです。
宜しくお願い致します。

発生している問題・エラーメッセージ

HTTPステータス 500 - javax.servlet.ServletException: javax.servlet.jsp.JspException: 


type 例外レポート

メッセージ javax.servlet.ServletException: javax.servlet.jsp.JspException: 

説明 The server encountered an internal error that prevented it from fulfilling this request.

例外
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: 
  SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
  lend.lend_date,lend.return_date  FROM book  LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
  user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0
  order by book.book_no


      and book.genre_no = ?

        ORDER BY book.book_no asc;


: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ORDER BY book.book_no asc' at line 9
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:548)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:454)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


原因
javax.servlet.ServletException: javax.servlet.jsp.JspException: 
  SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
  lend.lend_date,lend.return_date  FROM book  LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
  user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0
  order by book.book_no


      and book.genre_no = ?

        ORDER BY book.book_no asc;


: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ORDER BY book.book_no asc' at line 9
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:904)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:837)
    org.apache.jsp.book_005flend_jsp._jspService(book_005flend_jsp.java:369)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


原因
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ORDER BY book.book_no asc' at line 9
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    com.mysql.jdbc.Util.getInstance(Util.java:387)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:942)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3966)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902)
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2526)
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549)
    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1962)
    org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.doEndTag(QueryTagSupport.java:257)
    org.apache.jsp.book_005flend_jsp._jspx_meth_sql_005fquery_005f0(book_005flend_jsp.java:447)
    org.apache.jsp.book_005flend_jsp._jspService(book_005flend_jsp.java:137)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.20のログに記録されています


Apache Tomcat/8.0.20

JSP

<%@ page contentType="text/html; charset=UTF-8"
    import="java.sql.*,javax.naming.*,javax.sql.*,java.text.*,java.util.Date,java.util.Calendar"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

<html>

<sql:setDataSource var="db" driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/Library" user="root" password="" />
<sql:query var="rs" dataSource="${db}">
  SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
  lend.lend_date,lend.return_date  FROM book  LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
  user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0
  order by book.book_no

  <c:if test="${!empty param['genreNo']}">
      and book.genre_no = ?
      <sql:param value="${param['genreNo']}" />
        ORDER BY book.book_no asc;
  </c:if>

</sql:query>
<sql:query var="rs1" dataSource="${db}">
    select * from genre
</sql:query>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/Lending.css">
<title>書籍貸出画面</title>
</head>
<body>
    <%
        HttpSession a = request.getSession();
        Boolean userResult = false;

        if (session.getAttribute("userResult") != null) {

            userResult = (boolean) session.getAttribute("userResult");

        } else if (session.getAttribute("userResult") == null) {
            request.setAttribute("errorMessage", "ログインがされていません");

            this.getServletContext().getRequestDispatcher("/Login.jsp")
                    .forward(request, response);
        }
    %>
    <h2>書籍貸出画面</h2>

    <br>
    <form method="POST" action="book_lend.jsp">
        <p>
            ジャンル <select name="genreNo">
                <option value="">全て</option>
                <c:forEach var="row" items="${rs1.rows}">
                    <option value=${row.genre_no}>${row.genre_name}</option>
                </c:forEach>
            </select>
        </p>

        <INPUT style="color: white; background-color: D57200;" type="submit"
            value="絞り込む" />
    </form>
    <br>

    <table border="1">
        <tr>
            <th>ID</th>
            <th>書籍名</th>
            <th>ジャンル</th>
            <th>貸出日</th>
            <th>返却予定日</th>
            <th>状態</th>
            <th>貸出/返却</th>
            <th>貸りた人</th>
        </tr>

        <c:forEach var="row" items="${rs.rows}">
            <tr>
                <td>${row.book_no}</td>
                <td>${row.book_name}</td>
                <td>${row.genre_name}</td>

                <td><c:if test="${empty row.lend_date}">-</c:if>
                    ${row.lend_date }</td>

                <td><c:if test="${empty row.lend_date}">-</c:if>
                    ${row.return_date }</td>
                <td><c:if test="${row.state == 2}">
                        <span class="fontRed">貸出不可</span>
                    </c:if> <c:if test="${row.state == 1 }">
                        <c:if test="${empty row.lend_date}">
            貸出可能
        </c:if>
                        <c:if test="${!empty row.lend_date}">
                            <c:set var="today" value="<%=new Date()%>" />
                            <c:if test="${today > row.return_date}">
                返却遅延
            </c:if>
                            <c:if test="${today <= row.return_date}">
                貸出中
            </c:if>
                        </c:if>
                    </c:if></td>
                <td><c:if test="${empty row.lend_date}">
                        <c:if test="${row.state == 2}">-</c:if>
                        <c:if test="${row.state == 1}">
                            <form method="POST" action="book_lend">
                                <input type="hidden" value="${row.book_no}" name="book_no">
                                <input type="hidden" value="${row.genre_no}" name="genre_no">
                                <INPUT
                                    style="color: white; background-color: D57200; width: 60px; height: 40px;"
                                    type="submit" value="貸出" />
                            </form>
                        </c:if>
                    </c:if> <c:if test="${!empty row.lend_date}">
                        <form method="GET" action="book_lend">
                            <input type="hidden" value=${row.book_no } name="book_no" /> <INPUT
                                style="color: white; background-color: AFD170; width: 60px; height: 40px;"
                                type="submit" value="返却" />
                        </form>
                    </c:if></td>
                <td><c:if test="${!empty row.lend_date}">

                        <option value=${row.user_no}>${row.user_id}</option>
                    </c:if></td>
        </c:forEach>
    </table>
    <br>
    <form action="kanri_mypage.jsp">
        <input style="color: white; background-color: D57200;" type="submit"
            name="mypage" value="TOPページ">

    </form>

</body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

これでいいんじゃないすかね?

<sql:query var="rs" dataSource="${db}">
  SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
  lend.lend_date,lend.return_date  FROM book  LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
  user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0

  <c:if test="${!empty param['genreNo']}">
      and book.genre_no = ?
  </c:if>

  order by book.book_no
</sql:query>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/22 13:00

    ご回答有難う御座います。
    ご回答通りにやってみたのですが変わらずでした。。。

    キャンセル

  • 2016/06/22 14:50

    ifブロックをこの↓ように修正してもだめですか?

    <c:if test="${!empty param['genreNo']}">
    and book.genre_no = ?
    <sql:param value="${param['genreNo']}" />
    </c:if>

    キャンセル

0

where
  book.delete_flg = 0 -- ソート1
order by
  book.book_no 
  and book.genre_no = ? -- 文法がおかしい。これは Where句にあるべきなのでは?
ORDER BY
  book.book_no asc; -- ソート1と同じことをしているため、どちらか不要


おかしいのはここですよね。
これを整形してみると

where
  book.delete_flg = 0 
  and book.genre_no = ? 
order by
  book.book_no 

こうするためには tkturbo さんの回答ということになるのですが、いけませんか?
いけなかったとしても、同じエラーになるとは考えにくいのですが、
エラーログも全く同じなんでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/22 14:17

    回答有難う御座います。
    このようなエラーです

    HTTPステータス 500 - javax.servlet.ServletException: javax.servlet.jsp.JspException:


    type 例外レポート

    メッセージ javax.servlet.ServletException: javax.servlet.jsp.JspException:

    説明 The server encountered an internal error that prevented it from fulfilling this request.

    例外
    org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException:
    SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
    lend.lend_date,lend.return_date FROM book LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
    user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0


    and book.genre_no = ?


    order by book.book_no
    : No value specified for parameter 1
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:584)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:454)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


    原因
    javax.servlet.ServletException: javax.servlet.jsp.JspException:
    SELECT book.book_no,book.book_name,book.state,genre.genre_no,genre.genre_name,user.user_no,user.user_id,
    lend.lend_date,lend.return_date FROM book LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
    user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no where book.delete_flg = 0


    and book.genre_no = ?


    order by book.book_no
    : No value specified for parameter 1
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:904)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:837)
    org.apache.jsp.book_005flend_jsp._jspService(book_005flend_jsp.java:367)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


    原因
    java.sql.SQLException: No value specified for parameter 1
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:963)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2205)
    com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2185)
    com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2115)
    com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1936)
    org.apache.taglibs.standard.tag.common.sql.QueryTagSupport.doEndTag(QueryTagSupport.java:257)
    org.apache.jsp.book_005flend_jsp._jspx_meth_sql_005fquery_005f0(book_005flend_jsp.java:445)
    org.apache.jsp.book_005flend_jsp._jspService(book_005flend_jsp.java:134)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:431)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


    注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.20のログに記録されています


    Apache Tomcat/8.0.20

    キャンセル

  • 2016/06/22 14:39 編集

    横から失礼します。

    「No value specified for parameter 1」と出ているということは、
    このクエリに ? があるのに、そのパラメータが指定されていないからでは?

    多分、SQLクエリーが出来上がっていないのにパラメータを指定してしまっているので、
    無効になっているのだと思います。

    キャンセル

  • 2016/06/22 18:12

    なるほど
    そうだったんですね!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る