根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层
作者:mmseoamin日期:2023-12-14

一、代码的分层

1、概述

        一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,跟回家有利于后期的维护和升级。从另一个角度来看,好的代码分层架构,应该使可以很好的匹配上单一职责原则的。这样就可以降低层与层之间的依赖,还能最大承兑的复用各层的逻辑。

2、分层的好处

  • 高内聚:分层的设计可以简化系统设计,让不同的层专注做某一模块的事
  • 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节
  • 复用:分层之后可以做到很高的复用
  • 扩展性:分层架构可以让我们更容易做横向扩展

     如果系统没有分层,当业务规模增加或流量增大时我们只能针对整体系统来做扩展。分层之后可以很方便的把一些模块抽离出来,独立成一个系统。

    3、建包

    我们需要建三个包,分别是:bean、dao、util

            dao层(数据访问层)这里与数据库进行数据的访问,service则是业务逻辑层,与数据访问层进行数据的交互,而controller则是控制层对前端的请求进行处理和响应。

           bean包(实体类)里面都是实体类,更加方便的对数据进行操作。

            uitl包(工具包)则是对经常用到的方法 进行封装。

    二、首页的编写

    在web项目下建一个index.jsp项目,用来编写首页

    index.jsp位置所如下图所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第1张

     

    我在首页设置两个超链接实现页面跳转,分别指向登录页面和注册页面。

    如图下所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第2张

     实现代码如下:

    
      
        Java Web
      
      
        

    去登录

    去注册

    三、前端登录页面的编写

    在登录页面中我们需要用到JDBC连接数据库进行数据查询操作(判断用户输入的账号密码是否正确)

    首先我们在web项目下建一个Login.jsp项目,用来编写登录页面。

    Login.jsp位置如下图所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第3张

     登录页面的展示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第4张

     实现登录页面代码如下:

    
    
        登录
    
    
    
        
            登录
        
        
        没有账号?去注册

    四、前端注册页面的编写

    在注册页面中我们需要用到JDBC连接数据库进行数据的添加操作(通过servlet获取浏览器发出请求中的数据添加到数据库中)

    在实现添加数据之前我们先在web项目下建一个Enroll.jsp项目

    Enroll.jsp位置如下图所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第5张

     注册页面的展示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第6张

     实现注册页面的代码如下:

    
    
        注册账号
    
    
    
        
            注册
        
        
        已有账号?去注册

    五、登录成功首页的编写

    首先我们在web项目下建一个ShouYe.jsp

    ShouYe.jsp位置如图下所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第7张

     

    登录成功首页的展示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第8张

    实现代码如下:

    
    
      
      首页
      
    
    
      根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第9张
      

    简介 在钱塘开茶铺的赵盼儿惊闻未婚夫、新科谈话欧阳旭要另娶当朝高官之女,不甘命运的她誓要上京讨个公道。在途中她遇到了出自 权门但生性正直的皇城司指挥顾千帆,并卷入江南一场大案,两人不打不相识从而结缘。赵盼儿凭借智慧解救了被骗婚而惨遭虐待的“江南第一琵琶高手”宋印章与被苛刻 家人逼得离家出走的豪爽厨娘孙三娘,三位姐妹从此结伴而行,终抵东京见识世间繁华。为了不被另攀高枝的欧阳旭从京城赶走,赵盼儿与宋引章、孙三娘一起历尽艰辛,将小小茶坊一步步发展最大的酒楼,揭露了 负心人的真面目,收获了各自的真挚感情和人生感悟,也为无数平凡女子推开了一扇平等救赎之门。

    六、异常页面的编写

    我们在web项目下建一个Error.jsp

    Error.jsp位置如图下所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第10张

     出错页面的展示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第11张

    实现出错页面的代码如下:

    
    
        404
    
    
    

    出错了

    返回登录界面

    七、web.xml配置Servlet类

        
        
            
            login
            
            com.hp.Servlet.Login
        
        
        
            login
            /login
        

    八、在bean包下建立一个user实体类

    建立user实体类的位置:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第12张

     user实体类中的代码如下:

    public class User {
        private Integer uid;
        private String username;
        private String password;
        private String phone;
        private String address;
        public Integer getUid() {
            return uid;
        }
        public void setUid(Integer uid) {
            this.uid = uid;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "User{" +
                    "uid=" + uid +
                    ", username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    ", phone='" + phone + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    

    九、在Util包下实现JDBC连接方法

    在Util包下建一个JDBCUtil类

    JDBCUtil类位置如下:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第13张

     JDBCUtil类中实现 获取连接 和 关闭资源 的代码如下:

    public class JDBCUtil {
        private static String driver = "com.mysql.cj.jdbc.Driver";
        private static String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
        private static String user = "root";
        private static String pwd = "123456";
        private static Connection con = null;
        //测试
        public static void main(String[] args) {
            System.out.println(getCon());
        }
        //获取数据库连接方法
        public static Connection getCon(){
            try {
                //加载驱动
                Class.forName(driver);
                //获取连接
                con = DriverManager.getConnection(url, user, pwd);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //返回连接
            return con;
        }
        //关闭资源方法
        public static void loginClose(ResultSet rs, PreparedStatement pstm, Connection con){
            try {
                if (rs!=null){
                    rs.close();
                }
                if (pstm!=null){
                    pstm.close();
                }
                if (con!=null){
                    con.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    十、实现数据库的操作

    首先我们在dao包下建一个UserDao接口类,用来实现登录和注册功能。

    UserDao接口类位置如下:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第14张

     UserDao接口类中的代码如下:

    public interface UserDao {
        //登录方法
        public User login(String username, String password);
        //注册方法
        public int enroll(User user);
    }
    

    然后我们在dao包先再建一个DaoImpl包,再impl包内建一个UserDaoImpl类,用来实现数据库的操作。

    UserDaoImpl类位置如下:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第15张

     UserDaoImpl类中的代码如下:

    /**
     * 数据库数据类
     */
    public class UserDaoImpl implements UserDao {
        //数据库连接对象
        Connection con = null;//连接对象
        //预处理对象
        PreparedStatement pstm = null;//与处理对象
        //结果集对象
        ResultSet rs = null;//结果集对象
        int row ;//受影响的行数
        //实例化对象
        User register = null;
        //数据库登录操作
        public User login (String username,String password){
            User login = null;
            //下面的代码完成的事情: 需要用户名和密码  返回一个user对象
            try {
                //调用util包下的jdbc连接方法
                con = JDBCUtil.getCon();
                //编写SQL语句
                String sql = "select * from t_user where username = ? and password = ?";
                //预处理SQL语句对象
                pstm = con.prepareStatement(sql);
                //传参
                pstm.setObject(1,username);
                pstm.setObject(2,password);
                //获取结果集对象 ,获取结果
                rs = pstm.executeQuery();
                if (rs.next()){
                    //实例化对象
                    login = new User();
                    //获取结果及对象 把数据传入User对象中
                    login.setUsername(rs.getString("username"));
                    login.setPassword(rs.getString("password"));
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                //调用关闭资源方法
                JDBCUtil.loginClose(rs,pstm,con);
            }
            //返回User结果
            return login;
        }
        //数据库注册操作
        @Override
        public int enroll(User register) {
            //下面的代码完成的事情: 获取用户输入的数据添加到数据库中
            try {
                //调用util包下的jdbc连接方法
                con = JDBCUtil.getCon();
                //编写SQL语句
                String sql = "insert into t_user(username,password,phone,address) values(?,?,?,?);";
                //预处理SQL语句对象
                pstm = con.prepareStatement(sql);
                //传参
                pstm.setObject(1,register.getUsername());
                pstm.setObject(2,register.getPassword());
                pstm.setObject(3,register.getPhone());
                pstm.setObject(4,register.getAddress());
                //获取结果集对象 ,获取结果
                row = pstm.executeUpdate();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                //调用关闭资源的方法
                JDBCUtil.loginClose(null,pstm,con);
            }
            //返回受影响的行数
            return row;
        }
    }
    

    十一、登录的业务处理

    在Servlet包下建一个Login类用来处理登录业务

    Login类位置如图下所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第16张

     

    Login类内的代码如下:

    /**
     * 登录类
     */
    public class Login extends HttpServlet {
        //数据库连接对象
        Connection con = null;
        //预处理对象
        PreparedStatement pstm = null;
        //结果集对象
        ResultSet rs = null;
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Login...get");
            doPost(request, response);
        }
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Login...post");
            //1.从请求中获取用户提交的参数(数据)
            request.setCharacterEncoding("UTF-8");//设置请求的编码格式为中文
            String user = request.getParameter("user");//根据表单的name属性获取用户输入的值
            String pwd = request.getParameter("pwd");//根据表单的name属性获取用户输入的值
            System.out.println(user);
            System.out.println(pwd);
            //2.业务处理
            //调用数据库类
            UserDaoImpl userDao =new UserDaoImpl();
            //传参
            User user1 = userDao.login(user,pwd);
            //判断是否有该账号
            if (user1!=null){
                //登录成功跳转登录首页
                response.sendRedirect("ShouYe.jsp");
            }else {
                //登录失败跳转错误页面
                response.sendRedirect("Error.jsp");
            }
        }
    }

    十二、注册的业务处理

    在Servlet包下建一个Enroll类用来处理登录业务

    Enroll类位置如图下所示:

    根据Java Web 使用Servlet +Mysql 实现简易的登录及注册功能以及项目间的分层,第17张

     Enroll类内的代码如下:

    /**
     * 注册类
     */
    //设置当前类用来处理 /enroll 的请求
    @WebServlet("/enroll")
    public class Enroll extends HttpServlet {
        //数据库连接对象
        Connection con = null;
        //预处理对象
        PreparedStatement pstm = null;
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("enroll...get");
            //调用doPost方法
            doPost(request, response);
        }
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("enroll...post");
            //设置请求的编码格式为UTF-8格式
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            //设置以文本或网页的形式响应
            response.setContentType("text/html;charset=UTF-8");//已什么样的格式(文本/网页)响应
            //从请求中获取用户提交的参数(数据)
            String zhangh = request.getParameter("zhangh");
            String pwd = request.getParameter("pwd");
            String dell = request.getParameter("dell");
            String address = request.getParameter("address");
            //实例化对象
            User enroll = new User();
            //给实体类user 赋值
            enroll.setUsername(zhangh);
            enroll.setPassword(pwd);
            enroll.setPhone(dell);
            enroll.setAddress(address);
            //实现UserDao接口的UserDaoImpl类
            UserDao userDao = new UserDaoImpl();
            //调用子类接口的enroll方法 返回受影响的行数
            int row = userDao.enroll(enroll);
            //判断受影响的行数大于零注册成功
            if (row>0){
                //注册成功 跳转登录页面
                response.sendRedirect("Login.jsp");
            }else {
                //注册失败 跳转错误页面
                response.sendRedirect("Error.jsp");
            }
        }
    }