`
aixupeng1314
  • 浏览: 2368 次
  • 性别: 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
分享到:
评论

相关推荐

    精通Spring 4.x 企业应用开发实战.pdf 和项目代码

    《精通Spring 4.x 企业应用开发实战》是一本深入探讨Spring 4.x框架在企业级应用中的实践指南。本书旨在帮助开发者全面理解和掌握Spring框架的核心功能和最佳实践,通过实际项目案例,让读者能够在实际工作中灵活...

    菜鸟工具..................

    菜鸟工具..................菜鸟工具..................菜鸟工具..................菜鸟工具..................菜鸟工具..................菜鸟工具..................菜鸟工具..................

    菜鸟教程Python3.pdf

    总的来说,Python3教程针对的是Python3.x版本的学习,覆盖了Python的基本知识和使用方法,旨在帮助初学者快速入门并掌握Python编程语言的基础知识。通过了解Python3的安装、基本语法和编程实践,学习者能够顺利开启...

    菜鸟的ARM笔记.pdf

    3. **UCLINUX编译下载简单笔记**:UCLINUX是专门为嵌入式系统设计的Linux发行版。笔记中提到了UCLINUX的编译和下载流程,这是嵌入式Linux开发的基础步骤之一。 4. **字符设备驱动开发C工程模板使用说明**:提供了一...

    快递物流研究笔记之一:商流加持的物流巨头:菜鸟VS京东物流.pdf

    电商系物流公司和第三方物流公司如顺丰、通达系等长期处于竞争与合作的关系中。价格战对行业盈利构成了压力,因此二级市场更关注利润表的估值体系并不足以全面衡量上市快递公司的价值。在电商巨头眼中,供应链稳定性...

    spring菜鸟入门经典实例

    Spring框架是Java开发中的核心组件,它为应用程序提供了一个全面的基础设施,包括依赖注入(DI)、面向切面编程(AOP)以及各种企业级服务。本教程专为初学者设计,旨在帮助“菜鸟”快速掌握Spring的基本概念和实战...

    Python基础_菜鸟入门自学笔记.md

    跟着就业班自己做的python基础笔记,每一个知识点都有例子支撑

    JAVA菜鸟级入门教程.pdf

    JAVA菜鸟级入门教程

    w3cschool菜鸟教程.CHM.rar

    《w3cschool菜鸟教程.CHM.rar》是一个包含丰富的在线编程学习资源的压缩包,主要针对初学者设计,提供离线阅读的便利性。CHM(Compiled HTML Help)是微软的一种帮助文档格式,将HTML页面集合在一起,形成一个可搜索...

    菜鸟的Javascript笔记.rar

    这个菜鸟的笔记里面没有谈到JavaScript中的对象,比如说时间对象和字符串对象,这些内容可以在“菜鸟的JavaScript对象笔记”中找到。不过因为小菜鸟个人认为HTML DOM比其它的JavaScript对象更常用一些(不过这可不...

    易语言中文编程-从入门到精通【菜鸟基础教程】.doc

    ### 第三课:按钮与标签的综合运用 这一课将介绍如何在界面上添加按钮和标签元素,以及如何编写处理用户点击事件的代码,实现基本的用户界面交互。 ### 第四课:图文并茂 学习如何在程序中插入图片,使程序更具...

    Spring 和Hibernate 整合笔记和jar包

    3. **Spring与Hibernate整合** - **事务管理**:Spring可以接管Hibernate的事务管理,通过PlatformTransactionManager接口实现声明式事务管理,使得事务控制更为简洁。 - **SessionFactory的获取**:Spring通过...

    菜鸟快速入门 struts 1.X (简单的登陆)第一篇

    这个入门教程将引导你逐步了解如何使用Struts 1.X实现一个简单的登录功能。以下是对这一主题的详细讲解: 1. **MVC模式**:在Struts 1.X中,MVC模式被用来分离应用程序的业务逻辑、数据模型和用户界面。Model代表...

    菜鸟的Python笔记.pdf

    一个pythone菜鸟的养成之路,对初学的人有很好的借鉴意义。

    快递物流系列研究笔记之七:菜鸟的物流江湖.pdf

    本篇研究笔记试图通过分析菜鸟网络的发展历程,阐释其业务模式、服务内容、未来发展方向,以及对整个快递行业的影响。 首先,菜鸟网络的定位是社会化物流协同平台,即平台型物流企业(4PL)。这意味着它不仅仅是一...

    快递物流系列研究笔记之七:菜鸟的物流江湖.zip

    在本篇研究笔记中,我们将深入探讨“菜鸟的物流江湖”,了解这个互联网巨头阿里巴巴旗下物流平台如何在快递物流行业中扮演着重要角色。菜鸟网络自2013年成立以来,通过技术创新与资源整合,改变了传统物流行业的运作...

    34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码

    34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码34--[菜鸟闯关].zip源码scratch2.0 3.0编程项目源文件源码案例素材源...

    新手C++学习笔记(仅供菜鸟成长参考).rar

    《新手C++学习笔记》是一份专为编程初学者打造的资源,旨在帮助那些刚刚踏入C++编程领域的“菜鸟”快速成长。这份笔记包含了前辈们的实践经验总结,具有很高的学习价值。文档以.doc格式存储,方便读者使用常见的文字...

    新手html学习笔记(仅供菜鸟成长参考).rar

    3. `&lt;head&gt;`元素:包含文档元信息,如标题、字符集、样式表引用等。 4. `&lt;title&gt;`元素:定义浏览器顶部显示的页面标题。 5. `&lt;body&gt;`元素:包含实际可见的网页内容。 三、HTML元素和标签 HTML由许多标签组成,每种...

Global site tag (gtag.js) - Google Analytics