实现步骤
demo目录
初始化MySQL数据库 建立库表并初始化数据
创建用户表
CREATE TABLE `t_user` (
`user_id` bigint(22) NOT NULL COMMENT '用户主键',
`user_name` varchar(30) DEFAULT NULL COMMENT '用户名称',
`credits` int(11) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`last_visit` datetime DEFAULT NULL,
`last_ip` varchar(23) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
登录记录表
CREATE TABLE `t_login_log` (
`login_log_id` bigint(22) NOT NULL COMMENT '日志主键',
`user_id` bigint(22) DEFAULT NULL COMMENT '用户主键',
`ip` varchar(23) DEFAULT NULL,
`login_datetime` datetime DEFAULT NULL,
PRIMARY KEY (`login_log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
初始化数据
insert into t_user (user_name,password) values("amdin","123456");
编码domain、dao、service包下class
package com.baobaotao.domain;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
*用户领域对象
*/
@Getter
@Setter
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private Long userId;
private String userName;
private String password;
private int credits;
private String lastIp;
private Date lastVisit;
}
package com.baobaotao.domain;
import java.io.Serializable;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;
/**
*登录日志领域对象
*/
@Getter
@Setter
public class LoginLog implements Serializable{
private static final long serialVersionUID = 1L;
private Long loginLogId;
private Long userId;
private String ip;
private Date loginDate;
}
package com.baobaotao.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
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 com.baobaotao.domain.User;
/**
*用户信息操作
*/
@Repository//通过Spring注解定义一个Dao
public class UserDao {
@Autowired//自动注入jdbcTemplate的Bean
private JdbcTemplate jdbcTemplate;
public int getMatchCount(String userName, String password) {
String sqlStr = "SELECT COUNT(*) FROM t_user WHERE user_name=? AND PASSWORD=?";
return jdbcTemplate.queryForObject(sqlStr, new Object[] {userName,password}, Integer.class);
}
public User findUserByUserName(final String userName) {
String sqlStr = "SELECT user_id,user_name,credits FROM t_user WHERE user_name=?";
final User user = new User();
jdbcTemplate.query(sqlStr, new Object[] { userName }, new RowCallbackHandler(){
public void processRow(ResultSet rs) throws SQLException {
user.setUserId(rs.getLong("user_id"));
user.setUserName(userName);
user.setCredits(rs.getInt("credits"));
}
});
return user;
}
public void updateLoginInfo(User user) {
String sqlStr = "UPDATE t_user SET last_visit=?,last_ip=?,credits=? WHERE user_id=?";
jdbcTemplate.update(sqlStr, new Object[] {
user.getLastVisit(), user.getLastIp(), user.getCredits(), user.getUserId()
});
}
}
package com.baobaotao.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.baobaotao.domain.LoginLog;
/**
*用户信息操作
*/
@Repository
public class LoginLogDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insertLoginLog(LoginLog loginLog) {
String sqlStr = "INSERT INTO t_login_log(login_log_id,user_id,ip,login_datetime) VALUES (?,?,?,?)";
Object[] args = { loginLog.getLoginLogId(), loginLog.getUserId(), loginLog.getIp(), loginLog.getLoginDate()};
jdbcTemplate.update(sqlStr, args);
}
}
package com.baobaotao.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baobaotao.dao.LoginLogDao;
import com.baobaotao.dao.UserDao;
import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
@Service //将UserService标注为一个服务层的Bean
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private LoginLogDao loginLogDao;
public boolean hasMatchUser(String userName, String password) {
int matchCount = userDao.getMatchCount(userName, password);
return matchCount > 0;
}
public User findUserByUserName(String userName) {
return userDao.findUserByUserName(userName);
}
public void loginSuccess(User user) {
user.setCredits(5 + user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setLoginLogId(8L);
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
}
applicationContext.xml 配置(配置数据源、注册Bean、事务控制)
单元测试 测试业务层逻辑
package com.baobaotao.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baobaotao.domain.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"/applicationContext.xml"})
public class TestUserService {
@Autowired
private UserService userService;
@Test
public void hasMatchUser() {
boolean b1 = userService.hasMatchUser("admin", "123456");
boolean b2 = userService.hasMatchUser("admin", "111111");
System.err.println("==================" + b1 + " & "+ b2);
assertTrue(b1);
assertTrue(b2);
}
@Test
public void findUserByUserName() {
User user = userService.findUserByUserName("admin");
System.err.println(user);
userService.loginSuccess(user);
assertEquals(user.getUserName(), "admin");
}
}
POJO 控制层业务编码
package com.baobaotao.web;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LoginCommand {
private String userName;
private String password;
}
package com.baobaotao.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.baobaotao.domain.User;
import com.baobaotao.service.UserService;
//@1 表主成为一个Spring MVC的Controller
@Controller
public class LoginController {
@Autowired
private UserService userService;
//@2 负责处理/index.html的请求
@RequestMapping(value="/index.html")
public String loginPage() {
return "login";
}
//@3 负责处理/loginCheck.html
@RequestMapping(value="/loginCheck.html")
public ModelAndView loginCheck(HttpServletRequest request, LoginCommand loginCommand) {
boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(), loginCommand.getPassword());
if(!isValidUser) {
return new ModelAndView("login","error","用户名或密码错吗");
}else {
User user = userService.findUserByUserName(loginCommand.getUserName());
user.setLastIp(request.getRemoteAddr());
user.setLastVisit(new Date());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);
return new ModelAndView("main");
}
}
}
web.xml 配置(初始化applicationContext.xml、监听请求、处理MVC url)
chapter
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
baobaotao
org.springframework.web.servlet.DispatcherServlet
2
baobaotao
*.html
页面
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix='c' %>
宝宝淘论坛登录
" method="post">
用户名:
密 码:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix='c' %>
宝宝淘论坛登录
${user.userName },欢迎您进入宝宝淘论坛,您当前积分为${user.credits };