一、登陆验证
1.1 编写内容
1 将管理员的账号和密码保存到资源文件中。
2 使用操作资源文件的工具类编写DAO层的数据访问方法。
3 在Service层精选业务逻辑验证。
4 在视图层进行与用户之间的交互
1.2 训练内容
1 工程层次结构
View -> Service ->DAO ->数据源
View视图层,负责与用户之间进行交互。
负责一些显示逻辑。例如:控制输入用户名和密码的次数。
Service业务层,负责亚乌逻辑处理
负责验证信息,处理异常,关闭连接。
DAO数据访问层。负责数据的查找与维护。
负责读取资源文件。
资源文件 数据源 。保存验证使用的数据。
2 知识点
资源文件的操作。
数据封装。实体类的封装。
业务逻辑,异常处理,自定义异常。
1.3 编写数据源
使用资源文件做数据源 admin.properties
在文本中输入Key - Value格式的账户密码信息。
例如:
adminName=zhangsan
adminPass=123456
1.4 导入一些线程的工具类
adminPass=123456 这种写法没有任何安全性。
我们使用MD5加密的工具类实现对密码的加密操作。
测试MD5加密的测试代码
public static void main(String[] args){
String pass = "123456";
String md5Pass = MD_Encoding.getMD5(pass);
System.out.println(md5Pass);
}
使用这个工具类。实现对密码的加密处理
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());
}
}
}