今天帮朋友做课题设计的时候遇到问题,
先看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(Connection conn, String sql, Object... parameters) throws SQLException { PreparedStatement ps = null; try { ResultSet rs = null; ps = conn.prepareStatement(sql); for (int i = 0; i < parameters.length; i++) { ps.setObject(i + 1, parameters[i]); } rs = ps.executeQuery(); return rs; } catch (SQLException ex) { close(ps); 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方法来提交