Java內部轉發和數據庫的問題
阿新 • • 發佈:2017-12-12
tid seq 方法 servle ndt pub 有時 servlet 請求重定向
今天幫朋友做課題設計的時候遇到問題,
先看DAO,在DAO裏面沒有對name加上單引號,導致數據庫查詢出錯,由於java會自動拼接為字符串
public AdminDTO selectAdminById(String name){ Connection conn = DbHelper.getConnection(); String sql = "select * from admin where username= "+name; AdminDTO admin = null; try { PreparedStatement pst = conn.prepareStatement(sql); ResultSet rst = pst.executeQuery(); while (rst.next()) { admin = new AdminDTO(); admin.setId(rst.getInt("id")); admin.setUsername(rst.getString("username")); admin.setUserpwd(rst.getString("userpwd")); } rst.close(); pst.close(); } catch (SQLException e) { e.printStackTrace(); }
而在數據庫裏需要有單引號,本來應該是這樣的查詢結果
導致了
拋出sql錯誤,解決方法就是
String sql="select * from admin where username =‘"+name+"‘";
使用該語句來添加單引號解決,但是這還不完美,我們應該定義一個更加完美的方法來執行數據庫的查詢,
public static ResultSet executeQuery(String sql, Object... params) throws SQLException { Connection conn = ds.getConnection(); try { return executeQuery(conn, sql, params); } catch (SQLException ex) { closeQuietly(conn); throw ex; } }
使用該方法來執行查詢
參數params為一個可變長度的參數,可以傳入參數作為數據庫的查詢所需的字段
JDBCUtils.executeQuery("select * from T_cities where Id=? and IsDeleted=0", id);
另外一個就是重定向的問題了
我們要將校驗的servlet的請求重定向到servlet
response.sendRedirect("/ShowServlet");
當然有時候光重定向到主服務器還遠遠不夠,我們需要把響應和請求 都轉發到主服務器
request.getRequestDispatcher("/ShowServlet").forward(request, response);
還有另外一個方式,但是不推薦使用
response.sendRedirect(request.getContextPath()+"/servlet/ServletB");
為了編寫最有效的代碼,你應該了解這兩種重定向技巧的不同。forward方法是在Web container內部工作的。sendRedirect方法需要到客戶端的一個往返。所以forward方法比sendRedirect要快。但是,運用forward方法有局限性,你只能重定向到同一個Web應用程序中的一個資源。而sendRedirect方法可以讓你重定向到任何URL。結論:如果可以解決你的問題,那麽就用forward方法。只有當你不能用forward方法時才運用sendRedirect方法。
forward不會改變當前瀏覽器地址欄中的路徑
Java內部轉發和數據庫的問題