您的位置:首页 > 编程语言 > Java开发

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

2014-04-19 11:23 176 查看
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实践......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: