相关软件:

3、Tomcat(apache-tomcat-6.0.43):http://pan.baidu.com/s/1kUwReQF

4、MySQL(mysql-essential-5.1.68-winx64):http://pan.baidu.com/s/1gdZZgMB

6:相关Lib打包:http://pan.baidu.com/s/1slSmWqx

案例来自于《Spring 3.X 企业应用开发实战》 Chapter2 : http://pan.baidu.com/s/1qWXEE3E

1、创建一个普通的Java Web项目

项目名称为:SpringProject,Module名称为SpringCh2LoginModule。

2、手动创建以下目录

在Module下先创建一个文件夹为test,与src同级,然后右键,选择Mark Directory As,再选择Test Sources Root即可。

java用户登录时获取用户设备id java用户登录功能_java web idea spring

3、导入相关的jar包

我把Spring开发要用到的jar包都弄成一个文件夹了,把里面所有的jar包复制然后黏贴到项目里面的lib目录下即可。

java用户登录时获取用户设备id java用户登录功能_java用户登录时获取用户设备id_02

4、配置项目结构

打开Project Structure(Ctrl+Alt+Shift+S),选择Modules,选择Paths,选择Use module compile output path,两个都选择为刚刚创建的classes文件夹。

java用户登录时获取用户设备id java用户登录功能_java web idea spring_03

接着看一下Modules下的Dependencies是否已经加入lib文件夹,如果没有,点击右边的“+”号,选择“Jars or Directories ”,选择刚刚创建的lib文件夹。如果已经加入则提个勾,表示选中。最后OK即可。

java用户登录时获取用户设备id java用户登录功能_java web idea spring_04

5、创建库表

我的数据库用户名为root,密码为123456。

创建库表的SQL语句可参见:\chapter2\schema。

创建数据库sampledb:

java用户登录时获取用户设备id java用户登录功能_java用户登录时获取用户设备id_05

创建表t_user:

java用户登录时获取用户设备id java用户登录功能_User_06

创建表t_login_log:

java用户登录时获取用户设备id java用户登录功能_java用户登录时获取用户设备id_07

插入数据:

java用户登录时获取用户设备id java用户登录功能_java web idea spring_08

6、构建主体层

用户领域对象:User

packagecom.yyq.domain;importjava.io.Serializable;importjava.util.Date;public class User implementsSerializable {private intuserId;privateString userName;privateString password;private intcredits;privateString lastIp;privateDate lastVisit;publicUser() {
}public intgetUserId() {returnuserId;
}public void setUserId(intuserId) {this.userId =userId;
}publicString getUserName() {returnuserName;
}public voidsetUserName(String userName) {this.userName =userName;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}public intgetCredits() {returncredits;
}public void setCredits(intcredits) {this.credits =credits;
}publicString getLastIp() {returnlastIp;
}public voidsetLastIp(String lastIp) {this.lastIp =lastIp;
}publicDate getLastVisit() {returnlastVisit;
}public voidsetLastVisit(Date lastVisit) {this.lastVisit =lastVisit;
}
}
登录日志领域对象:LoginLog.java
packagecom.yyq.domain;importjava.io.Serializable;importjava.util.Date;public class LoginLog implementsSerializable {private intloginLogId;private intuserId;privateString ip;privateDate loginDate;publicLoginLog() {
}public intgetLoginLogId() {returnloginLogId;
}public void setLoginLogId(intloginLogId) {this.loginLogId =loginLogId;
}public intgetUserId() {returnuserId;
}public void setUserId(intuserId) {this.userId =userId;
}publicString getIp() {returnip;
}public voidsetIp(String ip) {this.ip =ip;
}publicDate getLoginDate() {returnloginDate;
}public voidsetLoginDate(Date loginDate) {this.loginDate =loginDate;
}
}
7、构建持久层
UserDao:
packagecom.yyq.dao;importcom.yyq.domain.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.jdbc.core.RowCallbackHandler;importorg.springframework.stereotype.Repository;importjava.sql.ResultSet;importjava.sql.SQLException;
@Repositorypublic classUserDao {
@AutowiredprivateJdbcTemplate jdbcTemplate;publicUserDao() {
System.out.println("UserDao");
}public intgetMatchCount(String userName, String password) {
String sqlStr= "select count(*) from t_user where user_name = ? and password = ?";return jdbcTemplate.queryForInt(sqlStr, newObject[]{userName, password});
}public User findUserByUserName(finalString userName) {
String sqlStr= " SELECT user_id,user_name,credits "
+ " FROM t_user WHERE user_name =? ";final User user = newUser();
jdbcTemplate.query(sqlStr,newObject[]{userName},newRowCallbackHandler() {public void processRow(ResultSet rs) throwsSQLException {
user.setUserId(rs.getInt("user_id"));
user.setUserName(userName);
user.setCredits(rs.getInt("credits"));
}
});returnuser;
}public voidupdateLoginInfo(User user) {
String sqlStr= " UPDATE t_user SET last_visit=?,last_ip=?,credits=? "
+ " WHERE user_id =?";
jdbcTemplate.update(sqlStr,newObject[]{user.getLastVisit(),
user.getLastIp(), user.getCredits(), user.getUserId()});
}
}
LoginLogDao:
packagecom.yyq.dao;importcom.yyq.domain.LoginLog;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.stereotype.Repository;
@Repositorypublic classLoginLogDao {
@AutowiredprivateJdbcTemplate jdbcTemplate;public voidinsertLoginLog(LoginLog loginLog) {
String sqlStr= "INSERT INTO t_login_log(user_id,ip,login_datetime) "
+ "VALUES(?,?,?)";
Object[] args={loginLog.getUserId(), loginLog.getIp(),
loginLog.getLoginDate()};
jdbcTemplate.update(sqlStr, args);
}
}
8、业务层
packagecom.yyq.service;importcom.yyq.dao.LoginLogDao;importcom.yyq.dao.UserDao;importcom.yyq.domain.LoginLog;importcom.yyq.domain.User;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;
@Servicepublic classUserService {
@AutowiredprivateUserDao userDao;
@AutowiredprivateLoginLogDao loginLogDao;public booleanhasMatchUser(String userName, String password){int matchCount =userDao.getMatchCount(userName,password);return matchCount > 0;
}publicUser findUserByUserName(String userName) {returnuserDao.findUserByUserName(userName);
}public voidloginSuccess(User user) {
user.setCredits(5 +user.getCredits());
LoginLog loginLog= newLoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
}

9、配置applicationContext.xml文件

在src目录下创建一个applicationContext.xml文件,点中src,右键,选择New -> File  ->输入applicationContext.xml,确认即可。

class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource"/>

10、编写单元测试

这里使用Junit4编写单元测试,在test文件夹下创建类com.yyq.TestUserService。

packagecom.yyq;importcom.yyq.domain.User;importcom.yyq.service.UserService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importjava.util.Date;import static org.junit.Assert.*;/*** Created by gao on 16-4-28.*/@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})public classTestUserService {
@AutowiredprivateUserService userService;
@Testpublic voidhasMatchUser(){boolean b1 = userService.hasMatchUser("admin","123456");boolean b2 = userService.hasMatchUser("admin","1111");
assertTrue(b1);
assertTrue(!b2);
}
@Testpublic voidtestFindUserByUserName() {
User user= userService.findUserByUserName("admin");
assertEquals(user.getUserName(),"admin");
}
@Testpublic voidtestAddLoginLog() {
User user= userService.findUserByUserName("admin");
user.setUserId(1);
user.setUserName("admin");
user.setLastIp("192.168.12.7");
user.setLastVisit(newDate());
userService.loginSuccess(user);
}
}

11、运行测试用例

把鼠标放在某个测试方法,比如hasMatchUser()方法,右键,选择Run 'hasMatchUser()',即可运行特定的方法。当然,也可以把鼠标放在类名那里,右键,选择“TestUserService”,即将类里面的所有方法都运行一遍。

java用户登录时获取用户设备id java用户登录功能_java web idea spring_09

看到”All Tests Passed“,表示全部通过啦~~~

java用户登录时获取用户设备id java用户登录功能_bc_10

12、控制层

在src目录下创建包com.yyq.service,在该包下创建类LoginCommand和类LoginController。

LoginCommand:
packagecom.yyq.controller;/*** Created by gao on 16-4-28.*/
public classLoginCommand {privateString userName;privateString password;publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}publicString getUserName() {returnuserName;
}public voidsetUserName(String userName) {this.userName =userName;
}
}
LoginController:
packagecom.yyq.controller;importcom.yyq.domain.User;importcom.yyq.service.UserService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjava.util.Date;
@Controllerpublic classLoginController {
@AutowiredprivateUserService userService;
@RequestMapping(value= "/index.html")publicString loginPage(){return "login";
}
@RequestMapping(value= "/loginCheck.html")publicModelAndView 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(newDate());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);return new ModelAndView("main");
}
}
}

13、编写JSP视图页面

login.jsp:

宝宝淘论坛登录" method="post">用户名:


密 码:

main.jsp:

User: gao

Date:16-3-17Time: 下午8:42To changethis template use File | Settings |File Templates.--%>

宝宝淘论坛


14、配置Spring MVC框架

1)修改web.xml文件

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
baobaotao
org.springframework.web.servlet.DispatcherServlet
2
baobaotao

*.html

2)在WEB-INF下创建一个文件baobaotao-servlet.xml

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

15、配置Tomcat容器,运行程序

Run -> Edit Configuration -> Run/Debug Configurations -> 点击"+"号 -> 选择Tomcat -> 选择Local -> 点击Deployment -> 点击“+” 号 -> 选择SpringCh2LoginModule:war exploded->OK

java用户登录时获取用户设备id java用户登录功能_bc_11

界面显示:

用户名:admin,密码:123456

java用户登录时获取用户设备id java用户登录功能_spring_12

登录成功进入主界面。

java用户登录时获取用户设备id java用户登录功能_User_13

16、项目结构图

java用户登录时获取用户设备id java用户登录功能_bc_14