spring基础学习-简单实例(一)

来源:互联网 发布:淘宝网广西金源马蹄粉 编辑:程序博客网 时间:2024/06/05 06:48
spring概要介绍:spring是一个轻量级开源框架,以IoC(Inverse of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)
为内核,兼具功能强大的的原生展现层spring mvc,原生持久层spring jdbc和原生业务层等技术,并且以海纳百川的胸怀整合了开源世界里众多
著名的第三方框架和类库,已经逐渐成为使用最多的JavaEE企业级应用开源框架.
通过spring提供的IoC容器,我们可以将对象之间的依赖关系交给spring管理,从而避免类和类之间的过度耦合,通过spring提供的AOP功能,
方便了面向切面编程,使许多用传统OOP不容易实现的功能可以用AOP轻松的实现,同时在spring中,我们还可以灵活的管理事务.
引用:spring的源码设计精妙,结构清晰,匠心独运,可以说是学习java技术的最佳实践范例.
下面通过一个简单的项目来展示一下开发spring web应用的整体过程,本项目用的是spring原生的展现层spring MVC,原生持久层和spring原生
的持久层spring JDBC.闲话少说,让我们开始spring的学习之旅吧!
1.功能简介.
  本项目的主要目的是实现一个登陆功能,登陆页面提供一个简单的带有用户名和密码的输入表单,用户输入后提交表单,服务器程序检查是否
  存在此用户名和密码的用户,如果没有返回到登陆页面,并给出错误提示,如果有记录用户成功登陆日志,并更新用户的最后登陆时间,登陆IP,
  以及登陆次数.最后重定向到欢迎页面.
2.环境准备.
  myeclipse10,jdk1.6,tomcat7.x,mysql5.x.
  如何配置jdk和tomcat环境变量,安装myeclipse,jdk,mysql和在myeclipse中集成tomcat和jdk等这些操作在这里不做详细介绍.
  a.创建库表.
    drop database if exists spring_demo;    create database spring_demo default character set utf8;    use spring_demo;    create table sd_user(    user_id int auto_increment primary key,    user_name varchar(40),    user_password varchar(40),    user_visit_count int,    user_visit_ip varchar(40),    user_visit_time datetime    )engine=innodb;    create table sd_user_login_log(        login_log_id int auto_increment primary key,    user_id int,    user_name varchar(40),    user_visit_ip varchar(40),    user_visit_time datetime    )engine=innodb;    insert into sd_user(user_name,user_password) values('admin','123456');    show tables;    select * from sd_user;
    将上述创建库表的语句直接复制到mysql的命令行窗口执行即可,当然也可以将上述创建库表的语句放到spirng-demo.sql文件中,
    然后在mysql的命令行窗口通过执行source C:\Users\10120-sdx\Desktopspring-demo.sql也可达到相同的效果.
    其中在创建表的语句中engine=innodb的意思是指定表的引擎为innodb类型,该类型表支持事务,而mysql默认采用的引擎不支持事务,
    仅存储数据,但是采用默认的引擎读写速度快.
  b.创建项目.
    首先打开myeclipse工具,通过Window-Preference-General-workspace-Text file encoding将myeclipse的工作空间的编码格式设置为utf8,
    否则myecipse采用系统默认的GBK编码格式.
    然后创建一个名为spring-demo的web项目,并导入需要的jar包,本项目用的是spring3.x,spring3.x采用模块化的包,

    如org.springframework.<module>-<version>.jar,其中module包括core,benas,context,jdbc,transaction,web,aop,asm等.

    最好还需要引入mysql数据库驱动类库mysql.jar,数据源类库commons-dbcp.jar,对象池类库commons-pool.jar,日志类库
    common-logging.jar和log4j.jar等.
   
3.项目编码.
   在创建好的spring-demo项目中同时创建4个包:com.ilucky.spring.demo.service,com.ilucky.spring.demo.dao,
   com.ilucky.spring.demo.web和com.ilucky.spring.demo.model.其中包的规划对于大型项目来说特别重要,
   它直接关系到项目的部署和分发的方便性,但是对于我们这个小项目来说不用考虑那么多.
   a.model的创建.

    model包括user和LoginLog,一般model要实现Serializable接口,以便可以序列化.直接看代码.

package com.ilucky.spring.demo.model;import java.io.Serializable;import java.util.Date;/** * @author IluckySi * @date 20140419 */public class User implements Serializable {    private static final long serialVersionUID = 1L;        private int userId;        private String userName;        private String userPassword;        private int userVisitCount;        private String userVisitIp;        private Date userVisitTime;    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 getUserPassword() {        return userPassword;    }    public void setUserPassword(String userPassword) {        this.userPassword = userPassword;    }    public int getUserVisitCount() {        return userVisitCount;    }    public void setUserVisitCount(int userVisitCount) {        this.userVisitCount = userVisitCount;    }    public String getUserVisitIp() {        return userVisitIp;    }    public void setUserVisitIp(String userVisitIp) {        this.userVisitIp = userVisitIp;    }    public Date getUserVisitTime() {        return userVisitTime;    }    public void setUserVisitTime(Date userVisitTime) {        this.userVisitTime = userVisitTime;    }    public static long getSerialversionuid() {        return serialVersionUID;    }}
package com.ilucky.spring.demo.model;package com.ilucky.spring.demo.model;import java.io.Serializable;import java.util.Date;/** * @author IluckySi * @date 20140419 */public class LoginLog implements Serializable {    private static final long serialVersionUID = 1L;    private String loginLogId;        private int userId;        private String userName;        private String userVisitIp;        private Date userVisitTime;    public String getLoginLogId() {        return loginLogId;    }    public void setLoginLogId(String loginLogId) {        this.loginLogId = loginLogId;    }    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 getUserVisitIp() {        return userVisitIp;    }    public void setUserVisitIp(String userVisitIp) {        this.userVisitIp = userVisitIp;    }    public Date getUserVisitTime() {        return userVisitTime;    }    public void setUserVisitTime(Date userVisitTime) {        this.userVisitTime = userVisitTime;    }}
    从上面的两个model中我们发现在LoginLog中存在三个冗余字段,即userName,userVisitIp和userVisitTime,之所以称之为冗余字段,是因为
    这三个字段我们都可以通过userId字段在User表中查询出来.那么为什么要这么设计表呢,因为适当的冗余字段可以提高数据库效率和简化项目操作.
    举例说明,上面的LoginLog表中的数据我们都要写入日志,如果按照如上设计表结构我们每次写入日志时只需要查询LoginLog这一张表即可
    不需要关联User表,即在日志中写入userid:1-userName:admin-userVisitIp:192.168.0.1-userVisitTime:2014/04/19 11:13:00登录.相反,
    如果读登录日志表时还需要关联User表,这样会大大的降低效率.
 时间不早了,亲们该吃午饭了,下午咱们继续spring实践......

0 0
原创粉丝点击