Spring学习之路 第一个Spring演示实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 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>



LoginCommand

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");
		}
	}
}


8.最后一步就是配置jsp页面啦,这里我没用书上例子里的页面,而是自己进行了美化,关于css和js样式可以去我的gitHub下载就好啦,顶上有链接。这里贴一下页面的代码吧,需要配合css+js喔


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>


然后是main.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">
 <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服务器就可以运行啦。

猜你喜欢

转载自blog.csdn.net/hzy199772/article/details/76548129
今日推荐