三层架构
用三层架构做一个登录,注册
项目环境:
Java+eclipse+MySQL+Navicat/sqlyog
三层思想分析:
步骤:
1:创建项目,建立层次
edu.eurasia.app 存放主方法(即程序入口)
edu.eurasia.dao dao层
edu.eurasia.service service层
edu.eurasia.domain JavaBean层(实体类层)
edu.eurasia.utils 工具类层
edu.eurasia.view 存放实现抽象页面
edu.eurasia.abview 存放抽象页面
2:创建数据库、表、插入测试数据
3:导入JDBC相关的jar包和工具类
连接数据库
4:在edu.eurasia.domain下创建相关实体类
实体类的书写规范:
a)该类有私有属性(属性名 要和 数据库 表中的列名 要一样)
b)该类具备无参构造
c)该类提供 set get方法
User类代码:
/*
* 实体类
* javabean类
*/
public class User {
private int uid;
private String uname;
private String pwd;
public User() {
super();
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + "]";
}
}
5:将做好的抽象GUI页面类,存放到抽象页面层edu.eurasia.abview
AbstractRegDialog类:
public abstract class AbstractRegDialog extends JDialog {
public JLabel registLabel1 = new JLabel("用户注册"); // 注册标签1
public JLabel userNameLabel = new JLabel("用户名"); // 用户名标签
public JTextField userNameField = new JTextField(); // 用户名文本框
public JLabel passwordLabel = new JLabel("密码"); // 密码标签
public JPasswordField passwordField = new JPasswordField(); // 密码文本框
public JLabel rePasswordLabel = new JLabel("重复密码"); // 重复密码标签
public JPasswordField rePasswordField = new JPasswordField(); // 重复密码文本框
public JLabel verifyCodeLabel = new JLabel("验证码"); // 验证码标签
public JTextField verifyCodeField = new JTextField(); // 验证码标签
public JLabel verifyCodeLabel2 = new JLabel(); // 显示验证码标签
public JButton registBtn = new JButton("注\t册");// 注册按钮
public JButton resetBtn = new JButton("重\t置");// 重置按钮
public AbstractRegDialog(Frame owner) {
init(); // 初始化窗口
addComponent(); // 添加组件
addlistener(); // 事件加载
}
public AbstractRegDialog() {
init(); // 初始化窗口
addComponent(); // 添加组件
addlistener(); // 事件加载
}
// 初始化窗口
private void init() {
setTitle("注册");
setSize(600, 360);
// 去除布局
setLayout(null);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setVisible(true);
}
private void addComponent() {
// 添加注册标题
registLabel1.setFont(new Font("楷体", Font.BOLD, 20));
registLabel1.setBounds(220, 20, 100, 30);
this.add(registLabel1);
// 用户名文本框
userNameLabel.setBounds(100, 80, 60, 25);
userNameField.setBounds(160, 80, 120, 25);
this.add(userNameLabel);
this.add(userNameField);
// 密码文本框
passwordLabel.setBounds(100, 110, 60, 25);
passwordField.setBounds(160, 110, 120, 25);
this.add(passwordLabel);
this.add(passwordField);
// 密码文本框
rePasswordLabel.setBounds(290, 110, 60, 25);
rePasswordField.setBounds(350, 110, 120, 25);
this.add(rePasswordLabel);
this.add(rePasswordField);
// 验证码
verifyCodeLabel.setBounds(100, 140, 60, 25);
verifyCodeField.setBounds(160, 140, 120, 25);
verifyCodeLabel2.setBounds(290, 140, 60, 25);
verifyCodeLabel2.setBackground(new Color(255, 255, 255));
verifyCodeLabel2.setOpaque(true); //设置组件JLabel不透明,只有设置为不透明,设置背景色才有效
verifyCodeLabel2.setText(" 1111");
this.add(verifyCodeLabel);
this.add(verifyCodeField);
this.add(verifyCodeLabel2);
// 注册按钮
registBtn.setBounds(160, 240, 80, 25);
this.add(registBtn);
// 重置按钮
resetBtn.setBounds(260, 240, 80, 25);
this.add(resetBtn);
}
// 添加监听器(事件加载)
public void addlistener() {
// 表单重置
resetBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
userNameField.setText("");
passwordField.setText("");
rePasswordField.setText("");
verifyCodeField.setText("");
userNameField.requestFocus();
}
});
registBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取用户输入的注册信息
String userName = userNameField.getText();
char[] passwordArray = passwordField.getPassword();
String password = new String(passwordArray);
char[] repasswordArray = rePasswordField.getPassword();
String rePassword = new String(repasswordArray);
String verifyCode = verifyCodeField.getText();
// 使用用户输入的注册信息调用regist方法完成注册
try {
regist(userName, password, rePassword, verifyCode);
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
// 注册方法
public abstract void regist(String userName, String password, String rePassword, String verifyCode) throws Exception ;
}
AbstractRLFrame类:
public abstract class AbstractRLFrame extends JFrame {
public AbstractRLFrame() {
this("登录注册");
}
public AbstractRLFrame(String title) {
super(title);
init();
addPanel();
addButton();
addListener();
}
private void addListener() {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
register();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
login();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
}
private void init() {
this.setSize(600, 400);
this.setLocation(300, 100);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.setVisible(true);
}
JButton button = new JButton("注册");
JButton button2 = new JButton("登录");
private void addButton() {
button.setBounds(100, 250, 100, 50);
button2.setBounds(350, 250, 100, 50);
this.add(button);
this.add(button2);
}
public JLabel registLabel1 = new JLabel(); // 欢迎标签1
JPanel jPanel = new JPanel();
JLabel jLabel = new JLabel();
JLabel jLabel2 = new JLabel();
protected TextField tf = new TextField();
protected TextField tf2 = new TextField();
private void addPanel() {
jPanel.setLayout(null);
jPanel.setBackground(new Color(0x808000));
jPanel.setBounds(0, 0, 600, 200);
this.add(jPanel);
jLabel.setText("用户名:");
jLabel.setBounds(100, 100, 50, 30);
jPanel.add(jLabel);
tf.setBounds(200, 100, 200, 30);
tf.setFont(new Font("宋体", Font.BOLD, 20));
jPanel.add(tf);
jLabel2.setText("密码:");
jLabel2.setBounds(100, 150, 50, 30);
jPanel.add(jLabel2);
tf2.setBounds(200, 150, 200, 30);
tf2.setFont(new Font("宋体", Font.BOLD, 20));
jPanel.add(tf2);
// 添加注册标题
registLabel1.setText("登录注册");
registLabel1.setFont(new Font("楷体", Font.BOLD, 20));
registLabel1.setBounds(220, 20, 100, 30);
jPanel.add(registLabel1);
}
public abstract void login() throws SQLException;
public abstract void register() throws SQLException;
}
6:创建程序入口MainApp.java在edu.eurasia.app层里
在这个类里写主方法(只有一个主方法)
/*
* 程序入口
*/
public class MainApp {
public static void main(String[] args) {
//创建主页面对象
RLFrame rf = new RLFrame();
//设置显示可见
rf.setVisible(true);
}
}
7:创建实现抽象GUI类的RLFrame.java和RegDialog.java
RegDialog类
/*
* 注册页面
*/
public class RegDialog extends AbstractRegDialog{
/*
*注册完成 提交 操作
*/
@Override
public void regist(String userName, String password, String rePassword, String verifyCode) throws Exception {
System.out.println("提交注册操作");
/*
* 验证 码 不管了 没有用到
*
* 验证 密码两次是否一致
*/
if(!password.equals(rePassword)){
JOptionPane.showMessageDialog(this, "两次密码不一致");
return;
}
//验证用户名是否存在
//依赖于 service层
UserService userService = new UserService();
boolean b = userService.isHave(userName);
if(b){
//说明用户存在
JOptionPane.showMessageDialog(this, "用户已经存在");
return;
}
//完成注册
userService.addUser(userName, password);
JOptionPane.showMessageDialog(this, "注册成功");
}
}
RLFrame类
/*
* 登录注册主页面
*/
public class RLFrame extends AbstractRLFrame{
/*
* 登录功能
* 1:获取页面上
* 用户名和密码的两个文本框
* tf 变量 代表 用户名框
* tf2变量 代表 密码框
*
*
* 2:检查 文本框中的用户名或密码是不是空格
*
* 3:需要查询数据库 进行校验
* 如果 用户名密码匹配成功 登录成功
* 否则登录失败
*/
@Override
public void login() throws SQLException {
System.out.println("登录");
//1:获取页面上的用户名和密码 两个文本框中的内容
String username = tf.getText();//获取用户名 文本框中内容
String password = tf2.getText();//获取密码 文本框中的容
//2:校验用户名 或密码 是不是 空
if(username.trim().equals("")||password.trim().equals("")){
//给个友情提示
//完成弹框
JOptionPane.showMessageDialog(this, "用户名或密码不能为空!!");
return;
}
//3:需要查询数据库 进行校验
/*
* 校验 操作 交给 service去完成
*
*/
//需要创建Service对象
UserService userService = new UserService();
boolean login = userService.login(username, password);
if(login){
JOptionPane.showMessageDialog(this, "登录成功~");
}else{
JOptionPane.showMessageDialog(this, "用户名或密码不正确,登录失败");
}
}
/*
* 注册功能
*/
@Override
public void register() throws SQLException {
System.out.println("注册");
/*
* 弹出注册页面
*/
RegDialog rd = new RegDialog();
rd.setVisible(true);
}
}
8:在edu.eurasia.service层,存放UserService
edu.eurasia.dao层,存放UserDao
UserService类:
/*
* 提取Service 层(服务层)
*
* a 创建一个service包
* b 创建一个XxxService类 Xxx代表我们将要操作的那个类 对象
* 就是给用户 提供服务的
* 这里类中包含了 对所有 User以及user表 他们所有的业务处理
* 一些校验等等
* c 在Service层中 完成业务代码编写
*
*/
public class UserService {
//成员位置创建dao对象 这样所有方法都可以使用
UserDao userDao = new UserDao();
/*
* 因为web层 要将 登录校验的功能 交给service层处理
* 那么 这里需要提供一个功能
* 完成 登录校验操作
*
* 返回值 : boolean 是否校验成功
* 参数列表:要两个参数 获取到的用户名和密码
*/
public boolean login(String uname,String pwd) throws SQLException{
/*
* 校验 uname pwd
* 根据用户名 和密码 去数据库中查询
* 返回的对象 不是null说明 登录成
* 如果返回的对象是null说明用户名或密码错误
*/
//写查询数据库代码 分层思想中 查询数据库代码要提取出去 提取到dao层
//依赖 dao层
User user = userDao.getUser(uname, pwd);
/*
* 检测 用户是否为空 是空的话 没有登录成
*/
if(user==null){
return false;
}else{
return true;
}
}
/*
* 判断用户是否存在
*/
public boolean isHave(String uname) throws SQLException{
/*
* 校验uname用户名是否存储在
* 根据用户名 去数据库中查找
* dao已经完成了 该功能
* 返回的对象 是null说明已经存在
* 不是null说明用户名不存在
*/
//需要dao 所以 创建dao对象
User user = userDao.getUserByName(uname);
if(user==null){//用户不存在
return false;
}else{ //用户存在
return true;
}
}
/*
* 添加用户功能
*/
public void addUser(String uname,String pwd) throws SQLException{
//这个事情交给userdao做了
userDao.addUser(uname, pwd);
}
}
UserDao类:
/*
* 提取 dao层(数据访问层)
*
* a 创建一个包 dao包
* b 创建XxxDao Xxx代表操作的那个类 也就是跟表对应的实体
* 这个类中包含了所有 关于 该表的数据库的访问
* c 提供数据库访问代码
*/
public class UserDao {
//在成员位置 创建QueryRunner对象 所有方法都可以使用
QueryRunner qr = new QueryRunner(JDBCUtils.getDS());
/*
* 根据 用户名和密码 去数据库中查询 用户信息
*
* 返回值 是一个User对象
* 参数 用户名和密码
*/
public User getUser(String uname,String pwd) throws SQLException{
//2:写sql
String sql = "select * from users where uname = ? and pwd = ?";
Object[] params = {uname,pwd};
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
return user;
}
/*
* 根据用户名 查询 该用户
*
*/
public User getUserByName(String uname) throws SQLException{
//2写sql
String sql = "select * from users where uname = ?";
Object[] params = {uname};
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
return user;
}
/*
* 完成用户的添加
*/
public void addUser(String uname,String pwd) throws SQLException{
String sql = "insert into users values(?,?,?)";
Object[] params = {null,uname,pwd};
qr.update(sql, params);
}
}
以上就是登录和注册的全过程
但在一些大项目里,一般会将项目分为以下几层:
但最核心的还是三层架构