已经排查了一小时了,实在是找不出毛病了,一查询就错,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循环前一行
查询就出错? 是查询全部的数据出错,还是查询 command 指令出错,如果是 第一个,我没看出什么毛病,如果是第二个,你在 20 、 24 打个断点,我怀疑是 paramList.size() 出了问题 , paramList 数据未添加进去 ! 查询下数据,断点查看下你的 sql 语句是否出现问题! 还有最主要: PreparedStatement ps = ct.prepareStatement(sql.toString()); 你放错了位置,是放在paramList 添加参数后面的!
sql.append(" and COMMAND='?' ");
?问号不要加'' 单引号