一、登陆验证

1.1 编写内容

1 将管理员的账号和密码保存到资源文件中。

2 使用操作资源文件的工具类编写DAO层的数据访问方法。

3 在Service层精选业务逻辑验证。

4 在视图层进行与用户之间的交互

1.2 训练内容

1 工程层次结构

View -> Service ->DAO ->数据源


View视图层,负责与用户之间进行交互。

        负责一些显示逻辑。例如:控制输入用户名和密码的次数。

Service业务层,负责亚乌逻辑处理

        负责验证信息,处理异常,关闭连接。

DAO数据访问层。负责数据的查找与维护。

        负责读取资源文件。

资源文件 数据源 。保存验证使用的数据。

2 知识点

        资源文件的操作。

        数据封装。实体类的封装。

        业务逻辑,异常处理,自定义异常。

1.3 编写数据源

使用资源文件做数据源  admin.properties

java业务逻辑怎么锻炼 java业务逻辑实例_java

在文本中输入Key - Value格式的账户密码信息。

例如:

adminName=zhangsan
adminPass=123456

 1.4 导入一些线程的工具类

adminPass=123456  这种写法没有任何安全性。

我们使用MD5加密的工具类实现对密码的加密操作。

java业务逻辑怎么锻炼 java业务逻辑实例_System_02

测试MD5加密的测试代码

public static void main(String[] args){
    String pass = "123456";
    String md5Pass = MD_Encoding.getMD5(pass);
    System.out.println(md5Pass);

}

 使用这个工具类。实现对密码的加密处理

java业务逻辑怎么锻炼 java业务逻辑实例_java_03

1.5 编写实体类(domain) 

我们做登录验证的验证对象是谁? 管理员。

账号和密码的所属是谁的?管理员 。

所以我们编写的实体类应该是一个管理员的实体类。

public class Admin {
    private String adminName;
    private String adminPass;
    //get&set&toString&构造方法
}

1.6 对比DAO与Service

DAO:数据访问对象。

Service:业务处理对象。


案例:小的银行系统。这个系统只需要实现三个业务:存,取,转账。

Service:存(),取(),转账()。   一般情况下要尽量避免同级调用。

Dao:修改,查询()                        三种不同的业务。对数据进行的操作是相同的,只有修改。

1.7 编写数据访问对象(DAO)

编写一个AdminDAO类。在这个类中需要编写的方法有什么?

按管理员名称查询管理员对象的方法。

        public Admin selectByName(String adminName);

public class AdminDAO{
    /**
     * 按管理员名称查询管理员对象的方法
     * @param adminName 管理员名称
     * @return 管理员对象,没有找到返回null
     */
    public Admin selectByName(String adminName){
        String name = PropertiesUtils.getProperty("adminName");
        if(name.equals(adminName)){
        Admin admin = new Admin();
        admin.setAdminName(name);
        admin.setAdminPass(PropertiesUtils.getProperty("adminPass"));
        return admin;
        }else{
            return null;
        }
    }
}

1.8 编写自定义异常类

针对业务中的例外。我们需要编写自定义的异常类。

将业务中的每一种例外情况都封装成一个对应的异常类。

 编写用户名异常类:

public class NameException extends Exception{
    public NameException(String message){
        super(message);
    }
}

 编写密码异常类:

public class PassException extends Exception{
    public PassException(String message){
        super(message);
    }
}

1.9 编写业务处理对象(service)

public class AdminService{
    private AdminDAO adminDAO = new AdminDAO();
    /**
     * 管理员的登录验证方法
     * @param adminName 管理员名称
     * @param adminPass 管理员密码
     * @return 登录验证成功时返回管理员对象。
     * @throws NameException 管理员名称不存在时抛出异常
     * @throws PassException 管理员密码错误时抛出异常
     */
        public Admin isLogin(String adminName,String adminPass)
            throws NameException,PassException{
        Admin admin = this.adminDAO.selectByName(adminNme);
        if(admin == null){
            throw new NameException("管理员名称不存在!");
        }else{
            String md5pass = MD_5Encoding.getMD5(adminPass);
            if(md5Pass.equals(admin.getAdminPass)){
            return admin;
            }else{
            throw new PassException("密码错误");
            }
        }    
    }

}

