确定和老师的代码一样,但是报错
已经排查了一小时了,实在是找不出毛病了,一查询就错,Parameter index out of range (1 > number of parameters, which is 0).我看也没少问号啊
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try {
req.setCharacterEncoding("UTF-8");
String command = req.getParameter("command");
String description = req.getParameter("description");
req.setAttribute("command", command);
req.setAttribute("description", description);
System.out.println(command+description);
Class.forName("com.mysql.jdbc.Driver");
Connection ct = DriverManager.getConnection("jdbc:mysql:///wechat?useUnicode=true&characterEncoding=UTF-8",
"root", "qxqx");
StringBuilder sql = new StringBuilder(
"select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1 ");
PreparedStatement ps = ct.prepareStatement(sql.toString());
List<String> paramList = new ArrayList<String>();
if (command != null && !"".equals(command.trim())) {
sql.append(" and COMMAND='?' ");
paramList.add(command);
}
if (description != null && !"".equals(description.trim())) {
sql.append(" and DESCRIPTION like '%' ? '%' ");
paramList.add(description);
}
for (int i = 0; i < paramList.size(); i++) {
ps.setString(i + 1, paramList.get(i));
}
System.out.println(ps.toString());
ResultSet rs = ps.executeQuery();
List<Message> messageList = new ArrayList<Message>();
while (rs.next()) {
Message message = new Message();
// 容器里加入的都是引用,不是对象本身,所以后续的set方法依然有用
messageList.add(message);
message.setId(rs.getString("ID"));
message.setCommand(rs.getString("COMMAND"));
message.setDescription(rs.getString("DESCRIPTION"));
message.setContent(rs.getString("CONTENT"));
}
req.setAttribute("messageList", messageList);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req,
resp);
}还有一个小问题,为什么doPost()方法用super.doGet(req,resp)会出现405错误,用doPost(req,resp)就可以了
==============================分割线===========================================
第一个问题解决了,把PreparedStatement ps = ct.prepareStatement(sql.toString());放到for循环前一行