三层架构

三层架构

三层架构

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

项目环境:
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);
    }
}

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

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

但最核心的还是三层架构


大项目分层架构
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 本文主要想谈的内容有: 1.为什么要有架构?2.三层架构是什么?3.MVC框架是什么? 4.MVC框架和三层架构的...
    Datawhale阅读 7,100评论 1 7
  • 基于C#.NET的WinForm项目,我们经常使用基于三层架构,来构建项目框架,这里简单的梳理一下三层架构的相关知...
    AiDede阅读 20,954评论 1 12
  • 三层架构和MVC 三层架构 (3-tier application) 是将整个业务应用划分为:表现层(UI)、业务...
    hnscdg阅读 1,753评论 0 8
  • 这几天,我们的关系发生了太多变化。给你帮了倒忙,无意间却发现了你对他依旧念念不忘。你说是你的错在先。是你对不起他。...
    路人甲的世界阅读 137评论 0 0
  • 力量 文/价签儿 浩瀚的宇宙深处传来一声巨响 每一个星辰都被压缩成玄妙 然后剧烈地撕扯开千万种维度 从新生的星河中...
    pricetag阅读 108评论 0 1