相关软件:
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即可。
3、导入相关的jar包
我把Spring开发要用到的jar包都弄成一个文件夹了,把里面所有的jar包复制然后黏贴到项目里面的lib目录下即可。
4、配置项目结构
打开Project Structure(Ctrl+Alt+Shift+S),选择Modules,选择Paths,选择Use module compile output path,两个都选择为刚刚创建的classes文件夹。
接着看一下Modules下的Dependencies是否已经加入lib文件夹,如果没有,点击右边的“+”号,选择“Jars or Directories ”,选择刚刚创建的lib文件夹。如果已经加入则提个勾,表示选中。最后OK即可。
5、创建库表
我的数据库用户名为root,密码为123456。
创建库表的SQL语句可参见:\chapter2\schema。
创建数据库sampledb:
创建表t_user:
创建表t_login_log:
插入数据:
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”,即将类里面的所有方法都运行一遍。
看到”All Tests Passed“,表示全部通过啦~~~
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
界面显示:
用户名:admin,密码:123456
登录成功进入主界面。
16、项目结构图