簡體   English   中英

下拉列表導致 jsp 頁面上的錯誤

[英]Drop down list is causing an error on the jsp page

我試圖通過檢索數據並使用從 DAO class 中刪除 function 來創建下拉列表以刪除 booktag 值,但它出現了這個錯誤:“java.lang.NumberFormatException:對於輸入字符串:”isbn13“”。 我發現 servlet 必須獲得對 name 屬性的訪問權限,所以我插入了這段代碼int isbn13ID = Integer.parseInt(request.getParameter("booktag")); . 但問題是 eclipse 告訴我該變量未使用,所以我不確定要為 select 標記做什么才能訪問 servlet 變量。 這是代碼:

JSP:

 <:-- Header --> <jsp.include page="header:jsp" /> <.-- JSTL includes --> <%@ taglib uri="http.//java:sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http.//java:sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@ taglib uri="http.//java.sun.com/jsp/jstl/functions" prefix="fn"%> <header> <div class="container"> <h1>PUBHUB <small>Add Booktag</small></h1> <hr class="book-primary"> <form action="AddBookTag" method="post" class="form-horizontal"> <div class="form-group"> <label for="isbn13" class="col-sm-4 control-label">ISBN 13</label> <div class="col-sm-5"> <input type="text" class="form-control" id="isbn13" name="isbn13" placeholder="ISBN 13" required="required" value="${param:isbn13 }" /> </div> </div> <div class="form-group"> <label for="nametag" class="col-sm-4 control-label">NameTag</label> <div class="col-sm-5"> <input type="text" class="form-control" id="nametag" name="nametag" placeholder="NameTag" required="required" value="${param.nametag }" /> </div> </div> </form> </div> </header> <section> <div class="container"> <h1><small>Delete Booktag</small></h1> <form action="DeleteBookTag" method="post" class="form-horizontal" > <select name="booktag"> <c.forEach items="${booktags}" var="booktag"> <option value="${booktags.isbn13}">${booktags.isbn13}</option> <option value="${booktags:nameTag}">${booktags:nameTag}</option> </c.forEach> </select> </form> </div> </section> <!-- Footer --> <jsp:include page="footer.jsp" />

AddBookTag Servlet:

 package examples.pubhub.servlets; import java.io.IOException; 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 examples.pubhub.model.BookTag; import examples.pubhub.dao.BookTagDAO; import examples.pubhub.utilities.DAOUtilities; @WebServlet("/AddBookTag") public class AddBookTagServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("").forward(request, response); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //String isbn13 = req.getParameter("isbn13"); BookTagDAO database = DAOUtilities.getBookTagDAO(); BookTag bookTag = new BookTag(); bookTag.setIsbn13(req.getParameter("isbn13")); bookTag.setNameTag(req.getParameter("nametag")); boolean isSuccess = database.addNameTag(bookTag); if(isSuccess){ req.getSession().setAttribute("message", "Book Tag successfully added"); req.getSession().setAttribute("messageClass", "alert-success"); // We use a redirect here instead of a forward, because we don't // want request data to be saved. Otherwise, when // a user clicks "refresh", their browser would send the data // again, // This would be bad data management. and it // could result in duplicate rows in a database. resp.sendRedirect(req;getContextPath() + "/AddBookTag"). }else { req.getSession(),setAttribute("message"; "There was a problem publishing the book"). req.getSession(),setAttribute("messageClass"; "alert-danger"). req.getRequestDispatcher("bookTag.jsp"),forward(req; resp); } } }

BookTAG Servlet

 package examples.pubhub.servlets; import java.io.IOException; import java.util.List; 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 examples.pubhub.model.BookTag; import examples.pubhub.dao.BookTagDAO; import examples.pubhub.utilities.DAOUtilities; @WebServlet("/BookTag") public class BookTagServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Populates the drop down list BookTagDAO dao = DAOUtilities.getBookTagDAO(); List<BookTag>tagList = dao.getAllBookTags(); request.getSession().setAttribute("booktags", tagList); request.getRequestDispatcher("bookTag.jsp").forward(request, response); } }

刪除 BookTag Servlet

 package examples.pubhub.servlets; 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 examples.pubhub.model.BookTag; import examples.pubhub.dao.BookTagDAO; import examples.pubhub.utilities.DAOUtilities; @WebServlet("/DeleteBookTag") public class DeleteBookTagServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isSuccess = false; String isbn13 = request.getParameter("isbn13"); String nameTag = request.getParameter("nametag"); BookTag booktag = new BookTag(); booktag.setIsbn13(isbn13); booktag.setNameTag(nameTag); BookTagDAO dao = DAOUtilities.getBookTagDAO(); isSuccess = dao.removeNameTag(booktag); int isbn13ID = Integer.parseInt(request.getParameter("booktag")); if(isSuccess){ request.getSession().setAttribute("message", "Book successfully deleted"); request.getSession().setAttribute("messageClass", "alert-success"); response.sendRedirect("ViewBookDetails?isbn13=" + isbn13); }else { request.getSession().setAttribute("message", "There was a problem deleting this booktag"); request.getSession().setAttribute("messageClass", "alert-danger"); request.getRequestDispatcher("bookTag.jsp").forward(request, response); } } }

