要求:对客户端浏览器用户输入的用户名及密码进行获取与数据库中的用户名数据进行匹配,匹配成功跳转至SuccessServlet,失败跳转至FailServlet
密码正确在控制台打印输出 登录成功,当用户名不存在或者密码错误提示登录失败

涉及方面:tomcat,druid数据库连接池,DBUtils

一、创建druid相关的工具类,对配置文件的读取、连接对象获取、资源关闭做了简单的封装

//创建Druid数据库连接池工具类
public class DruidUtils2 {
    static DataSource  ds;
    static {
        try {
            //1.加载Druid的配置文件指定连接的数据库
            Properties p = new Properties();
           InputStream is=DruidUtils2.class.getClassLoader().getResourceAsStream("druid.properties");
            System.out.println(System.getProperty("user.dir"));
           //p.load(new FileReader("案例-用户登录/src/druid.properties"));
            //创建Druid数据库连接池对象
            p.load(is);
            ds = DruidDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();

       }
    }

    //获取数据库连接对象方法
    public static  Connection getconnection()  {
        Connection connection = null;
        try {
            connection = ds.getConnection();
            return connection;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        }
    }


    public static void shutdown(Connection connection, Statement statement, ResultSet set){
        try {
            if(set!=null){
                set.close();
            }
            if(statement!=null){
                statement.close();
            }
            if(connection!=null){
                connection.close();
            }
        } catch (SQLException throwables) {
            throw new RuntimeException();
        }
    }

}

二、创建DBUtils工具类,因为只需要查询用户名,所以只封装单个查询方法

//DBUtils对JDBC中一些增删改查进行了封装处理
public class DBUtils {
    //创建QueryRunner对象
    static QueryRunner qr = new QueryRunner();
    public static <T> T check(String sql,Class<T> clazz, Object... params) {
        T result = null;
        Connection connection = null;
        try {
            connection=DruidUtils2.getconnection();
            //执行sql语句 匹配数据库中有无该用户名,返回查询结果对象
            T query = qr.query(connection, sql, new BeanHandler<>(clazz), params);
            result = query;
        } catch (SQLException throwables) {
            throw new RuntimeException();
        } finally {
            //关闭资源
            DruidUtils2.shutdown(connection, null, null);
        }
        return result;
    }
}

三、tomcat上的实现登录servlet的功能代码实现

@WebServlet("/logindem0")
public class loginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//创建两个转发器对象
        RequestDispatcher requestfail = req.getRequestDispatcher("/fail");
        RequestDispatcher requestsuccess = req.getRequestDispatcher("/success");
        //设置流的字符集
        req.setCharacterEncoding("utf-8");
        //获取用户输入的用户名与密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //编写查询sql语句 只需查询用户是否存在
        String sql="select * from user where username=?";
        //进行查询,返回查询结果对象
        user result = DBUtils.check(sql, user.class, username);
        //若用户名不存在登录失败
        if(result==null){
        //跳转至FailServlet
            requestfail.forward(req,resp);
        }
        //用户名存在密码正确即可登录
        else if(result.getPassword().equals(password)){
        //跳转至SuccessServlet
            requestsuccess.forward(req,resp);
        }
        //密码错误
        else {
        //跳转至FailServlet
            requestfail.forward(req,resp);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}

四、部署过程中遇到的问题

1. 部署完毕运行过程中出现NoClassDefFoundError错误

原因分析:在对项目进行编辑的时候将需要各个jar包只是添加到了src目录自建的libs文件夹中,导致web项目运行时tomcat无法依赖于这些jar包(tomcat的lib和用户webapp的lib有隔离)
在这里插入图片描述

解决方案:
将这些依赖的jar包添加至WEB-INF的新建lib文件中即可解决该问题,用于存放在此web项目中tomcat可依赖的jar包
在这里插入图片描述

2. 上述问题解决只会出现了另外一个问题NoClassDefFoundError: Could not initialize class Utils.DruidUtils2 无法初始化DruidUtils2工具类

在这里插入图片描述

原因分析:一开始也不知道是哪里的错误,到处搜索发现可能是由于静态代码块中的问题,最后再找发现同样问题的人原因是,静态代码块中执行出现异常时,直接将异常抛出就会导致该异常情况的发生
在这里插入图片描述
解决方式:修改出现异常执行的代码即可解决
在这里插入图片描述

3.上述问题解决完毕重新运行仍然报错java.lang.NullPointerException,出现空指针异常

在这里插入图片描述

原因分析:在IDEA控制台中输出了一条异常原因语句,找不到配置文件的路径。可是在刚创建完毕DruidUtils2类时 我特地去测试过是否正常 当时测试是正常的。出现此问题后我再去测试发现是正常的
在这里插入图片描述
在这里插入图片描述
后又经过长时间的询问和查找发现还是tomcat运行的问题,在运行web项目时,项目的根路径tomcat的bin路径中,而该路径中并没有 案例-用户登录\src的文件所以加载配置文件失败导致空指针异常

在这里插入图片描述
在这里插入图片描述
在测试类运行过程中,运行项目的根路径是工程路径 该路径下是存在 案例-用户登录\src路径的所以可以正常运行
在这里插入图片描述
在这里插入图片描述

解决方式:1.直接使用以下方式从src(即该tomcat运行的classes文件)路径中读取配置文件

 InputStream is=DruidUtils2.class.getClassLoader().getResourceAsStream("druid.properties");

从项目的文件夹中也能看出该配置文件的位置在classes(即src)路径下,所以此类加载方式可以成功加载
在这里插入图片描述
2.在tomcat的bin文件目录下添加案例-用户登录\src完整路径(不推荐)
在这里插入图片描述

所幸以上问题解决完毕后可以正常运行了

在这里插入图片描述

本次小测试部署最大的问题:就是没有深入了解web项目运行时tomcat对于各个jar包的依赖和配置文件的读取的正确方式
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