yiqianyan
yiqianyan
采纳率90.9%
2017-03-26 14:12

空指针异常,jsp+servlet+jdbc

5
已采纳

login.jsp:

 <form name="formName" method="post" action="servlet/AdminVerify">
    <tr>
        <td width="18%" height="30">
            <div align="center">用户</div>
        </td>
        <td width="50%" height="30"><input name="name" type="text"></td>
        <!-- 宽度规定,然后rowspan,则该列都合并,其他的行少出现一个td的使用 -->
        <td width="32%" rowspan="4">
            <!-- input里面可以有斜杠,也可无 --> <!-- 注意"image"类型的用法,必须有图片src参数。它相当于一个按钮,
                                                                     所以可以有onClick,且注意return及分号不能少,实际上传递的false值无意义--> <input
            type="image" name="imageField" src="images/dl.gif"
            onClick="return check();">
        </td>
    </tr>
    <tr>
        <td height="30">
            <div align="center">密码</div>
        </td>
        <td height="30"><input name="password" type="password"></td>
    </tr>
    <tr>
        <td height="30">
            <div align="center">权限</div>
        </td>
        <td height="30">
            <!-- 下拉列表,文本内容会显示 --> <select name="st">
                <option value="管理员">管理员</option>
                <option value="客户">客户</option>
        </select>
        </td>
    </tr>
    <!-- table中的空白行和列可以有center,left,right属性的作用 -->
    <tr>
        <!-- 虽未空白行,但是td不能省略 -->
        <td height="30"></td>
        <td height="30"></td>
    </tr>
</form>


web.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>hotel2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>AdminVerify</servlet-name>
    <servlet-class>servlet.AdminVerify</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AdminVerify</servlet-name>
    <url-pattern>/servlet/AdminVerify</url-pattern>
  </servlet-mapping>
</web-app>

AdminVerify.java:

 package servlet;

import java.io.*;
import java.sql.*;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import service.Service;

public class AdminVerify extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();

        String name = request.getParameter("name");
        String password = request.getParameter("password");
        String st = request.getParameter("st");

        Service service=new Service();
        ResultSet rs=service.getResult(name,password,st);
        try {//rs出现的地方都需要try-catch
            if (!rs.next()) {
                out.print("<script>alert('你输入的用户不存在或密码错误,请重新登录!');window.history.go(-1);</script>");
            } else {
                //
                //
                request.getSession().setAttribute("name", request.getParameter("name"));
                if (request.getParameter("st").equals("客户")) {
                    //st一样赋值给session
                    request.getSession().setAttribute("st", "客户");
                } else {
                    //password这里不必要放入session
                    request.getSession().setAttribute("st", rs.getString("user_type"));
                }
                response.sendRedirect(request.getContextPath()+"/main.jsp");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

Service.java:

 package service;

import java.sql.*;
import java.util.*;

import db.DBUtil;

public class Service {
    private Connection conn;
    private Statement stmt;
    private ResultSet rs;
    private String sql;



    public ResultSet getResult(String name, String password, String st) {
        //这一句放到方法外面出现错误
        conn=DBUtil.getConnection();
        if (st.equals("客户")) {
            sql = "select * from customr where customer_name=name and customer_password=password";
        } else {
            sql = "select * from users where user_name=name and user_password=password";
        }
        try {
            // jsp没try不会报错,容易错误
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);

        } catch (Exception e) {
            e.printStackTrace();
        }
        // 
        return rs;
    }
}

java.lang.NullPointerException
at servlet.AdminVerify.doPost(AdminVerify.java:30)
在if(!rs,next())处

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'name' in 'where clause'

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • qq_38080430 ClownsAndTears 4年前

    最好使用占位符,按照我的猜测,你这个sql语法也许有错误。
    比如select * from customr where customer_name=name and customer_password=password;
    也许sql会在你的表里寻找 customer_name、name、customer_password、password这四个字段。
    说到这里可能你就明白了。先说我的解决方法吧。
    1.sql = "select * from customr where customer_name="+name+" and customer_password="+password;
    方法1比较简单,直接拼接就好了。
    2.sql = "select * from customr where customer_name=? and customer_password=?";
    方法2是占位符,需要设置。
    // 这里获取链接
    Connection con = JdbcUtil3.getConnection();
    // 然后编译
    PreparedStatement ps = con.prepareStatement(sql);
    // 填充占位符
    ps.setString(1, name);
    ps.setString(2, password);
    .....
    然后执行方法。

    点赞 评论 复制链接分享
  • u013829202 觅夜的黑 4年前

    sql语句错了,变量要加""拼进去。同意楼上,养成好习惯。用占位符,避免sql注入,select * from customr where customer_name="+name+" and customer_password="+password;

    点赞 评论 复制链接分享
  • zeng520331 沉默的天狼 4年前

    这个摆明就是你自己的sql语句的错误。rs,next() 是空指针,那么说明rs对象是空指针,那么说明你没有获取的结果集。
    再加上报了Unknown column 'name' in 'where clause'的错误。。那就是你的sql语句构造有问题。
    1,可能你没有传进去,
    2,你的列名有误。这个你要自己仔细看写你的表中的列名。。

    解决方案就是:你直接把你构造出来的sql语句放到数据库中去运行(记得加好你的参数值)。看看能不能运行。
    如果能运行。那你就要看看你的java程序是不是正确赋值了。。

    授人以鱼不如授人以渔:以后遇到问题。要一步步的顺藤摸瓜的下去看。一步步的调试下去。看看程序每一步的具体情况是如何。这样你就可以解决问题了。。

    点赞 评论 复制链接分享
  • Jsonyy Jsonyy 4年前

    授人以鱼不如授人以渔,
    at servlet.AdminVerify.doPost(AdminVerify.java:30)
    一般来说,这样报的异常不一定是在这里,但是绝对和他有关系,你就顺着这里捋...
    Unknown column 'name' in 'where clause'
    name这个列民有问题

    点赞 评论 复制链接分享

相关推荐