第2章基于Spring+JDBC的用户管理系统
前面章节中为读者讲述了Spring的相关知识点,本章主要为读者讲解如何基于Spring进行Web应用程序开发。通过本章的学习,读者可以掌握DisplayTag、Sitemesh、Log4j、PostgreSQL、ehcache和国际化等的使用。
本章知识点
1. SiteMesh的使用
2. DisplayTag
3. 支持多种数据库
4. 国际化的试用
5. Log4j的使用
6. 集成Spring
7. JDBC的应用
Spring Web MVC
框架提供了大量独特的功能,包括
:
l
清晰的角色划分:控制器(
controller
)、验证器(
validator
)、命令对象(
command object
)、表单对象(
form object
)、模型对象(
model object
)、
Servlet
分发器(
DispatcherServlet
)、处理器映射(
handler mapping
)、视图解析器(
view resolver
)等等。
每一个角色都由一个专门的对象来完成。
l
强大而简单的配置:将框架类和应用类都作为
JavaBean
配置,支持在一个
context
中引用其他
context
的中
JavaBean
,例如,在
web
控制器中对业务对象和验证器(
validator
)的引用。
l
可适配、非侵入的
controller
:你可以根据不同的情况,选择合适的控制器子类(
simple
型、
command
型、
form
型、
wizard
型、
multi-action
型或者自定义),而不是从单一控制器(比如
Action/ActionForm
)继承。
l
可重用的业务代码:你可以使用现有的业务对象作为命令或表单对象,而不需要在类似
ActionForm
的子类中重复它们的定义。
l
可定制的
binding
和
validation
:比如将类型不匹配作为应用级的验证错误,这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
l
可定制的
handler mapping
和
view resolver
:
Spring
提供从最简单的的
URL
映射,到复杂的、专用的定制策略。某些
MVC
框架强制开发人员使用某一种方法,与之相比,
Spring
更加灵活。
l
可定制的本地化和主题(
theme
)解析:支持在
JSP
中可选择使用
Spring
标签库、支持
JSTL
、支持
Velocity
(不需要额外的中间层)等等。
l 简单而强大的标签库(Spring Tag Library):这个库支持诸如数据绑定和主题之类的功能。它提供在标记方面的最大灵活性。
l 新增加的表单标签库:在Spring2.0中刚刚引入的表单标签库,使得在JSP中编写表单更加容易。
l Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP
Session。准确的说,这个功能属于Sping MVC用到的
WebApplicationContext 容器,而不属于Spring MVC框架本身。
本系统以
Spring+JDBC
来实现
用户管理系统
,采用模块化设计,包含功能:
用户管理
功能实现了管理
用户管理系统
的
用户
功能,如
用户
的增加、修改、删除、按各种方式提供的查询。
通过对系统架构和功能的理解,下面为读者提供本系统的相关界面:
用户管理的首页,如图
2-2
所示:
图
2-2
用户管理系统
首页
单击上图中的用户管理菜单,如图
2-3
所示的界面:
图
2-3
用户管理菜单导航栏
单击上图中的按用户编码查询用户链接,如图
2-4
所示的界面:
图
2-4
按用户编码
查询用户界面
单击增加用户按钮,如图
2-5
所示的界面:
图
2-5
增加用户界面
选中列表中的用户,如图
2-6
所示的界面:
图
2-6
编辑用户界面
选中列表中的用户,单击删除按钮,如图
2-7
所示的界面:
图
2-7
删除用户界面
单击列表中的任何列进行用户数据排序,如图
2-7
所示的界面:
图
2-7
排序
单击列表中的任何列进行用户数据排序,如图
2-7
所示的界面:
图
2-7
分页
单击列表中的任何列进行用户数据排序,如图
2-7
所示的界面:
图
2-7
数据导出
下面为大家分析数据库逻辑结构设计。
表2-1所示为用户表,主要存储用户信息
字段
|
类型名称
|
是否为空
|
默认值
|
描述
|
Id
|
Bigint
|
否
|
|
序号
|
First_name
|
Varchar(50)
|
是
|
|
姓
|
Last_name
|
Varchar(50)
|
是
|
|
名
|
Birthday
|
timestamp
|
|
|
出生日期
|
创建app_user
表的SQL
如下:
create table app_user (id bigint not null primary key, first_name varchar(50), last_name varchar(50), birthday timestamp);
上面为读者讲述了如果完整开发一个模块的功能,关于本实例的其他功能和实现,读者参考上面部分,自行光盘中所附代码,下面为大家讲述本实例的目录结构,如图
2-8
所示:
图
2-8
本实例工程目录
其中,
1
、
.settings
为工程的默认目录,保存工程中的一些设置信息;
2
、
src
为工程的源代码文件目录,其中
a.
com.my37signals
为本实例的主要包名;
b.
com.my37signals.dao
包中存放所有接口类文件;
c.
com.my37signals.dao.jdbc
包中存放所有
Spring
实现类文件;
d.
com.my37signals.model
包中存放模型类文件;
e.
com.my37signals.service
包中存放服务类文件;
f.
com.my37signals.service.impl
包中存放服务实现类文件;
g.
com.my37signals.web
包中存放
Spring
的控制器类文件;
3
、
WebContent
为工程的
web
内容目录,主要存放
JSP
、
Lib
和相关配置文件,相关文件如下:
a)
404.jsp
,
404
错误显示网页;
b)
dataAccessFailure.jsp
,数据访问失败网页;
c)
error.jsp
,错误信息网页;
d)
index.jsp
,首页;
e)
messages.jsp
,信息显示网页;
f)
taglibs.jsp
,类库引入文件;
g)
userForm.jsp
,用户表单网页;
h)
userList.jsp
,用户列表网页;
i)
decorators/default.jsp
,系统布局控制网页;
j)
scripts
下存放系统所需
js
文件;
k)
images
下存放系统所需图片文件;
l)
styles
下存放样式表文件;
m)
WEB-INF/web.xml
,
Web
程序描述符文件;
n)
WEB-INF/action-servlet.xml
,
Spring
的控制配置文件;
o)
WEB-INF/applicationContext-jdbc.xml
,
Spring
的
JDBC
配置文件;
p)
WEB-INF/applicationContext-validation.xml
,
Spring
的客户端检测文件;
q)
WEB-INF/applicationContext.xml
,
Spring
配置文件;
r)
WEB-INF/decorators.xml
,程序布局配置文件;
s)
WEB-INF/sitemesh.xml
,
Sitemesh
配置文件;
t)
WEB-INF/validation.xml
,客户端检测文件;
u)
WEB-INF/validator-rules.xml
,客户端检测规则文件。
v)
WEB-INF/Classes
下存放程序编译后的类文件;
w)
WEB-INF/lib
下存放程序所需类库,如下:
i.
antlr-2.7.6rc1.jar
ii.
asm-1.5.3.jar
iii.
cglib-2.1_3.jar
iv.
commons-beanutils-1.7.0.jar
v.
commons-collections-3.1.jar
vi.
commons-digester-1.5.jar
vii.
commons-lang-2.1.jar
viii.
commons-logging-1.0.4.jar
ix.
commons-validator-1.1.3.jar
x.
displaytag-1.1.jar
xi.
dom4j-1.6.1.jar
xii.
dwr-1.0.jar
xiii.
ehcache-1.1.jar
xiv.
geronimo-spec-jta-1.0.1B-rc4.jar
xv.
hibernate-3.1.2.jar
xvi.
itext-1.3.jar
xvii.
jstl-1.1.2.jar
xviii.
log4j-1.2.11.jar
xix.
postgresql-8.1-404.jdbc3.jar
xx.
sitemesh-2.2.1.jar
xxi.
spring-1.2.6.jar
xxii.
springmodules-validator-0.1.jar
xxiii.
standard-1.1.2.jar
sitemesh
应用
Decorator
模式,用
filter
截取
request
和
response,
把页面组件
head,content,banner
结合为一个完整的视图。大多数时候,开发人员都是采用
JSP
提供的
include
标签在每个
jsp
页面包含各种
header, stylesheet, scripts and footer
,繁琐而不容易维护。
sitemesh
的出现,让开发人员更方便、更快捷建立系统的复合视图。
[J1]
Sitemesh
是由一个基于
Web
页面布局、装饰以及与现存
Web
应用整合的框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的
banner
,一致的版权,等等。它不仅仅能处理动态的
内容
,如
jsp
,
php
,
asp
等产生的
内容
,它也能处理静态的
内容
,如
htm
的
内容
,使得它的
内容
也符合你的页面结构的要求。甚至于它能将
HTML
文件象
include
那样将该文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是
GOF
的
Decorator
模式的最生动的实现。尽管它是由
java
语言来实现的,但它能与其他
Web
应用很好地集成。
从使用角度来看,
Tiles
似乎是
Sitemesh
标签
的一个翻版。其实
sitemesh
最强的一个特性是
sitemesh
将
decorator
模式用在过滤器上。任何需要被装饰的页面都不知道它要被谁装饰,所以它就可以用来装璜来自
php
、
asp
、
CGI
等产生的页面了。你可以定义若干个装饰器,根据参数动态地选择装饰器,产生动态的外观以满足你的需求。它也有一套功能强大的属性体系,它能帮助你构建功能强大而灵活的装饰器。相比较而言,在这方面
Tiles
就逊色许多。
一个请求到服务器后,如果该请求需要
sitemesh
装饰,服务器先解释被请求的资源,然后根据配置文件获得用于该请求的装饰器,最后用装饰器装饰被请求资源,将结果一同返回给客户端浏览器。
2.5.1.4 sitemesh的filter配置
为读者简单介绍了
sitemesh
的相关内容,下面进行相关配置的讲解。
首先,在
WEB-INF/web.xml
中加入以下
filter
的定义,代码例如清单
2-1
所示:
清单
2-1 web.xml
中
sitemesh
的
filter
配置
<
filter
>
<
filter-name
>
sitemesh
filter-name
>
<
filter-class
>
com.opensymphony.module.sitemesh.filter.PageFilter
filter-class
>
filter
>
<
filter-mapping
>
<
filter-name
>
sitemesh
filter-name
>
<
url-pattern
>
/*
url-pattern
>
<
dispatcher
>
REQUEST
dispatcher
>
<
dispatcher
>
FORWARD
dispatcher
>
filter-mapping
>
|
上述代码配置了
sitemesh
的过滤类
com.opensymphony.module.sitemesh.filter.PageFilter
,同时定义了
REQUEST
、
FORWARD
的分发。
读者访问
http://www.opensymphony.com/sitemesh/download.action
,下载
sitemesh
的最新版本
2.2.1
,将
sitemesh-2.2.1.jar
复制到
jdbc/WebContent/WEB-INF/lib
即可。
注意:读者只需下载
sitemesh
的
sitemesh-2.2.1.jar
即可。
2.5.1.6 装饰器配置decorators.xml
建立
WEB-INF/decorators.xml
描述各装饰器页面,代码例如
2-2
清单
:
清单
2-2 HibernateUtil.java
<
decorators
defaultdir
=
"/decorators"
>
<
decorator
name
=
"default"
page
=
"default.jsp"
>
<
pattern
>
/*
pattern
>
decorator
>
decorators
>
|
这里定义了缺省的目录装饰器页面目录
decorators
,定义了装饰器网页
default.jsp
。
2.5.1.7 sitemesh.xml配置文件的实现
sitemesh.xml为sitemesh的核心配置文件,代码例如清单2-3所示
:
清单
2-3 sitemesh.xml
<
sitemesh
>
<
property
name
=
"decorators-file"
value
=
"/WEB-INF/decorators.xml"
/>
<
excludes
file
=
"${decorators-file}"
/>
<
page-parsers
>
<
parser
default
=
"true"
class
=
"com.opensymphony.module.sitemesh.parser.HTMLPageParser"
/>
<
parser
content-type
=
"text/html"
class
=
"com.opensymphony.module.sitemesh.parser.HTMLPageParser"
/>
<
parser
content-type
=
"text/html;charset=ISO-8859-1"
class
=
"com.opensymphony.module.sitemesh.parser.HTMLPageParser"
/>
page-parsers
>
<
decorator-mappers
>
<
mapper
class
=
"com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper"
>
<
param
name
=
"config"
value
=
"${decorators-file}"
/>
mapper
>
decorator-mappers
>
sitemesh
>
|
sitemesh.xml定义了以下内容
:
1.
装饰器文件,如:
decorators-file
,值为
/WEB-INF/decorators.xml
;
2.
页面解析,如:
page-parsers
,包括:
a)
default
=
"true"
,缺省为
true
,表示所有页面都解析,指向的类为
com.opensymphony.module.sitemesh.parser.HTMLPageParser
;
b)
content-type
=
"text/html"
,表示
content-type
为
text/html
,指向的类为
com.opensymphony.module.sitemesh.parser.HTMLPageParser
;
c)
content-type
=
"text/html;charset=ISO-8859-1"
,表示
content-type
为
text/html
,同时指定
charset
为
ISO-8859-1
,指向的类为
com.opensymphony.module.sitemesh.parser.HTMLPageParser
。
3.
缺省装饰器映射,如:
decorator-mappers
,映射类为
com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper
,参数为
${decorators-file}
,也就是
/WEB-INF/decorators.xml
。
注意:关于
sitemesh
的配置,上面内容读者完全可以照做,根据实际需要,修改
default.jsp
的布局即可。
[J1]这张图需要替换,其中servlet-api.jar不需要