Java Web ——实现登录注册(Servlet+Jdbc)

Web三层架构

  • Web层——转发jsp页面,封装数据传给Service层处理
  • Service层——接受Web层传来的数据,处理业务逻辑
  • Dao层——实现对数据库的操作,提供接口给Service层调用
    三层架构有利于更好的解耦,不同层各司其职。

开发顺序

这里我是置底向上的开发。
目录结构

cn.login.dao.impl
cn.login.dao
cn.login.exception
cn.login.impl
cn.login.service
cn.login.utils
cn.login.web

jdbc工具类

封装了常用的操作jdbc的方法,以便dao层来调用.

使用了java中的.properties文件来设置配置信息

public class JdbcUtils{
    private static String url ;
    private static String dirver ;
    private static String user ;
    private static String password ;

    static{//在类第一次加载时,会执行块中的代码
        Properties properties =new Properties();
    try(InputStream in = new FileInputStream((String.valueOf(JdbcUtils.class.getResource("db.properties").getPath()))))  //自动关闭资源,非常重要
    {    //加载配置文件
            properties.load(in);
        }
    catch (IOException e) {
            e.printStackTrace();
        }
    //获取配置文件的信息
    url = properties.getProperty("URL");
    dirver = properties.getProperty("DRIVER");
    user = properties.getProperty("USER");
    password = properties.getProperty("PASSWORD");

        try {
            Class.forName(dirver);//加载驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //静态方法就不需要创建实例来调用了
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet != null)
            try{
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        if(statement != null)
            try{
                statement.close();
            }catch (SQLException e) {
                e.printStackTrace();
        }
        if(connection != null)
            try{
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    }
    
        }


开发Dao层

public class UserDao {
    public Boolean find(User user) throws SQLException {
        Connection connection = JdbcUtils.getConnection();
        String sql = "select * from user where email = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1, user.getEmail());
        ResultSet set = statement.executeQuery();
        Boolean flag = isSetNull(set);
        JdbcUtils.release(connection, statement, set);
        return flag;
    }
    public Boolean add(User user) throws SQLException {
        Connection connection = JdbcUtils.getConnection();
        String sql = "insert into user(email,password)values(?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,user.getEmail());
        statement.setString(2,user.getPassword()) ;
        statement.execute();
        JdbcUtils.release(connection,statement);
        return true;
    }
    public Boolean login(User user) throws SQLException {
        String password = user.getPassword();
        String email = user.getEmail();
        String sql = "select * from user where email = ? and password = ?";
        Connection connection = JdbcUtils.getConnection();
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,email);
        statement.setString(2,password);
        ResultSet set = statement.executeQuery();
        Boolean flag = isSetNull(set);
        JdbcUtils.release(connection,statement,set);
        return flag;
    }
    public Boolean isSetNull(ResultSet set) throws SQLException {
        if(set.next()){//如果存在
            return true;
        }
        else{
            return false;
        }
    }
}

开发service层

这里自定义了两个异常类UserExist UserNull,并且将异常抛给了Web层来处理。


public class LoginBussiness {
    public Boolean loginUser(User user) throws SQLException, UserExist, UserNull {
        UserDao dao = new UserDao();

        if(user.getEmail() == "" || user.getPassword() == ""){
            throw new UserNull("邮箱或密码不能为空");
        }
        else if(dao.login(user))
            return true;
        else
            return false;
    }
    public Boolean regiserUser(User user) throws SQLException, UserExist, UserNull {
        UserDao dao = new UserDao();

        if(user.getEmail() == "" || user.getPassword() == ""){
            throw new UserNull("邮箱或密码不能为空");
        }
        else if(dao.find(user)){
            throw new UserExist("用户已经存在");
        }
        else
            return dao.add(user);
        }
    }

开发Web层

public class register extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset = utf8");
        String email = request.getParameter("email");
        String password = request.getParameter("password");
        User user = new User();
        user.setPassword(password);
        user.setEmail(email);
        LoginBussiness service = new LoginBussiness();
        try {
            if(service.regiserUser(user))
                response.getOutputStream().write("注册成功!".getBytes("utf8"));
            else
                response.getOutputStream().write("注册失败".getBytes("utf8"));
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (UserExist userExist) {
            response.getOutputStream().write(userExist.getMessage().getBytes("utf8"));
        } catch (UserNull userNull) {
            response.getOutputStream().write(userNull.getMessage().getBytes("utf8"));
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("register.jsp").forward(request,response);
    }
}

public class login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset = utf8");
        String email = request.getParameter("email");
        System.out.println(request.getParameter("password"));
        String password = request.getParameter("password");
        User user = new User();
        user.setEmail(email);
        user.setPassword(password);
        LoginBussiness service = new LoginBussiness();
        try {
            if(service.loginUser(user))
            {
                response.getOutputStream().write("登录成功".getBytes("utf8"));
            }
            else
                response.getOutputStream().write("账号或密码错误".getBytes("utf8"));

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (UserExist userExist) {
            response.getOutputStream().write(userExist.getMessage().getBytes("utf8"));
        } catch (UserNull userNull) {
            response.getOutputStream().write(userNull.getMessage().getBytes("utf8"));
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }
}

最后效果

在这里插入图片描述

在这里插入图片描述
提交的表单存在空字段时
在这里插入图片描述
注册的用户已存在时
在这里插入图片描述

心得

这个小demo本身很简单,但是自己把它写出来还是遇见了不少的坑,其次是加深了我对Java Web中的三层架构的理解。开始的时候不是很理解为什么要这么写,感觉很麻烦,后面渐渐感受到了这种写法的奇妙所在。每一层各司其职,互不干扰,这种设计的模式很值得我们去思考,这种解耦非常有利于后期对一个项目的更改与维护。

猜你喜欢

转载自blog.csdn.net/qq_41374768/article/details/88675687