三层架构

三层架构

三层架构_第1张图片
三层架构

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

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

三层思想分析:

三层架构_第2张图片
登录注册三层思想分析

步骤:

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       存放抽象页面
三层架构_第3张图片
创建项目,建立层次

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

三层架构_第4张图片
创建数据库、表、插入测试数据

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 ; 
}
三层架构_第5张图片
注册对话框

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张图片
登录注册主界面

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.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.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);
    }
}

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

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

但最核心的还是三层架构


三层架构_第7张图片
大项目分层架构

你可能感兴趣的:(三层架构)