`
aixupeng1314
  • 浏览: 2199 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

菜鸟研究spring3.x的心得与笔记(第三节)入门级案列

 
阅读更多

这章我们开始,入门级案列,Spring3.X中的例子不是Hello World哦,Hello World太简单了是吧,说明不了啥

 

我们做的案列是论坛登录模块。

 

  1》登录业务大家都熟悉不过了

 

  2》登录模块虽然小,但是它涵盖了,持久层数据访问操作,业务层事务管理,展现层MVC,工

作中用到的功能都有包含了

 

业务简介:

 

      登录模块,首先登录页面提供一个带用户名/密码的输入表单,用户填写提交表单后,服务

 

端程序检查是否有匹配的用户名/密码,如果户名/密码不匹配,返回登录页面,给出提示,如果

 

用户名/密码匹配,记录用户的成功登录日志,更新用户的最后登录时间和Ip并给用户增加5个积

 

分,然后重定向到欢迎页面。

 



 持久层两个DAO类,分别是UserDao 和 LoginLogDao,在业务层对应一个业务类

 

UserSerice,在展现层拥有一个LoginController 类和两个JSP页面,分别是登录页面login.jsp和

 

欢迎页面mian.jsp。

 

环境准备:

 

   1.1  我们使用mysql5.X数据库,因为 mysql4.1.0以前的版本不支持事务,所以最好用5.0或者

 

更高版本。

 

      下载Mysql连接地址:http://www.mysql.org/downloads ,安装mysql就不用说了,只需要下一步就好,安装实在不会的找度娘

http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html 安装图解

      注:本人连接数据库用的是Navicat for MySQL  连接工具  

   

1.2 创建连接

          

 

 mysql默认端口3306,用户名安装默认root,密码是安装时候自己设置的密码         

 

然后我们接下来创建数据库

       


 

     我们的数据库名:sampledb,为了后面发生乱码,我们字符集合排序规则都使用UTF-8

 

1.3 创建实例所用的到表:

      

##创建用户表
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.1 创建工程,我们用的是MyEclipse,我把MyEclipse的工作空间设置为D:\masterSpring

 

为了编码一致性,我们可以把MyEclipse的工作空间编码更改为UTF-8

 



 

     点击Apply 应用就OK了

 

我们接下来创建一个叫chapter2的 web 工程

 

 

 我们类包以分层的方式进行组织,分为4个包,分别是dao、domain、service 和 web
 如下图:

    

 

 这样的分层结构,当项目规模增大的时候,这种分层会显示他的不足,我们一般会在业务报

 

下,再按业务规划好多个子包,如:user/dao,user/service,forum/dao,forum/service等,每

 

个大项目,都是由若干个独立的子系统组成的,总之包的规划,关系到应用部署和分发的方便

 

性,特别重要。

 

接下来我们创建两个对象,用户对象User,日志对象LoginLog,分别对应t_user和t_login_log两

 

个数据表

 

用户对象User

 

package com.baobaotao.domain;

import java.io.Serializable;
import java.util.Date;
//对象一般要实现Serializable的接口,以方便可以序列化
public class User implements Serializable{
	private int userId;   //用户ID

	private String userName; //用户名

 	private String password;  //密码

	private int credits;  //积分

	private String lastIp; //最后登录IP

	private Date lastVisit; //最后登录时间
	
	//省略get/setXxx方法

 

日志对象LoginLog

 

package com.baobaotao.domain;
import java.io.Serializable;
import java.util.Date;

public class LoginLog implements Serializable{
	private int loginLogId;  //日志ID

	private int userId;  //用户ID

 	private String ip;  //IP

	private Date loginDate; //登录时间
	
	//省略get/setXxx方法

 

接下来我们定义访问User的DAO,它包括3个方法:

 

1,getMatchCount() :根据用户名和密码获取匹配的用户数。等于1表示用户名/密码正确;等

 

于0表示用户名或密码错误。

2,findUserByUserName():根据用户名获取User对象。

 

3,updateLoginInfo(): 更新用户积分、最后登录IP以及最后登录时间。

 

代码如下:

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;

@Repository    //通过Spring注解定义一个Dao
public class UserDao {
	
	@Autowired   //自动注入JdbcTemplate的Bean
	private JdbcTemplate jdbcTemplate;


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

	public User findUserByUserName(final String userName) {
               //根据用户名查询用户的SQL语句
		String sqlStr = " SELECT user_id,user_name,credits "
				+ " FROM t_user WHERE user_name =? ";
		final User user = new User();
               //jdbcTemplate.query方法的三个参数
               //① sqlStr:查询的SQL语句,允许使用带“?”的参数占位符。
               //② args:SQL语句中占位符对应的参数数组
               //③RowCallbackHandler查询结果的处理回调接口,该接口只有一个方法processRow,将ResultSet转换为User对象
		jdbcTemplate.query(sqlStr, new Object[] { userName },
                               //匿名类方式实现的回调函数
				new RowCallbackHandler() {
					public void processRow(ResultSet rs) throws SQLException {
						user.setUserId(rs.getInt("user_id"));
						user.setUserName(userName);
						user.setCredits(rs.getInt("credits"));
					}
				});
		return user;
	}

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

 

 LoginLogDao 负责记录用户的登录日志,直接使用JdbcTemplate#update方法插入记录

 

 

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;

@Repository
public class LoginLogDao {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	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);
	}
}
 

 

Spring省略了Dao中省略了打开释放Connection的代码,那些繁琐的代码都被Spring 的

 

JdbcTemplate封装好了,他只需要一个数据源DataSource就可以完成一切操作,所以我们必须

 

申明一个数据源,然后定义一个JdbcTemplate的Bean,通过Spring的容器上下文,自动进行

 

Bean的注入。

 

我们在src目录下创建一个applicationContext.xml的Spring配置文件

 

注意此代码后续(service层的配置也讲在此写入)将用到:

 

 

<?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"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	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
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    
    <!-- ①扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
    <context:component-scan base-package="com.baobaotao.dao"/>
    <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="1234" />

	<!-- ③配置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>
 

 

 

在①处我们使用<context:component-scan>扫描制定类包下的所有类,这样在类中定义的Spring

注解(如@Repository,@Autowired等)才能产生作用。

 

②我们使用Jakarta的DBCP定义了一个数据源,mysql连接的数据源

 

③我们配置了JdbcTemplate Bean 将②申明的dataSource注入到JdbcTemplate中,而JdbcTemplate Bean将通过@Autowired自动注入到两个Dao 的Bean中。

 

这样我们持久层的工作就算完工了,接下来我们着手业务层的开发和配置,我们到时候还将对业务层进行单元测试

 

 

本人给大家道个歉啊,由于本人这段时间想换工作,所有也在看其他东西,多线程啊,并发啊,准备简历啊之类的,多看看好面试,呵呵,如有兄弟们有好去处可以联系本人,内推本人一下,谢谢大家,我QQ:594707097,如果有技术问题也可以一起讨论,博客后续更新我会跟上

 

 

 

  • 大小: 9.6 KB
  • 大小: 37.8 KB
  • 大小: 7 KB
  • 大小: 21 KB
  • 大小: 21.4 KB
  • 大小: 6.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics