前面章节中为读者讲述了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 | | | 出生日期 |
上面为读者讲述了如果完整开发一个模块的功能,关于本实例的其他功能和实现,读者参考上面部分,自行光盘中所附代码,下面为大家讲述本实例的目录结构,如图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标签<page:applyDecorator>的一个翻版。其实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不需要