论坛登录模块
在持久层有两个DAO类,分别是UserDao和LoginLogDao,在业务层对应一个业务类UserService,在展现层拥有一个LoginController类和两个JSP页面,分别是登录页面login.jsp和登录成功页面main.jsp
DAO为数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。
下载jdk和maven,mysql并配置好环境变量
1.创建库表
(1)登录数据库
mysql -u root -p
设置密码格式为
set password for 用户名@localhost = password('新密码');
(2)创建实例对应的数据库
DROP DATABASE IF EXISTS sampledb;
CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;
USE sampledb;
默认字符集采用UTF-8
(3)创建实例所用的两张表
创建用户表
CREATE TABLE t_user(
user_id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30),
credits INT,
password VARCHAR(32),
last_visit datetime,
last_ip VARCHAR(23)
)ENGINE=InnoDB;
创建用于用户登录日志表
CREATE TABLE t_login_log(
login_log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
ip VARCHAR(23),
login_datetime datetime
)ENGINE=InnoDB;
InnoDB引擎支持事务
(4)初始化一条数据
INSERT INTO t_user (user_name,password) VALUES('admin','123456');
COMMIT;
也可以直接运行脚本文件sampledb.sql
2.在IDEA中创建一个项目
其中的pom.xml配置从下载的源码中直接使用
类包以分层的方式进行组织
3.持久层
领域对象(Domain Object)也称为实体类,它代表了业务的状态,且贯穿表现层,业务层和持久层,并最终被持久化到数据库中。
持久层的主要工作就是从数据库中加载数据并实例化领域对象,或者将领域对象持久化到数据库表中。
“持久层”,也就是在系统逻辑层面上,专著于实现数据持久化的一个相对独立的领域(Domain),是把数据保存到可掉电式存储设备中。持久层是负责向(或者从)一个或者多个数据存储器中存储(或者获取)数据的一组类和组件。
这个层必须包括一个业务领域实体的模型(即使只是一个元数据模型)。
用户领域对象
用户信息领域对象可以看成t_user表的对象映像,每个字段对应一个对象属性。
有3类信息:userName/password,积分(credits)和最后一次登录的信息(lastIp,lastVisit)
package com.smart.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private int userId;
private String userName;
private String password;
private int credits;
private String lastIp;
private Date lastVisit;
//省略get/set方法
}
登录日志领域对象
用户每次成功登录后都会记录一条登录日志
3类信息:用户ID,登录IP和登录时间。(一般情况下还需退出时间)
package com.smart.domain;
import java.io.Serializable;
import java.util.Date;
public class LoginLog implements Serializable {
private int loginLogId;
private int userId;
private String ip;
private Date loginDate;
//省略get/set方法
}
UserDao
包括三个方法:
①getMatchCount():
根据用户名和密码获取匹配的用户数。等于1表示用户名/密码正确,0则错误(这是最简单的用户身份认证方法,实际中还需很多安全策略)
②findUserByUserName:
根据用户名获取User对象
③updateLoginInfo():
更新用户积分,最后登录IP及最后登录时间
package com.smart.dao;
import com.smart.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;
import sun.security.krb5.internal.PAData;
import java.sql.ResultSet;
import java.sql.SQLException;
@Repository //通过Spring注解一个DAO
public class UserDao {
private JdbcTemplate jdbcTemplate; //数据库相关操作
private final static String MATCH_COUNT_SQL = " SELECT count(*) FROM t_user " +
" WHERE user_name =? and password=? ";
private final static String UPDATE_LOGIN_INFO_SQL = " UPDATE t_user SET " +
" last_visit=?,last_ip=?,credits=? WHERE user_id =?";
@Autowired //自动注入JdbcTemplate的Bean,@Autowired是一种函数,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
//返回1表示表示用户名/密码正确,0则错误
public int getMatchCount(String userName, String password) {
//第一个参数是传入的mysql语句,第二个是参入的参数,第三个参数指定需要返回什么类型
return jdbcTemplate.queryForObject(MATCH_COUNT_SQL, new Object[]{userName, password}, Integer.class);
}
public User findUserByUserName(final String userName){