说明:这次要在之前的基础上加上对数据库的操作,之前只是模拟登陆过程,将用户名和密码都写死了,这次要在数据库中去查询得到。特别提出:本文的所有内容,都是在模仿陈雄华的《Spring 3.0 就是这么简单》,我在看这本书的时候,发现还有很多完全不懂的地方,因此就有了写本系列博客的想法。TO:陈雄华,请见谅我有很多内容点都是参照你的。
一、创建库表
我用的是Mysql 5.6数据库,新建一个数据库,并且见一个t_user表,5个字段,id,用户名,密码,上一次登陆时间,上一次登陆IP。(后面两个字段目前还用不上)。脚本如下:
DROP DATABASE IF EXISTS SSH;
CREATE DATABASE SSH DEFAULT CHARACTER SET utf8;
USE SSH ;
##创建用户表
CREATE TABLE t_user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30),
password VARCHAR(32),
last_visit datetime,
last_ip VARCHAR(23)
)ENGINE=InnoDB;
##插入初始化数据
INSERT INTO t_user (user_name,password) VALUES('admin','123456');
COMMIT;
我把这个脚本文件放到web的sql文件夹下。
二、设计类包
1、类包暂定为4个,分别为dao,domain,service,web。dao包下面包含UserDao.java类,domain包下面包含User.java类,service包下面包含UserService.java类,web层下除了上一次加的LoginController.java外,本次准备再添加一个LoginCommand.java的类。如下所示:
2、由于需要使用到数据库查询,这里采用Spring的JdbcTemlate来实现,因此需要配置数据源和JdbcTemlate并注入,在applicationContext.xml加入两段内容。同时启用Spring针对bean的注解配置,完成类自动转化Bean,同时完成Bean的注入。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:component-scan base-package="com.hzb.dao"/>
<context:component-scan base-package="com.hzb.service"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/SSH"
p:username="root"
p:password="ROOT"/>
<!-- 配置Jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />
</beans>
package com.hzb.domain;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2014-4-29
* Time: 23:17:27
* To change this template use File | Settings | File Templates.
*/
public class User {
private int userId;
private String userName;
private String password;
private String lastIp;
private Date lastVisit;
public String getLastIp() {
return lastIp;
}
public void setLastIp(String lastIp) {
this.lastIp = lastIp;
}
public Date getLastVisit() {
return lastVisit;
}
public void setLastVisit(Date lastVisit) {
this.lastVisit = lastVisit;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
4、dao包类内容,UserDao.java类内容如下。
package com.hzb.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
//使用 @Repository 定义一个dao的bean
public class UserDao {
@Autowired
//使用 @Autowired 将Spring容器中的bean JdbcTemplate注入进来
private JdbcTemplate jdbcTemplate;
//通过用户名和密码查询用户的个数
public int getMatchCount(String userName, String password) {
String sqlStr = " SELECT count(*) FROM t_user "
+ " WHERE user_name =? and password=? ";
return jdbcTemplate.queryForInt(sqlStr, new Object[]{userName, password});
}
}
package com.hzb.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hzb.dao.UserDao;
@Service
//使用 @Service 注解将 UserService 标注成为一个服务层的类
public class UserService {
@Autowired
//注入UserDao
private UserDao userDao;
//查询匹配的用户
public boolean hasMatchUser(String userName, String password) {
int matchCount = userDao.getMatchCount(userName, password);
return matchCount > 0;
}
}
package com.hzb.web;
public class LoginCommand {
private String userName;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.hzb.web;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.beans.factory.annotation.Autowired;
import com.hzb.domain.User;
import com.hzb.service.UserService;
import java.util.Date;
@Controller
//① 标注成为一个SpringMVC的Controller
@RequestMapping(value = "/admin")
public class LoginController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login.html")
//② 负责处理 /admin/login.html 的请求(需要加上类的映射请求路径),与index.jsp中的跳转目标保持一致
public String loginPage() {
return "login";
}
@RequestMapping(value = "/loginCheck.html")
//② 负责处理 /admin/loginCheck.html 的请求 ,与login.jsp页面form表单的action保持一致
/* public ModelAndView loginCheck(HttpServletRequest request,HttpServletRequest response) {
if ("admin".equals(request.getParameter("userName")) && "123456".equals(request.getParameter("password"))) {
return new ModelAndView("main");
} else {
return new ModelAndView("login").addObject("error", "error").addObject("errorMsg", "用户名或密码错误");
}
}*/
public ModelAndView loginCheck(HttpServletRequest request, LoginCommand loginCommand) {
boolean isValidUser =
userService.hasMatchUser(loginCommand.getUserName(),
loginCommand.getPassword());
if (!isValidUser) {
return new ModelAndView("login", "error", "用户名或密码错误。");
} else {
return new ModelAndView("main");
}
}
}
三、登陆测试
1、现在启动tmcat服务,根据在第一步中向t_user表中插入的用户的用户名和密码,可以正常登陆。
2、到此步为止,整个项目的程序包见:http://download.csdn.net/detail/przzl/7273513。
为了节省空间,我将lib文件夹中的jar包单独出来了,下载地址见:http://download.csdn.net/detail/przzl/7273519