查看“Java架构设计之用户口”的源代码
←
Java架构设计之用户口
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==任务描述== 1.创建用户操作的业务逻辑层 *用户注册 *用户登陆验证 *展示所有用户 2. 对用户操作的数据访问层做必要改动 3. 编写表示层的代码 ==实训原理== [[文件:java2020-12-3.png|500px]] ===表示层=== 表示层又称表现层UI,位于三层构架的最上层,与用户直接接触,主要是B/S信息系统中的Web浏览页面。作为Web浏览页面,表示层的主要功能是实现系统数据的传入与输出,在此过程中不需要借助逻辑判断操作就可以将数据传送到BLL系统中进行数据处理,处理后会将处理结果反馈到表示层中。换句话说,表示层就是实现用户界面功能,将用户的需求传达和反馈,并用BLL或者是Models进行调试,保证用户体验。 ===业务逻辑层=== 业务逻辑层BLL的功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,会连接数据访问层DAL,访问层在三层构架中位于表示层与数据层中间位置,同时也是表示层与数据层的桥梁,实现三层之间的数据连接和指令传达,可以对接收数据进行逻辑处理,实现数据的修改、获取、删除等功能,并将处理结果反馈到表示层UI中,实现软件功能。 ===数据访问层=== 数据访问层DAL是数据库的主要操控系统,实现数据的增加、删除、修改、查询等操作,并将操作结果反馈到业务逻辑层BLL。在实际运行的过程中,数据访问层没有逻辑判断能力,为了实现代码编写的严谨性,提高代码阅读程度,一般软件开发人员会在该层中编写DataAccessCommon,保证数据访问层DAL数据处理功能。 ==任务准备== ===加载指定数据库的驱动程序=== Java 连接 MySQL 需要驱动包,最新版下载地址为:http://dev.mysql.com/downloads/connector/j/,解压后得到jar库文件,然后在对应的项目中导入该库文件。 你可以从群邮件里下载MySQL驱动 jar 包:mysql-connector-java-5.1.39-bin.jar ===导入数据库驱动程序=== 具体参见 [[Eclipse导入数据库驱动程序]] ===创建测试数据=== 接下来我们在 MySQL 中创建 cloud 数据库,并创建 user 数据表,表结构如下: <nowiki>mysql> create database cloud; Query OK, 1 row affected (0.00 sec) mysql> use cloud; Database changed mysql> CREATE TABLE IF NOT EXISTS `user`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, `password` VARCHAR(40) NOT NULL, PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE UNIQUE INDEX uname on user(name); Query OK, 0 rows affected (0.25 sec) Records: 0 Duplicates: 0 Warnings: 0 </nowiki> 插入一些数据: <nowiki>mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123456'); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO `user` (name,password) VALUES ('ma', '123457'); ERROR 1062 (23000): Duplicate entry 'ma' for key 2</nowiki> </nowiki> ===建立数据连接类MyCon=== <nowiki> package dao; import java.sql.*; public class MyCon { public static Connection conn = null; /** * 连接数据库 * @param 值为空 * @return Connection 建立的数据库连接 */ public static boolean getConn() { // JDBC 驱动名及数据库 URL final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; final String DB_URL = "jdbc:mysql://10.0.0.30:3306/cloud?characterEncoding=utf8"; final String USER = "root"; final String PASS = "000000"; try { Class.forName(JDBC_DRIVER); //classLoader,加载对应驱动 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 static boolean disConn() { try { conn.close(); System.out.println("MySQL关闭成功!"); } catch (SQLException e) { System.out.println(e.getMessage()); return false; } return true; } public static void main(String[] args) { // TODO Auto-generated method stub getConn(); disConn(); } } </nowiki> 运行一下,看看能否连接数据库 ? ==数据访问层== ===UserDao接口=== 本接口改动不大,主要是queryUser( )返回值变成了ArrayList<User>类型。 变动的原因是 现在软件分层了,数据库查询到的数据不宜直接在dao层打印了,通过arraylist传出去 <nowiki> package dao; import java.util.ArrayList; import entity.User; public interface UserDao { public boolean addUser(User u);//添加用户 public ArrayList<User> queryUser( );//查询用户,这里返回值改为了ArrayList<User> public int hasUser(String name);//查询某个用户是否存在,返回uid public boolean verify(String name, String pwd);//验证用户名和密码是否一致 } </nowiki> ===UserDaoSQL实现类=== ====建立UserDaoSQL类==== <nowiki> package dao; import java.sql.*; import java.util.ArrayList; import java.util.Scanner; import entity.User; public class UserDaoSQL implements UserDao{ Connection conn; public UserDaoSQL(){ conn = MyCon.conn;//建立数据连接; } public static void main(String[] args) throws Exception{ } } </nowiki> ====添加用户方法addUser==== <nowiki> /** * 向数据库中添加用户 * @param user,要添加的用户 * @return 返回值为空 */ public boolean 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 int i = pstmt.executeUpdate(); pstmt.close(); if(i!=0){ return true; //System.out.println(g.getName()+"插入成功!"); } } catch (SQLException e) { System.out.println(e.getMessage()); } return false; }</nowiki> ====查询某用户是否存在hasUser()==== <nowiki> /** * 验证用户名是否存在 * @param name,用户名 * @return 布尔值 */ public int hasUser(String name){//查询某个用户是否存在 int id = 0;//标记验证是否成功 try { String sql = "select id 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")); id=rs.getInt("id"); } pstmt.close(); }catch (SQLException e) { System.out.println(e.getMessage()); } return id; }</nowiki> ====查询所有用户queryUser==== <nowiki> /** * 向数据库中查询所有用户 * @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()) { int id =rs.getInt(1); String name = rs.getString(2); String pwd = rs.getString(3); User u = new User(id,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; }</nowiki> ====验证用户名和密码是否正确verify==== <nowiki> /** * 验证用户名和密码是否正确 * @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; } </nowiki> ====测试代码==== <nowiki> public static void main(String[] args) throws Exception{ MyCon.getConn();//建立数据库连接 UserDaoSQL uds =new UserDaoSQL(); Scanner sc = new Scanner(System.in); /* 用户登录操作 */ boolean success; String name,pwd; do { System.out.println("请输入用户名:");//"ma","123456" name =sc.next(); System.out.println("请输入密码:"); pwd = sc.next(); success=uds.verify(name, pwd); if(success) { System.out.println("登录成功!"); }else { System.out.println("登录失败!"); } }while(success!=true); /* 添加新用户 */ int id =0; do { System.out.println("新用户注册:"); System.out.println("请输入新用户名:"); name =sc.next(); System.out.println("请输入新密码:"); pwd = sc.next(); id=uds.hasUser(name); System.out.println("该用户的id号为:"+id); if(id!=0) {System.out.println("已存在,请另寻新名");} }while(id!=0);//验证此用户名是否存在,否则,重复输入 User u1=new User(name,pwd); if(uds.addUser(u1)==true) { System.out.println("注册成功!"); }else { System.out.println("注册失败!"); } /*查询 所有用户 */ System.out.println("现有全部用户"); System.out.println(uds.queryUser()); /*关闭连接 */ sc.close(); MyCon.disConn(); }</nowiki> ==业务逻辑层== [[文件:java2020-12-1.png|500px]] ===创建服务类UserService=== <nowiki>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(); } }</nowiki> ===添加用户addUser()=== <nowiki> public String addUser(User user){ String message = ""; boolean success = userset.addUser(user); if(success == true) { message =("用户 "+user.getName() +" 注册成功"); }else { message =("用户 "+user.getName() +" 注册失败"); } return message; }</nowiki> ===查询函数queryUser( )=== <nowiki> /* * 查询仓库中的用户 */ public ArrayList<User> queryUser( ){ ArrayList<User> users =userset.queryUser(); //测试代码 /* System.out.println("本店现有如下用户:"); for(User user:users){ System.out.println(user); } */ return users; }</nowiki> ===验证函数login()=== <nowiki> public String [] login(String name, String pwd) {//返回:1. uid,2.登录信息 String[] info = new String[2]; int id = userset.hasUser(name); info[0]= Integer.toString(id);info[1]="";//info0:uid号;info1:提示信息 if(id == 0){ //throw new UserException("用户 "+name+":该用户不存在"); info[1] = ("用户 "+name+":该用户不存在"); }else if(!userset.verify(name, pwd)){ //throw new UserException("用户 "+name+":用户名或密码错误"); info[1] = ("用户 "+name+":用户名或密码错误"); }else { info[1] = ("用户 "+name+" 登陆成功!"); } return info; } </nowiki> ===main方法中测试=== <nowiki> public static void main(String[] args) { MyCon.getConn();//建立数据库连接 UserService us =new UserService(); Scanner sc = new Scanner(System.in); /* 用户登录操作 */ String name,pwd; System.out.println("请输入用户名:");//"ma","123456" name =sc.next(); System.out.println("请输入密码:"); pwd = sc.next(); String[] info = us.login(name,pwd); System.out.println("该用户的id号为"+info[0]); System.out.println(info[1]); /* 添加新用户 */ System.out.println("新用户注册:"); System.out.println("请输入新用户名:"); name =sc.next(); System.out.println("请输入新密码:"); pwd = sc.next(); User u1=new User(name,pwd); System.out.println(us.addUser(u1)); /*查询 所有用户 */ System.out.println("现有全部用户"); System.out.println(us.queryUser()); /* User u1=new User("zhangliu","456"); System.out.println(us.addUser(u1)); System.out.println(us.queryUser( )); System.out.println(us.login("zhangliu","123")); */ /*关闭连接 */ MyCon.disConn(); }</nowiki> ===完整代码=== <nowiki> package service; import java.util.ArrayList; import java.util.Scanner; import dao.*; import entity.*; //import exception.UserException; public class UserService { /** * 用户集类(用于存储用户 */ private UserDao userset = null; public UserService() { userset = new UserDaoSQL(); } public String addUser(User user){ String message = ""; boolean success = userset.addUser(user); if(success == true) { message =("用户 "+user.getName() +" 注册成功"); }else { message =("用户 "+user.getName() +" 注册失败"); } return message; } public String [] login(String name, String pwd) {//返回:1. uid,2.登录信息 String[] info = new String[2]; int id = userset.hasUser(name); info[0]= Integer.toString(id);info[1]="";//info0:uid号;info1:提示信息 if(id == 0){ //throw new UserException("用户 "+name+":该用户不存在"); info[1] = ("用户 "+name+":该用户不存在"); }else if(!userset.verify(name, pwd)){ //throw new UserException("用户 "+name+":用户名或密码错误"); info[1] = ("用户 "+name+":用户名或密码错误"); } info[1] = ("用户 "+name+" 登陆成功!"); return info; } /* * 查询仓库中的用户 */ public ArrayList<User> queryUser( ){ ArrayList<User> users =userset.queryUser(); //测试代码 /* System.out.println("本店现有如下用户:"); for(User user:users){ System.out.println(user); } */ return users; } public static void main(String[] args) { MyCon.getConn();//建立数据库连接 UserService us =new UserService(); Scanner sc = new Scanner(System.in); /* 用户登录操作 */ String name,pwd; System.out.println("请输入用户名:");//"ma","123456" name =sc.next(); System.out.println("请输入密码:"); pwd = sc.next(); String[] info = us.login(name,pwd); System.out.println("该用户的id号为"+info[0]); System.out.println(info[1]); /* 添加新用户 */ System.out.println("新用户注册:"); System.out.println("请输入新用户名:"); name =sc.next(); System.out.println("请输入新密码:"); pwd = sc.next(); User u1=new User(name,pwd); System.out.println(us.addUser(u1)); /*查询 所有用户 */ System.out.println("现有全部用户"); System.out.println(us.queryUser()); /* User u1=new User("zhangliu","456"); System.out.println(us.addUser(u1)); System.out.println(us.queryUser( )); System.out.println(us.login("zhangliu","123")); */ /*关闭连接 */ MyCon.disConn(); } }</nowiki> ==显示层== 显示层 调用业务逻辑层的代码,完成查询 [[文件:java2020-12-4.png]] ===客户端=== main/TestUser: <nowiki> package main; import java.util.Scanner; import dao.MyCon; 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(); String info[]= us.login(uname,pwd); int uid = Integer.valueOf(info[0]); System.out.println("用户ID:"+uid+" 登录信息:"+info[1]);//打印登录信息 } public static void main(String[] args) throws Exception{ MyCon.getConn();//建立数据库连接 Scanner sc = new Scanner(System.in); start(sc); MyCon.disConn();//关闭数据库连接 } } </nowiki> 输出结果: [[文件:java2020-12-5.png]] ===管理端=== 管理端显示层功能: 1. 添加用户 2. 展示所有用户 管理员先在这两个功能中选择其一,然后根据选择、调用业务逻辑层的不同方法,实现功能。
返回至
Java架构设计之用户口
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息