2014-11-15 2 views
1

У меня возникла проблема с моим сервлетом, когда он был открыт из моего JSP, который является ShowPurchasingItems.jsp, и он не переходит к следующему JSP.ошибка при сервлет при открытии jsp

вот мой ShowPurchasingItems.jsp http://jsfiddle.net/0g3erumm/

и вот мой сервлет, что привычка открывать мой следующий JSP

package connection; 

import java.io.*; 
import java.sql.*; 
import javax.servlet.http.*; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 

@WebServlet("/CheckOutServlet") 
public class CheckOutServlet extends HttpServlet 
{ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException 
    { 
     HttpSession session = request.getSession(); 
     Connection conn = null; 
     Statement stmt = null; 
     ResultSet rs = null; 

     String User = (String) session.getAttribute("username"); 
     String id = (String) session.getAttribute("stockIdToPurchase"); 
     float price = (float) session.getAttribute("UnitPriceToPurchase"); 
     int stock = (int) session.getAttribute("OnStockToPurchase"); 
     int quantityOrdered = (int) session.getAttribute("purchaseQuantity"); 
     float totalPrice = price * quantityOrdered; 
     int newStock = stock - quantityOrdered; 

     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 

     String url = "jdbc:mysql://localhost:3306/inventory"; 
     String user = "root"; 
     String password = "password"; 
     String query = "INSERT INTO purchases (username,stockId,price,quantityOrdered,totalPrice)  VALUES ('"+User+"', '"+id+"', "+price+", "+quantityOrdered+", "+totalPrice+");"; 

     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      conn = DriverManager.getConnection(url, user, password); 
      stmt = conn.createStatement(); 
      rs = stmt.executeQuery(query); 

      if(rs.next()) 
      { 
      String encodedURL = response.encodeRedirectURL("ShowInventoryList.jsp"); 
      response.sendRedirect(encodedURL);  
      } 
     } 

     catch(Exception e) 
     { 
      out.println("There is an error here"); 
     } 

     finally 
     { 
      out.close(); 
      try 
      { 
       rs.close(); 
       stmt.close(); 
       conn.close(); 
      } 

      catch (Exception e) 
      { 
       out.println("There is no error here"); 
      }  
     }  
    } 
} 

он будет продолжать ловить ошибку на даного out.println ("Eсть ошибка здесь "); и я застрял здесь, я не знаю, что еще не так с моей программой, надеюсь, кто-то может мне помочь.

+0

out.close(); вы закрываете выходной поток. , а затем вы попробуете: out.println ("")? не должен работать – Joeblade

+0

Также не используйте out.println ("") как способ отладки. Вместо этого используйте system.out (или лучше, регистратор). out.print is onyl, предназначенный для отправки данных обратно в браузер – Joeblade

ответ

2

Вы совершаете кардинальный грех, проглатывая исключение и тем самым теряя всю информацию, которая может помочь вам разобраться в вашей проблеме!

Вы должны изменить способ исключения обрабатываются, по крайней мере, вы должны быть демпинг StackTrace:

catch(Exception e) { 
    out.println("There is an error here"); 
    e.printStackTrace(); 
} 

После того как вы StackTrace вы будете в гораздо лучшем положении, когда речь идет о диагностике проблема (или задание более конкретных вопросов)!

Edit - на основе исключения, публикуемую в комментарии:

java.sql.SQLException: Can not issue data manipulation statements with executeQuery() 

выбрасывают, потому что вы выполняете update с использованием метода query. Вы должны изменить свой код на этот:

int updateCount = stmt.executeUpdate(query); 

if(updateCount > 0) { 
    String encodedURL = response.encodeRedirectURL("ShowInventoryList.jsp"); 
    response.sendRedirect(encodedURL);  
} 
+0

по-прежнему та же ошибка – user14

+0

@cyran Lemoncito - Конечно, вы теперь сможете увидеть, что такое ошибка в консоли, как только вы знаете, что такое ошибка , мы сможем помочь вам решить эту проблему. – StuPointerException

+0

вот ошибка, которую я пробовал, используя то, что @multisync говорит, что теперь он отличается от первого http://jsfiddle.net/mzfgz20d/ – user14

1

executeQuery выполняет заданную инструкцию SQL, которая возвращает один объект ResultSet.

Вы делаете INSERT, который ничего не возвращает. Полагаю, именно поэтому вы получаете исключение.

Я бы рекомендовал использовать PreparedStatement, где вы можете связать переменные и предотвратить инъекции SQL + некоторые DB работать быстрее с подготовленными операторами, и executeUpdate вместо executeQuery

PreparedStatement stmt = null; 
... 

String query = "INSERT INTO purchases (username,stockId,price,quantityOrdered,totalPrice) VALUES (?, ?, ?, ?, ?)"; 

stmt = conn.prepareStatement(query); 
stmt.setString(1, username); 
... 

int inserted = stmt.executeUpdate(); 

if (inserted > 0) { 
// there was a successfull insert 
... 

Есть много примеров в Интернете , Например: http://www.mkyong.com/jdbc/how-to-insert-date-value-in-preparedstatement/

+0

попробовал это, но он перейдет к одному и тому же исключению catch, но теперь это другая ошибка ' – user14

+0

@Cyran Lemoncito И что такое исключение? – Multisync

+0

это уже работает сэр! спасибо, я пропустил stmt.executeUpdate(); вот почему это не сработало. Большое спасибо за помощь! :) – user14

Смежные вопросы