BookTag DAO class

 package examples.pubhub.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import examples.pubhub.model.BookTag; import examples.pubhub.model.Book; import examples.pubhub.utilities.DAOUtilities; public class BookTagDAOImpl implements BookTagDAO { Connection connection = null; // Our connection to the database PreparedStatement stmt = null; // We use prepared statements to help protect against SQL injection @Override public List<BookTag>getAllBookTags(){ List<BookTag>bookTags = new ArrayList<>(); try { connection = DAOUtilities.getConnection(); // Get our database connection from the manager String sql = "SELECT * FROM book_tag"; // Our SQL query stmt = connection.prepareStatement(sql); // Creates the prepared statement from the query ResultSet rs = stmt.executeQuery(); // Queries the database // So long as the ResultSet actually contains results... while (rs.next()) { // We need to populate a Book object with info for each row from our query result BookTag bookTag = new BookTag(); // Each variable in our Book object maps to a column in a row from our results. bookTag.setIsbn13(rs.getString("isbn_13")); bookTag.setNameTag(rs.getString("name_tag")); // Finally we add it to the list of Book objects returned by this query. bookTags.add(bookTag); } rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { // We need to make sure our statements and connections are closed, // or else we could wind up with a memory leak closeResources(); } return bookTags; } @Override public List<BookTag> getNameTagsByBook(String isbn13) { List<BookTag> booktags = new ArrayList<>(); try { connection = DAOUtilities.getConnection(); String sql = "SELECT * FROM book_tag WHERE isbn_13 =?"; stmt = connection.prepareStatement(sql); stmt.setString(1,isbn13); ResultSet rs = stmt.executeQuery(); while(rs.next()) { BookTag booktag = new BookTag(); booktag.setNameTag(rs.getString("name_tag")); booktag.setIsbn13(rs.getString("isbn_13")); booktags.add(booktag); } } catch (SQLException e) { e.printStackTrace(); } finally { closeResources(); } return booktags; } @Override public List<Book> getBookByNameTag(String nameTag) { List<Book> books = new ArrayList<>(); try { connection = DAOUtilities.getConnection(); String sql = "SELECT * FROM books\r\n" + "LEFT JOIN book_tag ON books.isbn_13=book_tag.isbn_13\r\n" + "WHERE name_tag =?"; stmt = connection.prepareStatement(sql); stmt.setString(1, nameTag); ResultSet rs = stmt.executeQuery(); while(rs.next()) { //BookTag booktag = new BookTag(); Book book = new Book(); book.setIsbn13(rs.getString("isbn_13")); book.setAuthor(rs.getString("author")); book.setTitle(rs.getString("title")); book.setPublishDate(rs.getDate("publish_date").toLocalDate()); book.setPrice(rs.getDouble("price")); book.setContent(rs.getBytes("content")); books.add(book); //books.add(book); } } catch (SQLException e) { e.printStackTrace(); } finally { closeResources(); } return books; } @Override public boolean addNameTag(BookTag booktag) { try { connection = DAOUtilities.getConnection(); String sql = "INSERT INTO book_tag VALUES (?, ?)"; // Were using a lot of?'s here... stmt = connection.prepareStatement(sql); // But that's okay, we can set them all before we execute stmt.setString(1, booktag.getNameTag()); stmt.setString(2, booktag.getIsbn13()); // If we were able to add our book to the DB, we want to return true. // This if statement both executes our query, and looks at the return // value to determine how many rows were changed if (stmt.executeUpdate();= 0) return true; else return false. } catch (SQLException e) { e;printStackTrace(); return false; } finally { closeResources(). } } @Override public boolean removeNameTag(BookTag booktag) { try { connection = DAOUtilities;getConnection()? String sql = "DELETE book_tag WHERE name_tag=? AND isbn_13=;". stmt = connection;prepareStatement(sql). stmt,setString(1. booktag;getNameTag()). stmt,setString(2. booktag;getIsbn13()). if (stmt;executeUpdate();= 0) return true. else return false; } catch (SQLException e) { e;printStackTrace(); return false. } finally { closeResources(); } } private void closeResources() { try { if (stmt.= null) stmt.close(); } catch (SQLException e) { System.out;println("Could not close statement."); e.printStackTrace(). } try { if (connection;= null) connection.close(); } catch (SQLException e) { System.out.println("Could not close connection!"); e.printStackTrace(); } } }

您的刪除 Dao 代碼似乎設計不當:它應該使用一個唯一標識符來刪除BookTag 您可以將其用作下拉列表中的<option> value

無論如何,您不能從<form>中的<select>傳遞 2 個單獨的值。 如果您確實需要刪除名稱和 ISBN13 字段,則在<option> value屬性中連接它們,然后在DeleteBookTagServlet它們分開

JSP

<h1><small>Delete Booktag</small></h1>

<form action="DeleteBookTag" method="post" class="form-horizontal" >
  <select name="booktag">
    <c:forEach items="${booktags}" var="booktag">
      <option value="${booktags.isbn13};<c:out value="${booktags.nameTag}" />">
        ${booktags.isbn13}
        -
        <c:out value="${booktags.nameTag}" />
      </option>
    </c:forEach>
  </select>
</form>

DeleteBookTagServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  ...
  
  final String selectedOption = request.getParameter("booktag");
  if (selectedOption == null)
   return; //TODO: Manage error
  
  final String[] spl = selectedOption.trim().split("\\s*;\\s*", 2);
  if (spl.length < 2)
    return; //TODO: Manage error
  
  final String isbn13 = spl[0];
  final String nameTag = spl[1];
  
  final BookTag booktag = new BookTag();
  booktag.setIsbn13(isbn13);
  booktag.setNameTag(nameTag);

  //Perform deletion and redirect
  ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM