美文网首页
三层架构

三层架构

作者: 咸鱼有梦想呀 | 来源:发表于2017-12-21 20:41 被阅读0次

    三层架构

    三层架构

    用三层架构做一个登录,注册

    项目环境:
    Java+eclipse+MySQL+Navicat/sqlyog

    三层思想分析:

    登录注册三层思想分析

    步骤:

    1:创建项目,建立层次

    edu.eurasia.app          存放主方法(即程序入口)
    edu.eurasia.dao          dao层
    edu.eurasia.service      service层
    edu.eurasia.domain       JavaBean层(实体类层)
    edu.eurasia.utils        工具类层
    edu.eurasia.view         存放实现抽象页面
    edu.eurasia.abview       存放抽象页面
    
    创建项目,建立层次

    2:创建数据库、表、插入测试数据

    创建数据库、表、插入测试数据

    3:导入JDBC相关的jar包和工具类

    jar包

    连接数据库

    工具类

    4:在edu.eurasia.domain下创建相关实体类
    实体类的书写规范:
    a)该类有私有属性(属性名 要和 数据库 表中的列名 要一样)
    b)该类具备无参构造
    c)该类提供 set get方法

    实体类

    User类代码:

    /*
     *  实体类
     *    javabean类
     */
    public class User {
    
        private int uid;
        private String uname;
        private String pwd;
    
        public User() {
            super();
        }
    
        public int getUid() {
            return uid;
        }
    
        public void setUid(int uid) {
            this.uid = uid;
        }
    
        public String getUname() {
            return uname;
        }
    
        public void setUname(String uname) {
            this.uname = uname;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        @Override
        public String toString() {
            return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + "]";
        }
    
    }
    

    5:将做好的抽象GUI页面类,存放到抽象页面层edu.eurasia.abview

    登录和注册的抽象GUI类

    AbstractRegDialog类:

    public abstract class AbstractRegDialog extends JDialog {
    
        public JLabel registLabel1 = new JLabel("用户注册"); // 注册标签1
    
        public JLabel userNameLabel = new JLabel("用户名"); // 用户名标签
        public JTextField userNameField = new JTextField(); // 用户名文本框
    
        public JLabel passwordLabel = new JLabel("密码"); // 密码标签
        public JPasswordField passwordField = new JPasswordField(); // 密码文本框
    
        public JLabel rePasswordLabel = new JLabel("重复密码"); // 重复密码标签
        public JPasswordField rePasswordField = new JPasswordField(); // 重复密码文本框
    
        public JLabel verifyCodeLabel = new JLabel("验证码"); // 验证码标签
        public JTextField verifyCodeField = new JTextField(); // 验证码标签
        public JLabel verifyCodeLabel2 = new JLabel(); // 显示验证码标签
    
        public JButton registBtn = new JButton("注\t册");// 注册按钮
        public JButton resetBtn = new JButton("重\t置");// 重置按钮
    
        public AbstractRegDialog(Frame owner) {
            init(); // 初始化窗口
            addComponent(); // 添加组件
            addlistener(); // 事件加载
        }
    
        public AbstractRegDialog() {
            init(); // 初始化窗口
            addComponent(); // 添加组件
            addlistener(); // 事件加载
        }
    
        // 初始化窗口
        private void init() {
            setTitle("注册");
            setSize(600, 360);
            // 去除布局
            setLayout(null);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setVisible(true);
        }
    
        private void addComponent() {
    
            // 添加注册标题
            registLabel1.setFont(new Font("楷体", Font.BOLD, 20));
            registLabel1.setBounds(220, 20, 100, 30);
            this.add(registLabel1);
    
            // 用户名文本框
            userNameLabel.setBounds(100, 80, 60, 25);
            userNameField.setBounds(160, 80, 120, 25);
            this.add(userNameLabel);
            this.add(userNameField);
    
            // 密码文本框
            passwordLabel.setBounds(100, 110, 60, 25);
            passwordField.setBounds(160, 110, 120, 25);
            this.add(passwordLabel);
            this.add(passwordField);
    
            // 密码文本框
            rePasswordLabel.setBounds(290, 110, 60, 25);
            rePasswordField.setBounds(350, 110, 120, 25);
            this.add(rePasswordLabel);
            this.add(rePasswordField);
    
            // 验证码
            verifyCodeLabel.setBounds(100, 140, 60, 25);
            verifyCodeField.setBounds(160, 140, 120, 25);
            verifyCodeLabel2.setBounds(290, 140, 60, 25);
            verifyCodeLabel2.setBackground(new Color(255, 255, 255));
            verifyCodeLabel2.setOpaque(true); //设置组件JLabel不透明,只有设置为不透明,设置背景色才有效  
            verifyCodeLabel2.setText("   1111");
            
            this.add(verifyCodeLabel);
            this.add(verifyCodeField);
            this.add(verifyCodeLabel2);
    
            // 注册按钮
            registBtn.setBounds(160, 240, 80, 25);
            this.add(registBtn);
    
            // 重置按钮
            resetBtn.setBounds(260, 240, 80, 25);
            this.add(resetBtn);
        }
    
        // 添加监听器(事件加载)
        public void addlistener() {
    
            // 表单重置
            resetBtn.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
                    userNameField.setText("");
                    passwordField.setText("");
                    rePasswordField.setText("");
    
                    verifyCodeField.setText("");
    
                    userNameField.requestFocus();
                }
            });
    
            registBtn.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
    
                    // 获取用户输入的注册信息
                    String userName = userNameField.getText();
                    char[] passwordArray = passwordField.getPassword();
                    String password = new String(passwordArray);
                    char[] repasswordArray = rePasswordField.getPassword();
                    String rePassword = new String(repasswordArray);
    
                    String verifyCode = verifyCodeField.getText();
    
                    // 使用用户输入的注册信息调用regist方法完成注册
                    try {
                        regist(userName, password, rePassword, verifyCode);
                    } catch (Exception e1) {
                        e1.printStackTrace();
                    }
                }
            });
        }
    
        // 注册方法
        public abstract void regist(String userName, String password, String rePassword, String verifyCode) throws Exception ; 
    }
    
    注册对话框

    AbstractRLFrame类:

    public abstract class AbstractRLFrame extends JFrame {
        public AbstractRLFrame() {
            this("登录注册");
        }
    
        public AbstractRLFrame(String title) {
            super(title);
            init();
    
            addPanel();
    
            addButton();
    
            addListener();
        }
    
        private void addListener() {
            button.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        register();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
    
                }
            });
    
            button2.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        login();
                    } catch (SQLException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
    
                }
            });
        }
        private void init() {
            this.setSize(600, 400);
            this.setLocation(300, 100);
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            this.setLayout(null);
            this.setVisible(true);
        }
        JButton button = new JButton("注册");
        JButton button2 = new JButton("登录");
    
        private void addButton() {
            
            button.setBounds(100, 250, 100, 50);
            button2.setBounds(350, 250, 100, 50);
            this.add(button);
            this.add(button2);
        }
        public JLabel registLabel1 = new JLabel(); // 欢迎标签1
    
        JPanel jPanel = new JPanel();
        JLabel jLabel = new JLabel();
        JLabel jLabel2 = new JLabel();
        protected TextField tf = new TextField();
        protected TextField tf2 = new TextField();
    
        private void addPanel() {
            jPanel.setLayout(null);
            jPanel.setBackground(new Color(0x808000));
            jPanel.setBounds(0, 0, 600, 200);
            this.add(jPanel);
    
            jLabel.setText("用户名:");
            jLabel.setBounds(100, 100, 50, 30);
            jPanel.add(jLabel);
            tf.setBounds(200, 100, 200, 30);
            tf.setFont(new Font("宋体", Font.BOLD, 20));
            jPanel.add(tf);
    
            jLabel2.setText("密码:");
            jLabel2.setBounds(100, 150, 50, 30);
            jPanel.add(jLabel2);
            tf2.setBounds(200, 150, 200, 30);
            tf2.setFont(new Font("宋体", Font.BOLD, 20));
            jPanel.add(tf2);
            
            // 添加注册标题
            registLabel1.setText("登录注册");
            registLabel1.setFont(new Font("楷体", Font.BOLD, 20));
            registLabel1.setBounds(220, 20, 100, 30);
            jPanel.add(registLabel1);
        }
        public abstract void login() throws SQLException;
        public abstract void register() throws SQLException;
    }
    
    登录注册主界面

    6:创建程序入口MainApp.java在edu.eurasia.app层里
    在这个类里写主方法(只有一个主方法)

    /*
     * 程序入口  
     */
    public class MainApp {
       public static void main(String[] args) {
           //创建主页面对象
           RLFrame rf = new RLFrame();
           
           //设置显示可见
           rf.setVisible(true);
       }
    }
    

    7:创建实现抽象GUI类的RLFrame.java和RegDialog.java
    RegDialog类

    /*
     * 注册页面
     */
    public class RegDialog extends AbstractRegDialog{
       /*
        *注册完成 提交 操作
        */
        @Override
        public void regist(String userName, String password, String rePassword, String verifyCode) throws Exception {
            System.out.println("提交注册操作");
            
            /*
             * 验证 码 不管了 没有用到
             * 
             * 验证 密码两次是否一致
             */
            if(!password.equals(rePassword)){
                JOptionPane.showMessageDialog(this, "两次密码不一致");
                
                return;
            }
            
            //验证用户名是否存在 
            //依赖于 service层
            UserService userService = new UserService();
            boolean b = userService.isHave(userName);
            
            if(b){
                //说明用户存在
                JOptionPane.showMessageDialog(this, "用户已经存在");
                return;
            }
            
            //完成注册
            userService.addUser(userName, password);
            JOptionPane.showMessageDialog(this, "注册成功");
        }
    }
    
    

    RLFrame类

    /*
     * 登录注册主页面
     */
    public class RLFrame extends AbstractRLFrame{
       
        /*
         * 登录功能
         *   1:获取页面上  
         *       用户名和密码的两个文本框 
         *       tf 变量 代表 用户名框
         *       tf2变量 代表 密码框
         *   
         *   
         *   2:检查 文本框中的用户名或密码是不是空格
         *   
         *   3:需要查询数据库 进行校验
         *       如果 用户名密码匹配成功 登录成功
         *         否则登录失败
         */
        @Override
        public void login() throws SQLException {
            System.out.println("登录");
            //1:获取页面上的用户名和密码 两个文本框中的内容
            String username = tf.getText();//获取用户名 文本框中内容
            String password = tf2.getText();//获取密码 文本框中的容
            
            
            
            //2:校验用户名 或密码 是不是 空 
            if(username.trim().equals("")||password.trim().equals("")){
                
                //给个友情提示  
                //完成弹框  
                JOptionPane.showMessageDialog(this, "用户名或密码不能为空!!");
                return;
            }
            //3:需要查询数据库 进行校验
            /*
             * 校验 操作 交给 service去完成    
             *     
             */
            //需要创建Service对象
            UserService userService = new UserService();
            
            boolean login = userService.login(username, password);
            
            if(login){
                JOptionPane.showMessageDialog(this, "登录成功~");
            }else{
                JOptionPane.showMessageDialog(this, "用户名或密码不正确,登录失败");
            }
        }
        /*
         * 注册功能
         */
        @Override
        public void register() throws SQLException {
            System.out.println("注册");
            /*
             * 弹出注册页面
             */
            RegDialog  rd = new RegDialog();
            rd.setVisible(true);
        }
    }
    

    8:在edu.eurasia.service层,存放UserService
    edu.eurasia.dao层,存放UserDao

    UserService类:

    /*
     *   提取Service 层(服务层)
     *   
     *      a 创建一个service包
     *      b 创建一个XxxService类  Xxx代表我们将要操作的那个类 对象
     *        就是给用户 提供服务的  
     *          这里类中包含了 对所有 User以及user表  他们所有的业务处理
     *          一些校验等等 
     *      c 在Service层中 完成业务代码编写
     *      
     */
    public class UserService {
        //成员位置创建dao对象 这样所有方法都可以使用
        UserDao userDao = new UserDao();  
        /*
         * 因为web层 要将 登录校验的功能 交给service层处理 
         *  那么 这里需要提供一个功能 
         *    完成 登录校验操作 
         *     
         *     返回值 : boolean 是否校验成功
         *     参数列表:要两个参数  获取到的用户名和密码
         */
        
        public boolean login(String uname,String pwd) throws SQLException{
            
            /*
             * 校验 uname pwd  
             *   根据用户名 和密码  去数据库中查询  
             *     返回的对象 不是null说明 登录成
             *     如果返回的对象是null说明用户名或密码错误  
             */
            //写查询数据库代码   分层思想中  查询数据库代码要提取出去  提取到dao层   
            //依赖 dao层
            
            User user = userDao.getUser(uname, pwd);
            /*
             * 检测 用户是否为空  是空的话 没有登录成
             */
            if(user==null){
                return false;
            }else{
                return true;
            }
        }
        /*
         * 判断用户是否存在
         */
        public boolean isHave(String uname) throws SQLException{
            /*
             * 校验uname用户名是否存储在
             *    根据用户名 去数据库中查找 
             *     dao已经完成了 该功能
             *       返回的对象 是null说明已经存在
             *       不是null说明用户名不存在 
             */
            //需要dao  所以 创建dao对象  
            User user = userDao.getUserByName(uname);
            
            if(user==null){//用户不存在
                
                return false;
            }else{  //用户存在
                return true;
            }
        }
        
        /*
         * 添加用户功能
         */
        public void addUser(String uname,String pwd) throws SQLException{
            
            //这个事情交给userdao做了
            userDao.addUser(uname, pwd);
        }
    }
    

    UserDao类:

    /*
     *  提取 dao层(数据访问层)
     *  
     *     a 创建一个包 dao包
     *     b 创建XxxDao Xxx代表操作的那个类 也就是跟表对应的实体
     *       这个类中包含了所有  关于 该表的数据库的访问
     *     c 提供数据库访问代码
     */
    public class UserDao {
        
        //在成员位置 创建QueryRunner对象 所有方法都可以使用
         QueryRunner qr = new QueryRunner(JDBCUtils.getDS());
        
        /*
         * 根据 用户名和密码 去数据库中查询 用户信息
         *   
         *   返回值 是一个User对象 
         *   参数 用户名和密码
         */
        public User getUser(String uname,String pwd) throws SQLException{
            
            
            
            //2:写sql
            String sql = "select * from users where uname = ? and pwd = ?";
            Object[] params = {uname,pwd};
            
            User user = qr.query(sql, new BeanHandler<User>(User.class), params);
            
            return user;
            
        }
        
        /*
         *  根据用户名 查询 该用户 
         *  
         */
        public User getUserByName(String uname) throws SQLException{
            
            //2写sql
            String sql = "select * from users where uname = ?";
            Object[] params = {uname};
             User user = qr.query(sql, new BeanHandler<User>(User.class), params);
            
            return user;
        }
        
        /*
         * 完成用户的添加 
         */
        public void addUser(String uname,String pwd) throws SQLException{
            
            String sql = "insert into users values(?,?,?)";
            Object[] params = {null,uname,pwd};
            qr.update(sql, params);
        }
    }
    

    以上就是登录和注册的全过程

    但在一些大项目里,一般会将项目分为以下几层:

    但最核心的还是三层架构


    大项目分层架构

    相关文章

      网友评论

          本文标题:三层架构

          本文链接:https://www.haomeiwen.com/subject/maknwxtx.html