1.10 编写视图层

视图是就与用户进行交互

交互包含:

1 给用户看信息  System.out.println()

2 采集用户信息  Scanner

public class AdminView {
    private static Scanner scanner = new Scanner(System.in);
    private static AdminService adminService = new AdminService();
    public static void main(String[] args) {
        boolean isLogin = AdminView.loginView();
        if(isLogin){
            System.out.println("登录成功之后的一些视图调用!");
        }else{
            System.out.println("886!今天没次数了!明天再来!");
            return;
        }
    }
    //登录验证的视图方法
    public static boolean loginView(){
        int count = 1;
        do {
            System.out.print("请输入管理员名称:");
            String adminName = scanner.nextLine();
            System.out.print("请输入管理员密码:");
            String adminPass = scanner.nextLine();
            try {
                Admin admin = adminService.isLogin(adminName, adminPass);
                System.out.println("登录成功!欢迎'" + admin.getAdminName() + "'!");
                return true;
            } catch (NameException | PassException e) {
                System.out.println("登录失败!请重试!");
                if(count == 3){
                    return false;
                }
                count++;
            }
        }while(true);
    }
}

二、商品管理

2.1 商品(实体类)

public class Goods{
    private Integer goodsId;
    private String goodsName;
    private Double goodsPrice;
}

goodsId是商品的唯一标识。不能有重复。

Map<Integer,Goods> goodsMap;

2.2 商品的操作

GoodsDAO类中声明一个集合对象,做为商品的容器对象。

public class GoodsDAO{
    private static List<Goods> goodsList = new ArrayList<>();
    private static Map<Integer,Goods> goodsMap = new HashMap<>();
    static{
        //List的添加方式
        goodsList.add(new Goods(1,"可口可乐",3.0));
        goodsList.add(new Goods(2,"百事可乐",3.0));
        goodsList.add(new Goods(3,"雪碧",3.0));
        goodsList.add(new Goods(4,"雷碧",2.0));
        goodsList.add(new Goods(5,"可可可乐",3.0));
        //Map的添加方式
        goodsMap.put(1,new Goods(1,"可口可乐",3.0));
        goodsMap.put(2,new Goods(2,"百事可乐",3.0));
    
    }
}

2.3 能在管理员视图中查看所有商品信息

查询所有商品的业务逻辑非常简单。不用提前做业务分析。

分析的流程是从上向下推(Service -> DAO)。

编写代码过程一啊办事从下向上编写(DAO -> Service)

(1) 编写GoodsDAO类中的查询所有商品的方法

        public List<Goods> selectAll();

public List<Goods> selectAllList(){
    return GoodsDAO.goodsList
}

public Map<Integer,Goods> selectAllMap(){
    return GoodsDAO,goodsMap;
}

(2) 编写GoodsService类中的查询所有商品的方法

        public List<Goods> selectAll();

public class GoodsService {
    private GoodsDAO goodsDAO = new GoodsDAO();

    public List<Goods> selectAllList(){
        return this.goodsDAO.selectAllList();
    }

    public Map<Integer,Goods> selectAllMap(){
        return this.goodsDAO.selectAllMap();
    }
}

(3) 编写AdminView类中的显示所有商品的方法

        public static void showGoods();

public class AdminView {
    private static Scanner scanner = new Scanner(System.in);
    private static AdminService adminService = new AdminService();
    private final static GoodsService GOODS_SERVICE = new GoodsService();

    public static void showGoodsList(){
        List<Goods> goodsList = AdminView.GOODS_SERVICE.selectAll();
        for(Goods goods : goodsList){
            System,out,println(goods);
        }
    }
    public static void showGoodsMap(){
        Map<Integer,Goods> goodsMap = AdminView.GOODS_SERVICE.selectAllMap();
        Set<Map.Entry<Integer, Goods>> entrySet = goodsMap.entrySet();
        for (Map.Entry<Integer, Goods> entry: entrySet ) {
            System.out.println("key:"+entry.getKey());
            System.out.println("value:"+entry.getValue());
        }
    }
}

2.4 在管理员视图保存一个新商品

业务分析:分析这个业务的规则。

相同的商品不可以保存两次。

        如何判断“相同的商品”?

商品编号判断。

