java的学习历程(二)

接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲

前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程。

那么现在我们站在设计的角度上去实现该如何做呢?实际上在项目开发的时候,需求规划和数据库设计好之后,我们开始写代码,往往只用写一些接口出来,接口里面只有一些各个业务对应的空方法,没有具体的实现,在架构师进行接口设计的时候,就已经想好了该功能之后通过实现与调用这个接口肯定是可以实现的,等各个功能相关的接口设计好之后,剩下的就是程序员去实现与调用这些接口,就跟填空一样。在做接口设计的时候只用关心方法的形参与返回值类型,可以写好对应的接口文档,描述每个接口的作用,接口中每个方法的形参的含义和返回值的含义,这样可以更好的方便团队开发。其实这个跟做房子很像,做房子也是先把设计图做好,然后搭建框架,剩下的就是码砖了。

在我们使用函数(方法)的时候,我们要理解一个概念。一去一回(也可以说是请求与响应),特别是在做http请求时更加明显。在非void返回类型的函数中,都是需要retrun一个返回值的,而调用函数给形参传递实参的时候,这个过程我们就可以看做是“去”,在函数体类做一大堆的逻辑与业务的处理,待处理完之后,就返回一个结果回去,这个就是“回”。

比如做一个网页登陆的功能,首先是从html里面的输入框将用户名和密码信息(实参)传递到服务端,服务端就存在一个checkLogin的函数来接收前端传递过来的实参,然后去查询数据库,处理完结果之后返回一个结果告知前端是否登录成功,前端可以根据这个返回值进行UI界面的提示与界面跳转等工作。在做分成业务涉及的时候,前面的用户名和密码可能还要经过几次函数之间的传递,但是都是又去有回。像web设计中的ajax与android网络请求retorfit中都体现的特别明显,大家充分理解了一去一回的原理之后,可以更加的方便我们对功能模块进行设计。

好下面,我们具体来通过代码进行展示。

我们新建一个java工程,然后此时我们不着急去写代码,先做个分包(package)的工作,相当于一个组织架构,使代码结构更加清晰,也更方便阅读与维护。

dao这个包下面就用来存放我们的接口,daoimpl下面用来存放我们的接口实现类,main作为项目的主入口,用来存放具体业务的实现,pojo用来存放数据模型类(等下具体讲解pojo的作用),utils用来存放工具类(把上一章我们写好的DBHelper放到这个包下)。

POJO(Plain Old Java Objects)简单的Java对象,实际就是普通JavaBeans,其中有一些属性及其getter setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,可以看成是与数据库中的表相映射的 java 对象。

我们在pojo包下面新建一个User类

/**
 *
 */
package com.xdw.pojo;

/**
 * @author xiadewang
 *2018年1月14日
 */
public class User {
    private int id;
    private String username;
    private String password;
    /**
     * @param id
     * @param username
     * @param password
     */
    public User(int id, String username, String password) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
    }
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }
    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }
    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }
    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
}

下面我们面向接口进行编程,比如说我们现在的业务有如下:

1、登录

2、注册

3、根据id查询用户信息

4、根据username查询用户信息

5、修改用户密码

这时候,如果是面向过程设计的话,我们就想着先去完整的完成登录的功能,然后完成注册的功能,然后继续下面的345的业务。

换成接口设计的话,就是我们先在dao下面新建一个接口UserDao,具体代码如下

/**
 *
 */
package com.xdw.dao;

import com.xdw.pojo.User;

/**
 * @author xiadewang
 *2018年1月14日
 */
public interface UserDao {
    /**
     * 传递用户名和密码来校验登录
     * @param username
     * @param password
     * @return
     */
    public boolean checkLogin(String username,String password);

    /**
     * 传递user对象来校验登陆
     * @param user
     * @return
     */
    public User checkLogin(User user);

    /**
     * 传递user对象进来,返回值1代表注册成功,0代表注册失败
     * @param user
     * @return
     */
    public int register(User user);

    /**
     * 传递int型的id参数,返回值为user对象
     * @param id
     * @return
     */
    public User getUserById(int id);

    /**
     * 传递字符串类型的用户名,返回值为user对象
     * @param username
     * @return
     */
    public User getUserByUsername(String username);

    /**
     * 传递要修改密码的user对象,和要修改的密码,返回值1代表修改成功,0代表修改失败
     * @param user
     * @param password
     * @return
     */
    public int modifyPassword(User user,String password);
}

