版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzy199772/article/details/76548129
今天准备开始学习Spring框架,于是买了一本Spring3.x企业应用开发,其第二章就是一个新手入门的演示Demo,通过自己的实践和小修改把这个简单项目给撸了出来,现在准备写一篇文章来记录他。
本文的GitHub链接是:点击打开链接
本文的源代码和素材都放在了Git上,jar包可以在Spring官网下载。
不会下载的同学可以看我转载的另一篇文章快速下载:http://blog.csdn.net/hzy199772/article/details/76177298
功能图就不放了,网上随便一搜这本书的这个项目已经被写烂了,本文仅以记录学习心得和历程。
先放两张效果图吧
登录页面
欢迎页面
————————————————————正式开始————————————————————————
1.首先创建一个项目需要的数据库和表,将下列代码创建一个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),
credits INT,
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;
2.建立工程,并导入相关的jar包,建立文件结构
3.在domain包中建立两个领域对象,User和LoginLog
(1)User
package com.baobaotao.domain;
import java.io.Serializable;
import java.util.Date;
/**
* 领域对象User
* @title User
* @author hzy
* @date 2017年7月28日上午10:01:15
* @version 1.0.0
*/
public class User implements Serializable {
private int userId;
private String userName;
private String password;
private int credits;
private String lastIp;
private Date 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;
}
public int getCredits() {
return credits;
}
public void setCredits(int credits) {
this.credits = credits;
}
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;
}
}
(2)LoginLog
package com.baobaotao.domain;
import java.io.Serializable;
import java.util.Date;
/**
* 领域对象 LoginLog
* @title LoginLog
* @author hzy
* @date 2017年7月28日上午10:06:06
* @version 1.0.0
*/
public class LoginLog implements Serializable {
private int loginLogId;
private int userId;
private String ip;
private Date loginDate;
public int getLoginLogId() {
return loginLogId;
}
public void setLoginLogId(int loginLogId) {
this.loginLogId = loginLogId;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Date getLoginDate() {
return loginDate;
}
public void setLoginDate(Date loginDate) {
this.loginDate = loginDate;
}
}
4.定义访问领域对象的Dao
(1)UserDao
package com.baobaotao.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.stereotype.Repository;
import com.baobaotao.domain.User;
/**
* 访问User的Dao
* @title UserDao
* @author hzy
* @date 2017年7月28日上午11:16:49
* @version 1.0.0
*/
@Repository//通过Spring注解定义一个Dao
public class UserDao {
@Autowired//自动注入JdbcTemplate的Bean
private JdbcTemplate jdbcTemplate;
/**
* 根据用户名和密码获取匹配的用户
* @param userName
* @param password
* @return
*/
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});
}
/**
* 根据用户名获取User对象
* @param userName
* @return User
*/
public User findUserByUserName(final String userName){
String sqlStr = "SELECT user_id,user_name,credits FROM t_user WHERE user_name=?";
final User user = new User();
jdbcTemplate.query(sqlStr, new Object[]{userName}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
// TODO Auto-generated method stub
user.setUserId(rs.getInt("user_id"));
user.setUserName(userName);
user.setCredits(rs.getInt("credits"));
}
});
return user;
}
/**
* 更新用户积分、最后登录IP以及最后登录时间
* @param user void
*/
public void updateLoginInfo(User user){
String sqlStr = "UPDATE t_user SET last_visit=?,last_ip=?,credits=? WHERE user_id=?";
jdbcTemplate.update(sqlStr, new Object[]{user.getLastVisit(),user.getLastIp(),user.getCredits(),user.getUserId()});
}
}
(2)LoginLogDao
package com.baobaotao.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.baobaotao.domain.LoginLog;
/**
* 用户的登录日志
* @title LoginLogDao
* @author hzy
* @date 2017年7月28日上午11:47:40
* @version 1.0.0
*/
@Repository
public class LoginLogDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 记录用户登录的id,时间,ip
* @title LoginLogDao
* @author hzy
* @date 2017年7月28日上午11:53:06
* @version 1.0.0
*/
public void insertLoginLog(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);
}
}
5。接着为了让Dao起作用,需要进行配置在applicationContext.xml中进行配置,这里贴的是最终所有配置的代码,后面需要在该文件配置的内容回到这里查看便可。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引用Spring的多个Schema空间的格式定义文件 -->
<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/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 扫描类包。将标注Spring注解的类自动转化为bean,同时完成bean的注入 -->
<context:component-scan base-package="com.baobaotao.dao"/>
<!-- 扫描service类包 应用Spring的注解配置 -->
<context:component-scan base-package="com.baobaotao.service"/>
<!-- 定义一个使用DBCP实现的数据源 -->
<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="root"
p:password="123456"></bean>
<!-- 定义jdbc模板Bean -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"/>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
<!-- 通过AOP配置提供事务增强,让service包下所有的Bean的所有方法都拥有事务 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="serviceMethod" expression="execution(* com.baobaotao.service..*(..))" />
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</beans>
6.接下来是业务层的处理 需要一个UserService类和XML配置(查看第5步)
package com.baobaotao.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baobaotao.dao.LoginLogDao;
import com.baobaotao.dao.UserDao;
import com.baobaotao.domain.LoginLog;
import com.baobaotao.domain.User;
/**
* 用户密码认证和登陆日志业务类
* @title UserService
* @author hzy
* @date 2017年7月28日下午5:16:45
* @version 1.0.0
*/
@Service//标注为一个服务层的bean
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private LoginLogDao loginLogDao;
/**
* 检查用户名和密码的正确性
* @param userName
* @param password
* @return boolean
*/
public boolean hasMatchUser(String userName, String password){
int matchCount = userDao.getMatchCount(userName, password);
return matchCount>0;
}
/**
* 查找User对象
* @param userName
* @return User
*/
public User findUserByUserName(String userName){
return userDao.findUserByUserName(userName);
}
/**
* 1.更新用户信息
* 2.更新登录日志
* @param user void
*/
public void loginSuccess(User user){
user.setCredits(5+user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setUserId(user.getUserId());
loginLog.setIp(user.getLastIp());
loginLog.setLoginDate(user.getLastVisit());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(loginLog);
}
}
7.然后便是展现层的代码了,先配置SpringMVC框架 修改web.XML,然后配置控制器类
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>baobaotao</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>baobaotao</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
tips:这里存在一个契约:必须在/WEB-INF目录下提供一个采用servlet名-servlet.xml的文件(比如这里就是baobaotao-servlet.xml)来配置SpringMVC
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 扫描web包,应用Spring的注解 -->
<context:component-scan base-package="com.baobaotao.web"/>
<!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
</beans>
package com.baobaotao.web;
/**
* POJO
* @title LoginCommand
* @author hzy
* @date 2017年7月29日下午1:21:45
* @version 1.0.0
*/
public class LoginCommand {
private String userName;
private String password;
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;
}
}
LoginController
package com.baobaotao.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.baobaotao.domain.User;
import com.baobaotao.service.UserService;
/**
* 处理登录请求
* @title LoginController
* @author hzy
* @date 2017年7月29日下午1:13:02
* @version 1.0.0
*/
@Controller
public class LoginController {
@Autowired
private UserService userService;
@RequestMapping(value="/index.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.getRemoteAddr());
user.setLastVisit(new Date());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);
return new ModelAndView("main");
}
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>login</title>
<link rel="stylesheet" type="text/css" href="css/normalize.css">
<link rel="stylesheet" type="text/css" href="css/demo.css">
<!--必要样式-->
<link rel="stylesheet" type="text/css" href="css/component.css">
<!--[if IE]>
<script src="js/html5.js"></script>
<![endif]-->
</head>
<body>
<div class="container demo-1">
<div class="content">
<div id="large-header" class="large-header" style="height: 809px;">
<canvas id="demo-canvas" width="1920" height="809"></canvas>
<div class="logo_box">
<h3>欢迎你</h3>
<form action="<c:url value="loginCheck.html"/>" name="f" method="post">
<div class="input_outer">
<span class="u_user"></span>
<input name="userName" class="text" style="color: #FFFFFF !important" type="text" placeholder="请输入账户">
</div>
<div class="input_outer">
<span class="us_uer"></span>
<input name="password" class="text" style="color: #FFFFFF !important; position:absolute; z-index:100;" value="" type="password" placeholder="请输入密码">
</div>
<div class="mb2"><input type="submit" class="act-but submit" style="color: #FFFFFF" value=" 登录 "/></div>
</form>
</div>
</div>
</div>
</div><!-- /container -->
<script src="js/TweenLite.min.js"></script>
<script src="js/EasePack.min.js"></script>
<script src="js/rAF.js"></script>
<script src="js/demo-1.js"></script>
</body></html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Keywords" content="网页关键词和关键字">
<meta name="Description" content="网页描述信息">
<title>520表白--假期学习</title>
<!-- css样式 -->
<style type="text/css">
*{margin:0;padding:0;}
body{background:url("images/6.jpg");background-size:cover;}
.top{width:400px;height:100px;margin:60px auto;font-size:30px;font-family:"华文行楷";color:#FFF;}
.box{width:310px;height:310px;margin:auto;perspective:800px;}
.box .pic{position:relative;transform-style:preserve-3d;animation:play 20s linear infinite;}
.box ul li{list-style:none;position:absolute;top:0;left:0;}
#text{width:500px;height:200px;color:#21beb7;margin:auto;font-size:24px;font-family:"华文行楷";}
/*定义一个关键帧*/
@keyframes play{
from{transform:rotateY(0deg);}
40%{transform:rotateY(180deg);}
80%{transform:rotateY(0deg);}
to{transform:rotateY(180deg);}
}
</style>
</head>
<body>
<!-- div 盒子 容器 层 -->
<!-- 以class命名的样式册为类样式 -->
<div class="top">
<marquee behavior="alternate">${user.userName},欢迎您进入宝宝淘论坛。您当前积分为${user.credits};</marquee>
</div>
<div class="box">
<div class="pic">
<ul>
<!-- 图片标签四要素 宽度高度写在这里是优化效果-->
<li><img src="images/1.png" height="";width="";alt="描述";/></li>
<li><img src="images/2.png" height="";width="";alt="描述";/></li>
<li><img src="images/3.png" height="";width="";alt="描述";/></li>
<li><img src="images/4.png" height="";width="";alt="描述";/></li>
<li><img src="images/5.png" height="";width="";alt="描述";/></li>
<li><img src="images/6.png" height="";width="";alt="描述";/></li>
</ul>
</div>
</div>
<div id="text"></div>
<embed src="mp3/qiqiu.mp3" hidden="false"/>
<script src="js/jquery-1.11.3.min.js"></script>
<script>
//拿到每一个li
$(".pic ul li").each(function(i){
var deg = 360/$(".pic ul li").size();
//当前的li对象
$(this).css({"transform":"rotateY("+deg*i+"deg)translateZ(216px)"});
});
var i = 0;
var str="能够遇见你是我最大的幸运,有了你世界变得丰富多彩起来,有了你,世界变得如此迷人,你是我的世界,我的世界是你,对我来说,不是在最美好的时光遇见了你,而是遇见你以后都是最美好的时光!";
window.onload = function typing(){
//获取DIV
var mydiv = document.getElementById("text");
mydiv.innerHTML += str.charAt(i);
i++;
var id = setTimeout(typing,100);
if(i==str.length){
clearTimeout(id);
}
}
var imgs =["1.jpg", "2.jpg", "3.jpg","4.jpg","5.jpg","6.jpg"]; //(设定想要显示的图片)
var x = 0;
function playBg(){
x= Math.floor(Math.random()*5+1);
$("body").css("background", "url(images/" +imgs[x]+ ")");
}
setInterval("playBg()",3000);
</script>
</body>
</html>
9.部署到Tomcat服务器就可以运行啦。