(1) 编写GoodsDAO类中添加商品方法

        public void add(Goods goods);

public class GoodsDAO{

    private static List<Goods> goodsList = new ArrayList<>();
    private static Map<Integer,Goods> goodsMap = new HashMap<>();
    /**
     * DAO层的方法不考虑业务。只操作数据源
     * @param goods 商品对象
     */
    public void addList(Goods goods){
        GoodsDAO.goodsList.add(goods);
    }

    public void addMap(Goods goods){
        GoodsDao.goodsMap.add(goods);
    }
//通过名字来寻找是否有相同的元素存在Map集合中
    public Goods selectByName(String goodsName) {
        Set<Map.Entry<String, Goods>> entrySet = map.entrySet();
        for (Map.Entry<String,Goods> entry:entrySet){
            if (entry.getValue().getGoodsName().equals(goodsName)){
                return entry.getValue();
            }
        }
        return null;
    }
//通过ID来寻找是否有相同元素存在List集合中
    public Goods selectById(String goodsName){
        for (Goods goods : this.goodsList){
            if(goods.getGoodsName().equals(goodsName)){
                return goods;
            }
        }
        return null;
    }


}

(2) 编写GoodsDAO类中按编号查询商品方法

        public Goods selectById(Integer goodsId)

public Goods selectByIdList(Integer goodsId){
    for (Goods goods : GoodsDAO.goodsList ) {
        if(goodsId == goods.getGoodsId()){
            return goods;
        }
    }
    return null;
}
public Goods selectByIdMap(Integer goodsId){
    return GoodsDAO.goodsMap.get(goodsId);
}

(3) 编写GoodsDAO类中判断商品是否存在

        public boolean exists(Goods goods);

public class Goods {
    private Integer goodsId;
    private String goodsName;
    private Double goodsPrice;
//重写equals方法,通过对比id来实现对比两个Goods。
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Goods goods = (Goods) o;
        return Objects.equals(goodsId, goods.goodsId);
    }
}
public class GoodsDAO {
    private static List<Goods> goodsList = new ArrayList<>();
    private static Map<Integer,Goods> goodsMap =  new HashMap<>();
    /**
     * 判断商品是否存在
     * @param goods 商品对象
     * @return 如果存在返回true,否则返回false
     */
    public boolean existsList(Goods goods){
        return GoodsDAO.goodsList.contains(goods);
    }
    public boolean existsMap(Goods goods){
        return GoodsDAO.goodsMap.containsKey(goods.getGoodsId());
    }
}

(4) 编写GoodsService类中的保存商品方法

        public void save(Goods goods) throws IdException;

public class GoodsService {
    private GoodsDAO goodsDAO = new GoodsDAO();
    /**
     * 保存商品的业务方法
     * @param goods 商品对象
     * @throws IdException 商品编号已经存在时,抛出的异常
     */
    public void saveList(Goods goods) throws IdException {
        if(this.goodsDAO.existsList(goods)){
            throw new IdException("商品已存在!");
        }else{
            this.goodsDAO.addList(goods);
        }
    }
    public void saveMap(Goods goods) throws IdException{
        Goods g = this.goodsDAO.selectByIdMap(goods.getGoodsId());
        if(g==null){
            this.goodsDAO.addMap(goods);
        }else{
            throw new IdException("商品已存在!");
        }
    }
}

(5) 编写AdminView类中添加新商品的视图方法

        public static void newGoods();

public class AdminView {
    private static Scanner scanner = new Scanner(System.in);
    private static AdminService adminService = new AdminService();
    private final static GoodsService GOODS_SERVICE = new GoodsService();

    public static void newGoods(){
        Goods goods = new Goods();
        System.out.println("输入商品编号:");
        goods.setGoodsId(scanner.nextInt());
        scanner.nextLine();
        System.out.println("输入商品名称:");
        goods.setGoodsName(scanner.nextLine());
        System.out.println("输入商品价格:");
        goods.setGoodsPrice(scanner.nextDouble());
        scanner.nextLine();
        try {
            AdminView.GOODS_SERVICE.saveList(goods);
            System.out.println("保存成功!");
        } catch (IdException e) {
            e.printStackTrace();
            System.out.println("保存失败:"+e.getMessage());
        }
    }
}