本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3824294.html的Demo程序的基础上增加数据持久层和业务层,实现登录验证功能。

1、修改gradle文件,增加依赖包,代码如下:

apply plugin: 'idea'
apply plugin: 'java' repositories {
mavenCentral()
maven { url "http://repo.spring.io/release" }
} dependencies {
compile(
"org.springframework:spring-context:4.0.5.RELEASE",
"org.springframework:spring-web:4.0.5.RELEASE",
"org.springframework:spring-webmvc:4.0.5.RELEASE",
"org.springframework:spring-context-support:4.0.5.RELEASE",
"org.apache.velocity:velocity:1.7",
"org.apache.velocity:velocity-tools:2.0",
"org.anarres.gradle:gradle-velocity-plugin:1.0.0",
"org.springframework:spring-jdbc:4.0.5.RELEASE",
"commons-dbcp:commons-dbcp:1.4",
"org.springframework:spring-test:4.0.5.RELEASE",
"org.testng:testng:6.8.8"
)
testCompile("org.springframework:spring-test:4.0.5.RELEASE")
runtime("jstl:jstl:1.2")
} task copyJars(type: Copy) {
from configurations.runtime
into 'lib' // 目标位置
}

2、创建数据库表

sql脚本文件如下:

DROP DATABASE IF EXISTS sampledb;
CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;
USE sampledb; ##创建用户表
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; ##创建用户登录日志表
CREATE TABLE t_login_log (
login_log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
ip VARCHAR(23),
login_datetime datetime
)ENGINE=InnoDB; ##插入初始化数据
INSERT INTO t_user (user_name,password)
VALUES('admin','');
COMMIT;

打开MySQL Workbench,点击菜单【Database】->【Connect to Database】连接数据库后,执行上述脚本。

3、实现领域对象和数据访问对象

在src/main/java/domain文件夹下新建两个类User,LoginLog,代码请参考附件。

在src/main/java/dao文件夹下新建两个类UserDao,LoginLogDao,代码请参考附件。

对数据库的操作都是通过一个JdbcTemplate对象进行操作的,JdbcTemplate是Spring Jdbc包的核心类,Spring Jdbc包是对JDBC的一个轻量级封装。

对该包的使用请参考其他更详细的资料。

4、实现业务层

在src/main/java/service文件夹下新建类UserService,代码请参考附件。该类通过调用持久层的接口实现业务逻辑。

5、控制器

在src/main/java/controller文件夹下新建类LoginCommand,代码请参考附件。LoginController类代码修改如下:

@Controller
public class LoginController { @Autowired
private UserService userService; @RequestMapping(value = "/login.html")
public String loginPage() {
return "login";
} @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.getLocalAddr());
user.setLastVisit(new Date());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);
return new ModelAndView("main");
}
}
}

6、修改配置文件

修改applicationContext.xml文件,添加数据源和Jdbc模板,以便Spring可自动注入JdbcTemplate对象。

    <context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/> <!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://localhost:3306/sampledb"
p:username="guwenjin"
p:password="p@ssw0rd" /> <!-- 配置Jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />

spring-web-servlet.xml文件中新增如下一行,以便在LoginController类中Spring可自动注入UserService对象。

<context:component-scan base-package="service"/> 

6、单元测试

在src/test/java/service文件夹下新建类UserServiceTest,代码如下:

@ContextConfiguration(locations = {"/applicationContext.xml"})
public class UserServiceTest extends AbstractTestNGSpringContextTests { @Autowired
private UserService userService; @Test
public void hasMatchUser() {
boolean b1 = userService.hasMatchUser("admin", "123456");
boolean b2 = userService.hasMatchUser("admin", "1111");
assertTrue(b1);
assertTrue(!b2);
} @Test
public void findUserByUserName() {
User user = userService.findUserByUserName("admin");
assertEquals(user.getUserName(), "admin");
} @Test
public void loginSuccess() {
User user = userService.findUserByUserName("admin");
user.setUserId(1);
user.setUserName("admin");
user.setLastIp("192.168.20.106");
user.setLastVisit(new Date());
userService.loginSuccess(user);
}
}

测试框架采用了TestNG,其依赖spring-test、testng两个库,其详细使用方法请参考其他资料。

7、运行网站

展现层代码不用改动,直接启动Tomcat,系统可对登录页面中填写的用户名密码进行验证,并将登录信息记录日志。

源码下载http://files.cnblogs.com/wenjingu/VelocityDemo3.0.zip,lib中的jar包上传时删除了,运行前请先运行命令:gradle copyJars下载jar包。

参考书籍:《Spring 3.0就这么简单》陈雄华,林开雄著

最新文章

  1. 未能加载文件或程序集“Antlr3.Runtime”或它的某一个依赖项
  2. [问题2014S09] 解答
  3. IOS 验证码
  4. Groupon面经:Find paths in a binary tree summing to a target value
  5. Android核心分析之十五Android输入系统之输入路径详解
  6. android基本知识(一)
  7. 完全背包的变形POJ1252
  8. java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
  9. EffectiveC#3--选择is或者as操作符而不是做强制类型转换
  10. eShopOnContainers 知多少[6]:持久化事件日志
  11. makefile 转载
  12. DWH中增量数据的抽取
  13. lambda从入门到精通
  14. 用PhoneGap创建第一个项目
  15. centos7下利用httpd2.4配置svn并使用Ldap用户认证
  16. ajax---获取XMLHttpReuquest 对象
  17. python3的Cryptodome
  18. 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)
  19. log | logstash
  20. java 静态方法上的泛型

热门文章

  1. leetcode704
  2. webpy简单使用
  3. shell 脚本的坑
  4. 转 sql注入
  5. RimLight(轮廓光) - Shader
  6. 使用Windows绘图合成多张图
  7. Slim安装以及使用【转】
  8. golang怎么使用redis,最基础的有效的方法
  9. Mask_RCNN测试自己的模型(练习)
  10. Openssl rand命令