本节书摘来自异步社区《Spring 3.0就这么简单》一书中的第1章,第1.3节,作者: 陈雄华 , 林开雄著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.3 环境准备
1.3.1 创建库表
(1)启动MySQL数据库后,用DOS命令窗口登录数据库。
mysql>mysql –uroot –p1234 --port 3309
分别指定用户名和密码,MySQL默认运行在3306端口,如果不是运行在默认端口,需要通过--port参数指定端口号。
(2)运行以下脚本,创建实例对应的数据库。
mysql>DROP DATABASE IF EXISTS sampledb;
mysql>CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8;
mysql>USE sampledb;
数据库名为sampledb,默认字符集采用UTF-8。
(3)创建实例所用的两张表。
##创建用户表
mysql>CREATE TABLE t_user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(30),
password VARCHAR(32),
last_visit datetime,
last_ip VARCHAR(23)
)ENGINE=InnoDB;
##创建用户登录日志表
mysql>CREATE TABLE t_login_log (
login_log_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
ip VARCHAR(23),
login_datetime datetime
)ENGINE=InnoDB;
t_user表为用户信息表,t_login_log为用户登录日志表。其中ENGINE=InnoDB指定表的引擎为InnoDB类型,该类型表支持事务。MySQL默认采用MyISAM引擎,该类型表不支持事务,仅存储数据,优点在于读写很快。对于景区网站型应用系统的表来说,大可使用不支持事务的MyISAM引擎,但本书出于演示事务的目的,所有表均采用支持事务的InnoDB引擎。
(4)初始化一条数据,用户名/密码为admin/123456。
##插入初始化数据
mysql>INSERT INTO t_user (user_name,password) VALUES('admin','123456');
mysql>COMMIT;
用户也可以直接运行脚本文件来完成以上所有工作,创建数据库表的脚本文件位于chapter1/src/main/schema/sampledb.sql,下面提供了两种运行脚本的方法。
直接通过mysql命令运行。
假设从github.com下载本书示例代码中的内容并复制到D:actionSpring目录下,则在DOS命令窗口中运行以下命令。
D:\> mysql -u root -p1234 --port 3309 <D:\actionSpring\chapter1\schema\sampledb.sql
也可以在登录MySQL后,通过source命令运行脚本。mysql>source D:\actionSpring\chapter1\src\main\schema\sampledb.sql
1.3.2 建立工程
考虑到IntelliJ IDEA 是一款非常优秀且强大的IDE工具,特别是对Maven等工具提供了良好支持,越来越受企业开发人员的喜爱。本书的所有示例都采用IDEA(11.0版本)进行开发。将IDEA的工作空间设置于D:actionSpring,为了避免因路径不一致而引起的各种问题,请尽量保证工作空间和本书的路径一致。示例工程源文件和配置文件都使用UTF-8编码格式,UTF-8可以很好地解决国际化问题,同时避免不受欢迎的中文乱码问题,用户可以执行File→Settings→File Encodings命令将IDEA的工作空间编码格式设置为UTF-8编码格式。
在D:actionSpring中建立一个名为chapter的Maven主工程项目,如图1-4所示。
设置项目名称为chapter,项目路径为D:actionSpringchapter,并选择项目类型为Maven Module,单击Next按钮,进入Maven工程设置窗口,如图1-5所示。
设置Maven的GroupId为com.smart,ArtifactId为chapter,Version版本号为3.1-SNAPSHOT之后,单击Finish按钮完成主工程的创建,之后所有章节的代码示例将在这个主工程上以模块的方式进行创建。接下来,就可以创建本章示例的模块chapter1,可以通过File→New Module→Add Module对话框来实现,如图1-6所示。
选择Create module from scratch选项,并单击Next按钮进入模块设置窗口,如图1-7所示。
设置模块的名称为chapter1,选择类型为Maven Module,其他保持默认值即可,单击Next按钮,完成模块创建。后面所有章节的示例代码都将以Maven模块的方式进行创建,如第2章,模块的名称为chapter2,其他章节依次类推。创建之后工程模块的目录结构如图1-8所示。
图1-4 创建工程
图1-5 设置Maven工程
图1-6 创建Maven Module
图1-7 配置Module
图1-8 Maven工程目录结构
创建项目工程后,修改主工程模块的pom.xml文件,设置主工程模块标识、子模块公共依赖库等信息(关于pom.xm详细配置将在第9章中介绍),作为所有子模块父模块,如代码清单1-1所示。
代码清单1-1 主工程模块pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smart</groupId>
<artifactId>chapter</artifactId>
<packaging>pom</packaging>
<version>3.1-SNAPSHOT</version>
<name>Spring3.1</name>
<description>Spring3.1</description>
<properties>
<file.encoding>UTF-8</file.encoding>
<java.version>1.6</java.version>
<org.springframework.version>3.1.1.RELEASE</org.springframework.version>*
<mysql.version>5.1.6</mysql.version>**
…
</properties>
<modules>
<module>chapter1</module>
</modules>
</project>
配置了chapter主工程模块pom.xml之后,就开始配置在第1章模块chapter1中生成的pom.xml文件中配置项目工程中需要的依赖相关类库,如代码清单1-2所示。
代码清单1-2 chapter1模块pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/ xsd/maven-4.0.0.xsd">
<parent>
<groupId>actionspring</groupId>
<artifactId>chapter </artifactId>
<version>3.1-SNAPSHOT</version>
</parent> <!--引用父模块 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>chapter1</artifactId>
<version>3.1-SNAPSHOT</version>
<name>第一章示例</name>
<description>Spring 快速入门</description>
<packaging>war</packaging>
<dependencies>
<!--依赖的Spring模块类库 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version> ${org.springframework.version} </version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version> ${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- 依赖的持久化类库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--依赖的公共模块类库-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectjweaver.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>com.springsource.org.apache.commons.logging</artifactId>
<version>${apache.commons.version}</version>
</dependency>
<dependency>
<groupId>fakepath</groupId>
<artifactId>com.springsource.net.sf.cglib</artifactId>
<version>1.1.3</version>
</dependency>
<!--依赖的Web模块类库-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-api.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
</dependencies>
</project>
配置了主工程模块 chapter 及第 1 章子模块chapter1 的模块信息之后,单击 IDEA 工程右边的Maven Projects 选项卡,弹出Maven项目的管理窗口。IDEA提供了非常友好的Maven项目管理界面,如图 1-9 所示,单击管理窗口中的刷新按钮,可以列出当前所有的Maven模块。每个模块都包含两个子节点Lifecycle及Dependencies,其中Lifecycle子节点下提供常用的Maven操作命令,如清理、验证、编译、测试、打包、部署等,Dependencies子节点列出当前模块所有依赖的类库。
图1-9 Maven项目的管理界面
1.3.3 类包及Spring配置文件规划
类包规划
类包以分层的方式进行组织,共划分为4个包,分别是dao、domain、service和web。领域对象从严格意义上讲属于业务层,但由于领域对象可能还同时被持久层和展现层共享,所以一般将其单独划分到一个包中,如图1-10所示。
单元测试的类包和程序的类包对应,但放置在不同的文件夹下,如图1-11所示。本实例仅对业务层的业务类进行单元测试。将程序类和测试类放置在物理不同的文件夹下,方便将来程序的打包和分发,因为测试类仅在开发时有用,无须包含到部署包中。在本章的后续内容中,读者将会看到如何用Maven工具进行程序打包,体会这种包及目录的设计结构所带来的好处。
实战经验
随着项目规模的增大,这种仅以分层思想规划的包结构马上就会显示出它的不足,一般情况下需要在业务模块包下,进一步按分层模块划分子包,如user/dao、user/service、viewspace/dao、viewspace/service等。对于由若干独立的子系统组成的大型应用,在业务分层包的前面一般还需要加上子系统的前缀。包的规划对于大型的应用特别重要,它直接关系到应用部署和分发的方便性。
图1-10 主程序包的规划
图1-11 测试包的规划
Spring配置文件规划
Spring可以将所有的配置信息统一到一个文件中,也可以放置到多个文件中。对于简单的应用来说,由于配置信息少,仅用一个配置文件就足以应付。随着应用规模的扩大,配置信息量的增多,仅仅使用一个配置文件往往难以满足要求,如果不进行仔细规划,就会给配置信息的查看和团队协作带来负面影响。
配置文件在团队协作时是资源争用的焦点,对于大型的应用一般要按模块进行划分,以在一定程度上降低争用,减少团队协作的版本控制冲突。因此,应用比较小时,直接采用一个applicationContext.xml配置文件即可。