Java架构设计之商品口
目录
任务描述
1.创建用户操作的业务逻辑层
- 用户注册
- 用户登陆验证
- 展示所有用户
2. 对用户操作的数据访问层做必要改动
3. 编写表示层的代码
实训原理
表示层
表示层又称表现层UI,位于三层构架的最上层,与用户直接接触,主要是B/S信息系统中的Web浏览页面。作为Web浏览页面,表示层的主要功能是实现系统数据的传入与输出,在此过程中不需要借助逻辑判断操作就可以将数据传送到BLL系统中进行数据处理,处理后会将处理结果反馈到表示层中。换句话说,表示层就是实现用户界面功能,将用户的需求传达和反馈,并用BLL或者是Models进行调试,保证用户体验。
业务逻辑层
业务逻辑层BLL的功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,会连接数据访问层DAL,访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的修改、获取、删除等功能,并将处理结果反馈到表示层UI中,实现软件功能。
数据访问层
数据访问层DAL是数据库的主要操控系统,实现数据的增加、删除、修改、查询等操作,并将操作结果反馈到业务逻辑层BLL。在实际运行的过程中,数据访问层没有逻辑判断能力,为了实现代码编写的严谨性,提高代码阅读程度,一般软件开发人员会在该层中编写DataAccessCommon,保证数据访问层DAL数据处理功能。
业务逻辑层
创建服务类UserService
package service; import java.util.ArrayList; import dao.*; import entity.*; //import exception.UserException; public class UserService { /** * 用户集类(用于存储用户 */ private UserDao userset = null; public UserService() { userset = new UserDaoSQL(); } }
添加用户addUser()
/** * 用于向用户集添加用户 */ public void addUser(User user){ userset.addUser(user); System.out.println("用户 "+user.getName() +" 注册成功"); System.out.println(); }
查询函数queryUser( )
这个功能要完成,需要把UserDao的queryUser( )返回值改为ArrayList<User>,这个我们稍后处理
/** * 查询仓库中的用户 */ public void queryUser( ){ System.out.println("本店现有如下用户:"); ArrayList<User> users =userset.queryUser(); //测试代码 for(User user:users){ System.out.println(user); } System.out.println(); }
验证函数login()
/** * 登录验证,判断用户名与密码是否一致 * * @param uid 用户输入的登录账号 * @param pwd 用户输入的登录密码 * @return 登录信息有效:返回用户对象,否则返回NULL */ public boolean login(String name, String pwd) { //用户名为空,密码为空 //try{ if(!userset.hasUser(name)){ //throw new UserException("用户 "+name+":该用户不存在"); System.out.println("用户 "+name+":该用户不存在"); return false; }else if(!userset.verify(name, pwd)){ //throw new UserException("用户 "+name+":用户名或密码错误"); System.out.println("用户 "+name+":用户名或密码错误"); return false; } System.out.println("用户 "+name+" 登陆成功!"); //}catch(UserException e){ //System.out.println(e.toString()); //return false; //} return true; }
main方法中测试
public static void main(String[] args) { UserService us =new UserService(); User u1=new User("zhangliu","456"); us.addUser(u1); us.queryUser( ); us.login("zhangliu","123"); }
完整代码
package service; import java.util.ArrayList; import dao.*; import entity.*; //import exception.UserException; public class UserService { /** * 用户集类(用于存储用户 */ private UserDao userset = null; public UserService() { userset = new UserDaoSQL(); } /** * 用于向用户集添加用户 */ public void addUser(User user){ userset.addUser(user); System.out.println("用户 "+user.getName() +" 注册成功"); System.out.println(); } /** * 查询仓库中的用户 */ public void queryUser( ){ System.out.println("本店现有如下用户:"); ArrayList<User> users =userset.queryUser(); for(User user:users){ System.out.println(user); } System.out.println(); } /** * 登录验证,判断用户名与密码是否一致 * * @param uid 用户输入的登录账号 * @param pwd 用户输入的登录密码 * @return 登录信息有效:返回用户对象,否则返回NULL */ public boolean login(String name, String pwd) { //用户名为空,密码为空 //try{ if(!userset.hasUser(name)){ //throw new UserException("用户 "+name+":该用户不存在"); System.out.println("用户 "+name+":该用户不存在"); return false; }else if(!userset.verify(name, pwd)){ //throw new UserException("用户 "+name+":用户名或密码错误"); System.out.println("用户 "+name+":用户名或密码错误"); return false; } System.out.println("用户 "+name+" 登陆成功!"); //}catch(UserException e){ //System.out.println(e.toString()); //return false; //} return true; } public static void main(String[] args) { UserService us =new UserService(); User u1=new User("zhangliu","456");//这里可能会遇到构造方法参数不符的问题,重新修改一下构造方法 us.addUser(u1); us.queryUser( ); us.login("zhangliu","123"); } }
数据访问层
UserDao接口
本接口改动不大,主要是queryUser( )返回值变成了ArrayList<User>类型。
变动的原因是 现在软件分层了,数据库查询到的数据不宜直接在dao层打印了,通过arraylist传出去
package dao; import java.util.ArrayList; import entity.User; public interface UserDao { public void addUser(User u);//添加用户 public ArrayList<User> queryUser( );//查询用户,这里返回值改为了ArrayList<User> public boolean hasUser(String name);//查询某个用户是否存在 public boolean verify(String name, String pwd);//验证用户名和密码是否一致 }
UserDaoSQL实现类
本类改动不大,主要是queryUser( )返回值变成了ArrayList<User>类型。
变动的原因是 现在软件分层了,数据库查询到的数据不宜直接在dao层打印了,通过arraylist传出去
package dao; import java.sql.*; import java.util.ArrayList; import entity.User; public class UserDaoSQL implements UserDao{ // JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://10.0.0.30:3306/cloud?characterEncoding=utf8"; // static final String DB_URL = "jdbc:mysql://localhost:3306/cloud?characterEncoding=utf8"; // 数据库的用户名与密码,需要根据自己的设置 static final String USER = "root"; static final String PASS = "000000"; Connection conn; public UserDaoSQL(){ this.getConn(); } /** * 连接数据库 * @param 值为空 * @return Connection 建立的数据库连接 */ private boolean getConn() { //Connection conn = null; try { Class.forName(JDBC_DRIVER); //classLoader,加载对应驱动 this.conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS); System.out.println("MySQL连接成功!"); } catch (ClassNotFoundException e) { System.out.println(e.getMessage()); return false; } catch (SQLException e) { System.out.println(e.getMessage()); return false; } return true; } public boolean disConn() { try { this.conn.close(); } catch (SQLException e) { System.out.println(e.getMessage()); return false; } return true; } /** * 向数据库中添加用户 * @param user,要添加的用户 * @return 返回值为空 */ public void addUser(User user){//添加用户 String sql = "insert into user (name,password) values(?,?)"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); pstmt.setString(1, user.getName()); pstmt.setString(2, user.getPwd()); //pstmt.setInt(2, user.getAge()); pstmt.setDate pstmt.executeUpdate(); pstmt.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } /** * 向数据库中查询所有用户 * @param 值为空 * @return 值为空 */ public ArrayList<User> queryUser( ){//查询用户 String sql = "select * from user"; PreparedStatement pstmt; ArrayList<User> uarray = new ArrayList<>(); try { pstmt = (PreparedStatement)conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery();//执行查询 int col = rs.getMetaData().getColumnCount();//获取字段数 //System.out.println("============================"); while (rs.next()) { String name = rs.getString(2); String pwd = rs.getString(3); User u = new User(name,pwd); uarray.add(u); //System.out.print(rs.getString(i) + "\t"); } //System.out.println("============================"); } catch (SQLException e) { System.out.println(e.getMessage()); } return uarray; } /** * 验证用户名是否存在 * @param name,用户名 * @return 布尔值 */ public boolean hasUser(String name){//查询某个用户是否存在 boolean success=false;//标记验证是否成功 try { String sql = "select * from user where name=? "; PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql); pstmt.setString(1, name); ResultSet rs = pstmt.executeQuery();//执行查询 if(rs.next()) { //System.out.println("欢迎" + rs.getString("name")); success=true; } pstmt.close(); }catch (SQLException e) { System.out.println(e.getMessage()); } return success; } /** * 验证用户名和密码是否正确 * @param usename,用户名 * @param password,密码 * @return 建立的数据库连接 */ public boolean verify(String username, String password) { boolean success=false; try { ResultSet rs = null; //建立一个空的结果集 //1.创建PreparedStatement 对象,让它与一条SQL模板绑定; String sql = "select * from user where name=? and password=?"; PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql); //使用2. setXXX()系列方法为sql命令设置值 pstmt.setString(1, username);// pstmt.setString(2, password); //setInt,setFloat //3.执行查询 rs = pstmt.executeQuery();// if(rs.next()) { success=true; } else { success=false; } pstmt.close(); }catch (SQLException e) { System.out.println(e.getMessage()); } return success; } public static void main(String[] args) throws Exception{ UserDaoSQL uds =new UserDaoSQL(); uds.verify("ma","123456"); User u1=new User("zhangwu","456");//这里可能会遇到构造方法参数不符的问题,重新修改一下构造方法 uds.addUser(u1); System.out.println(uds.hasUser(u1.getName())); uds.queryUser(); System.out.println("Goodbye!"); uds.conn.close(); } }
显示层
显示层 调用业务逻辑层的代码,完成查询
客户端
main/TestUser:
package main; import java.util.Scanner; import service.*; public class TestUser { public static void start(Scanner sc){ System.out.println("****************************"); System.out.println("*****欢迎登录商院面馆平台客户端****"); System.out.println("****************************"); System.out.println("账号:"); String uname = sc.nextLine(); System.out.println("密码:"); String pwd = sc.nextLine(); //System.out.println("用户名为:"+uname+",密码为:"+pwd); UserService us =new UserService(); us.login(uname,pwd);//向下调用业务逻辑层的代码 } public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); start(sc); } }
输出结果:
管理端
管理端显示层功能:
1. 添加用户
2. 展示所有用户
管理员先在这两个功能中选择其一,然后根据选择、调用业务逻辑层的不同方法,实现功能。