由于这里的功能很简单,直接把接口说明文档写到了注释之中,这个时候设计工作就完了,下面换个程序员来完成程序的完整功能。

在daoimpl包下面写一个接口实现类UserDaoImpl,如下

/**
 *
 */
package com.xdw.daoimpl;

import java.sql.ResultSet;
import java.sql.SQLException;

import com.xdw.dao.UserDao;
import com.xdw.pojo.User;
import com.xdw.utils.DBHelper;

/**
 * @author xiadewang
 *2018年1月14日
 */
public class UserDaoImpl implements UserDao {
    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#checkLogin(java.lang.String, java.lang.String)
     */
    @Override
    public boolean checkLogin(String username, String password) {
        // TODO Auto-generated method stub
        return false;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#checkLogin(com.xdw.pojo.User)
     */
    @Override
    public User checkLogin(User user) {
        // TODO Auto-generated method stub

        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#register(com.xdw.pojo.User)
     */
    @Override
    public int register(User user) {
        // TODO Auto-generated method stub
        return 0;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#getUserById(int)
     */
    @Override
    public User getUserById(int id) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#getUserByUsername(java.lang.String)
     */
    @Override
    public User getUserByUsername(String username) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#modifyPassword(com.xdw.pojo.User, java.lang.String)
     */
    @Override
    public int modifyPassword(User user, String password) {
        // TODO Auto-generated method stub
        return 0;
    }

}

这些都是编译器自动生成的代码,这个时候我们甚至都不用去完成里面每个方法的具体内容,可以直接跳到实现业务的主类中去实现我们的业务,因为这些方法都会存在一个默认的返回值,并不影响程序的编译与运行。

这个时候我们在main包中创建一个实现业务的类MainClass,如下

/**
 *
 */
package com.xdw.main;

import com.xdw.dao.UserDao;
import com.xdw.daoimpl.UserDaoImpl;
import com.xdw.pojo.User;

/**
 * @author xiadewang
 *2018年1月14日
 */
public class MainClass {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        UserDao userDao=new UserDaoImpl();
        if(userDao.checkLogin("xdw","123456")) {
            System.out.println("用户xdw登录成功");
        }else {
            System.out.println("用户xdw登录失败");
        }
        if(userDao.checkLogin("xxx","1234")) {
            System.out.println("用户xxx登录成功");
        }else {
            System.out.println("用户xxx登录失败");
        }

        User user1=new User(1,"xdw","123456");
        User user2=new User(2,"xxx","ttt");
        if(userDao.checkLogin(user1) !=null) {
            System.out.println("用户xdw登录成功");
        }else {
            System.out.println("用户xdw登录失败");
        }
        if(userDao.checkLogin(user2) !=null) {
            System.out.println("用户xxx登录成功");
        }else {
            System.out.println("用户xxx登录失败");
        }

    }

}

这里,我只用2个重载的checkLogin方法做了业务展示,大家现在可以运行下,运行结果如下

进行到了,其实整个业务的设计与实现就完成了,剩下的工作我们就是要去具体的完善接口实现类的内容了,让他们更加的符合实际的业务处理,比如要连接数据库做真实的数据处理,这里只用第一个checkLogin做下举例,完善后的UserDaoImpl如下:

/**
 *
 */
package com.xdw.daoimpl;

import java.sql.ResultSet;
import java.sql.SQLException;

import com.xdw.dao.UserDao;
import com.xdw.pojo.User;
import com.xdw.utils.DBHelper;

/**
 * @author xiadewang
 *2018年1月14日
 */
public class UserDaoImpl implements UserDao {
    private String sql = null;
    private DBHelper db1 = null;
    private ResultSet ret = null;
    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#checkLogin(java.lang.String, java.lang.String)
     */
    @Override
    public boolean checkLogin(String username, String password) {

        // TODO Auto-generated method stub
        try {
            sql = "select * from user where username= ? and password= ?";// SQL语句
            db1 = new DBHelper(sql);// 创建DBHelper对象
            db1.pst.setString(1, username);
            db1.pst.setString(2, password);
            ret = db1.pst.executeQuery();// 执行语句,得到结果集
            if(ret.next()) {
                return true;
            }
            ret.close();
            db1.close();// 关闭连接

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#checkLogin(com.xdw.pojo.User)
     */
    @Override
    public User checkLogin(User user) {
        // TODO Auto-generated method stub

        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#register(com.xdw.pojo.User)
     */
    @Override
    public int register(User user) {
        // TODO Auto-generated method stub
        return 0;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#getUserById(int)
     */
    @Override
    public User getUserById(int id) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#getUserByUsername(java.lang.String)
     */
    @Override
    public User getUserByUsername(String username) {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.xdw.dao.UserDao#modifyPassword(com.xdw.pojo.User, java.lang.String)
     */
    @Override
    public int modifyPassword(User user, String password) {
        // TODO Auto-generated method stub
        return 0;
    }

}

到这里就不用我来啰嗦接口的重要作用了吧,java的核心个人觉得就是类、对象与接口,特别是面向接口编程。

初学者往往会觉得接口没什么鸟用,本来可以几行代码实现的功能,偏偏要添加一个接口出来,还要再添加一个实现类,不光增加代码还绕来绕去。

通过这里的接口编程的演示,大家有没有发现可以让我们做项目的时候思路更加清晰,代码可阅读和可扩展性也越强。我们要有一个概念,编程不是代码越少越好,而是要设计与思路越清晰越好。

这篇就到此为止,下一篇将引入servlet+jsp,到时候就会有UI界面了,前面的都还是console控制台输出,可能会觉得不过瘾,还是觉得代码没有什么用,不能运用到实际中。

原文地址:https://www.cnblogs.com/yuan211/p/8335753.html

时间: 2024-11-08 14:08:57

java的学习历程(二)的相关文章

Java Web学习(二) Eclipse的配置

Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后根据windows系统32位或64位,进行选择(建议64位).如果你的机器内存过小,可以选择Eclipse的旧版本:Eclipse Indigo .Eclipse Juno . Eclipse Kepler 等版本. 2.解压缩安装 打开压缩包,将里面的Eclipse 拖出到指定位置,进行解压缩.

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

Java基础学习笔记二十 IO流

转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStreamWriter,这又是什么意思呢? OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指定的编码表转成字节,

Java基础学习笔记二十一 多线程

多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 什么是多线程呢?即就是一个程序中有多个线程在同时执行.通过下图来区别单线程程序与

Java基础学习笔记二十六 JDBC

什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句. JDBC原理 早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是

Java基础学习笔记二十八 管家婆综合项目

本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添加账务 编辑账务 删除账务 项目环境搭建 技术选型和jar包介绍 每个项目都要使用一些已经成熟的技术,它们通常是由一些专业组织或团队所提供的开源免费技术.在今后的学习过程中,我们会逐渐对这些专业组织有所了解.本项目中使用的技术如下: apache的commons组件: commons-dbutils

Java多线程学习(二)

一.定义产生返回值的任务 在上一篇文的介绍中,我们知道了定义任务通常的方法是定义一个实现Runnable接口的类,这个类被我们成为任务.然而也很容易注意到,任务的最重要的一个方法就是run( )方法,而run( )方法是没有返回值的,也就是说我们之前定义的任务不返回任何值. 如果想要定义一个有返回值的任务,则需要编写一个实现Callable接口的类.Callable是一种具有类型参数的泛型,他的类型参数表示的是call( )方法的返回值类型. 示例如下: 1 import java.util.c

java基础学习总结二(标识符、字符集、数据类型以及类型转换)

一:标识符 1:标识符可以由字母.数字.下划线_.$符等组成2:标识符的首字母只能是字母.数字.下划线3:标识符不能使用关键字或者保留字4:标识符可以是中文,但是不建议使用中文5:标识符可以任意长,没有限制. 二:字符集 ISO8859-1:标准字符集,西方国家都在使用BIG5:台湾地区使用GB2312:大陆地区最早使用(简体字符集)GBK:在gb2312基础上的扩展,包括简体字和繁体字GB18030:包括简体字.繁体字.藏蒙维吾尔等少数民族语言等 三:数据类型 数据类型分为基本数据类型和引用数

Thinking in java 4学习(二)final,protected关键字

protected关键字: 对于类用户而言这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,他是可以访问的. final关键字: (1)final数据 1.final 数据 要么在定义时就初始化 ,要么在每个构造器中初始化,否则编译不过. 2.final修饰基本类型使数值恒定不变;final修饰的对象引用使引用恒定不变,但对象自身是可以被修改的. (2)final方法 使用final方法原本有两个原因(一)把方法锁定,防止任何继承类修改它(二)出于效率.但现在只