本篇我們將在上一篇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','123456'); 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就這么簡單》陳雄華,林開雄著