程序天下--J2EE整合详解与典型案例:一本书搞定Struts+Spring+Hi
当前章节: 内容管理系统
14.1 系统概述
内容管理系统主要有用户注册和登录,管理员能设定内容类别、发布内容,普通人员能浏览新闻的功能。
因为篇幅和排版所限,此处不再使用可行性分析标准的模板来编写可行性分析报告,只是列出几个可行性分析报告中的重点。
1.内容管理系统的开发背景
如今,跨地域、集团式管理的企业越来越多,要在整个集团范围内发布一个新闻或公告,虽然可以通过电话或传真的方式来实现,但要让企业员工及时了解这些新闻或公告,仍然比较麻烦,要花费很大的时间和费用。其实,就算是在一个企业内部,要发布一个新闻或公告,如采用板报、报纸,费用和时间成本也不少。
如果企业内部有一个内容管理系统,企业要发布新闻或公告时,就可以发布在内容管理系统里,而员工也可以通过网络到内容管理系统里查看相关的新闻和公告,既方便又快捷,成本还低,因此建议开发内容管理系统。
2.内容管理系统的风险分析
业务人员希望只有管理员才可以发布和管理内容,而普通员工只能浏览已经发布的内容。经过分析,这里采用权限控制的方式,只有授权的用户才可以发布和管理内容,如果管理员没有登录,就不能发布和管理内容。
业务人员希望两周即可开发完成并投入使用,因此担心开发人员的人力投入问题能否得到解决。经过分析,信息化部门决定投入两个熟练的开发人员来开发内容管理系统,以确保能够按时完成内容管理系统的开发。
业务人员如果担心大量的员工同时浏览内容管理系统上发布的新闻和公告,速度会很慢,引起员工的抱怨。经过研究决定,采用数据库连接池来提供浏览新闻的速度,必要时采用自动生成静态页面的方式。另外,由信息化部门购买新的服务器,并在两周内到货,以保证浏览内容时的速度。
3.内容管理系统的开发计划
可行性分析:张三、1天
需求分析:张三、1天
设计:李四、1天
编码:李四、4天
测试:张三、1天
部署:张三、0.5天
共计8.5天,大约2周的工作日时间。
4.可行性分析的结论
经过调查,认为内容管理系统可以进行开发。
14.2 需求分析
经过可行性分析,认为内容管理系统可以进行开发,接下来,需求人员张三开始进行需求分析。
14.2.1 系统用例图
经过和业务人员1天的讨论,最终确定了如下需求。
管理员可以设定内容类别。
管理员可以发布和管理内容。
每个人都可以浏览内容。
内容管理系统用例图如图14.1所示。内容管理系统中发布内容的子用例图如图14.2所示。

图14.1 内容管理系统用例图 图14.2 内容管理系统中发布内容的子用例图
14.2.2 需求规格说明书
下面以用例的方式来展示需求规格说明书,共有5个用例,分别是:管理内容类别、发布和管理内容、注册用户、登录系统和浏览已发布内容。
管理内容类别用例,主要是讲设定内容类别的步骤,如表14.1所示。
表14.1 管理内容类别
|
用例ID号 |
UC-1 |
|
用例名称 |
管理内容类别 |
|
执行者 |
管理员 |
续表
|
用例ID号 |
UC-1 |
|
描述 |
管理员在发布内容前,要先设定好内容类别,这样在发布内容时,就可以选择要发布内容所属的类别了。 |
|
涉众利益 |
管理员希望能内容类别不要重复。 |
|
前置条件 |
管理员已登录内容管理系统 |
|
后置条件 |
管理员已经设定了内容类别 |
|
基本路径 |
1.管理员请求设定内容类别 2.系统显示已有的内容类别 3.管理员填写内容类别的名称 4.管理员提交内容类别的名称 5.系统验证提交的内容类别的名称 6.系统保存提交的内容类别的名称 7.系统返回保存成功的信息 |
|
扩展路径 |
5a. 验证失败 5a1. 系统提示验证不通过的信息 5a2. 管理员重新填写验证不通过的信息 5a3. 返回到第4步 |
|
包含 |
- |
|
优先级 |
高 |
|
业务规则 |
5.验证内容类别的名称是否和已有的内容类别名称重复 |
|
设计约束 |
|
|
非功能性需求 |
|
|
字段列表 |
|
发布和管理内容用例,主要是讲管理员在制定完内容类别后,发布和管理内容的步骤,如表14.2所示。
表14.2 发布和管理内容
|
用例ID号 |
UC-2 |
|
用例名称 |
发布和管理内容 |
|
执行者 |
管理员 |
|
描述 |
管理员在制定完内容类别后,就可以发布和管理内容了。 |
|
涉众利益 |
管理员担心普通员工也能发布内容。 |
|
前置条件 |
管理员已经登录了系统,并设定了内容类别的基本信息 |
|
后置条件 |
管理员已经发布了内容 |
|
基本路径 |
1.管理员请求发布内容 2.管理员填写内容的相关属性 3.管理员提交内容的相关属性 4.系统验证提交的内容的相关属性 5.系统返回保存成功的信息 |
|
扩展路径 |
4a. 验证失败 4a1. 系统提示验证不通过的信息 |
续表
|
用例ID号 |
UC-2 |
|
扩展路径 |
4a2. 管理员重新填写验证不通过的信息 4a3. 返回到第5步 |
|
包含 |
- |
|
优先级 |
高 |
|
业务规则 |
4.内容所属的类别必须选择,内容标题和正文必须填写 |
|
设计约束 |
|
|
非功能性需求 |
|
|
字段列表 |
内容的相关信息=内容标题+内容正文+内容类别+发布日期 |
注册用户用例,主要是讲注册的步骤,如表14.3所示。
表14.3 注册用户
|
用例ID号 |
UC-3 |
|
用例名称 |
注册用户 |
|
执行者 |
管理员 |
|
描述 |
发布内容和设定内容类别的员工,必须是已经注册的用户 |
|
涉众利益 |
用户希望注册过程越简单越好,担心自己的信息被用于其他用途; 管理员希望用户必须要注册工号和密码 |
|
前置条件 |
用户访问注册系统 |
|
后置条件 |
系统已经记录用户的注册信息 |
|
基本路径 |
1.用户请求注册 2.系统显示注册画面 3.用户填写注册信息 4.用户提交注册信息 5.系统验证注册信息 6.系统保存注册信息 7.系统返回保存成功的信息 |
|
扩展路径 |
5a. 验证失败 5a1. 系统提示验证不通过的信息 5a2. 管理员重新填写验证不通过的信息 5a3. 返回到第4步 |
|
包含 |
- |
|
优先级 |
高 |
|
业务规则 |
5.工号和密码必填 |
|
设计约束 |
注册画面有保护注册用户隐私的声明 |
|
非功能性需求 |
|
|
字段列表 |
3.注册信息=工号+密码 |
登录系统用例,主要是讲员工在进行内容发布和设定内容类别之前登录的步骤,如表14.4所示。
表14.4 登录系统
|
用例ID号 |
UC-4 |
|
用例名称 |
登录系统 |
|
执行者 |
普通员工 |
|
描述 |
员工要进行内容发布和设定内容类别,必须先登录 |
|
涉众利益 |
用户希望登录过程越简单越好; 管理员担心非法登录 |
|
前置条件 |
用户访问登录系统 |
|
后置条件 |
系统转入设定内容类别的画面 |
|
基本路径 |
1.用户请求登录 2.系统显示登录画面 3.用户填写登录信息 4.用户提交登录信息 5.系统验证登录信息 6.系统显示登录成功 7.系统转入设定内容类别的画面 |
|
扩展路径 |
5a. 验证失败 5a1. 系统提示验证不通过的信息 5a2. 管理员重新填写验证不通过的信息 5a3. 返回到第4步 |
|
包含 |
- |
|
优先级 |
高 |
|
业务规则 |
5.工号和密码必填 |
|
设计约束 |
|
|
非功能性需求 |
|
|
字段列表 |
3.登录信息=工号+密码 |
浏览已发布的内容用例,主要是讲员工通过网页来浏览已经发布的内容的方式,如表14.5所示。
表14.5 浏览已发布的内容
|
用例ID号 |
UC-5 |
|
用例名称 |
浏览已发布的内容 |
|
执行者 |
普通员工 |
|
描述 |
员工通过网页来浏览已经发布的内容 |
|
涉众利益 |
用户希望能在一页查看所有类别的内容 |
|
前置条件 |
管理员已经发布了内容 |
|
后置条件 |
|
|
基本路径 |
1.用户请求查看已经发布的内容 2.系统按照内容类别显示已经发布的内容 |
|
扩展路径 |
|
续表
|
用例ID号 |
UC-5 |
|
包含 |
- |
|
优先级 |
高 |
|
业务规则 |
|
|
设计约束 |
|
|
非功能性需求 |
|
|
字段列表 |
|
通过用例图,读者就可以很清楚地看到内容管理系统将要实现的功能,以及具体执行的角色。而对于界面细节,UML图并不能提供更多的帮助,因此可以使用界面原型的方法来进一步确认用户的需求。有了前面这些用例,经过评审之后,接下来就可以开始进行系统设计了。
14.3 系统设计
这里的系统设计,主要包括视图层、控制层、业务逻辑层和持久层的设计。
14.3.1 设计视图层
从前面的需求描述可以知道,这个示例需要如下一些页面:设定内容类别的页面type.htm、发布内容的页面edit.htm、浏览内容的页面index.htm、用户注册页面regedit.htm、用户登录页面login.htm,具体实现思路如下:
设定内容类别的页面type.htm,如图14.3所示。

图14.3 设定内容类别的页面
该页面主要用来完成设定内容类别的功能,管理员输入内容类别,然后单击“新增”按钮,即可完成对内容类别的设定。type.htm的源代码如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>内容管理系统之内容类别设定</title>
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="">
<table width="776" border="1">
<tr>
<td height="38" colspan="2"><div align="center">内容类别设定『<span class="style1">消息提示:</span>』</div></td>
</tr>
<tr>
<td><div align="right">内容类别名称:</div></td>
<td><input type="text" name="textfield"></td>
</tr>
<tr>
<td colspan="2"><div align="center"></div> <div align="center">
<input type="submit" name="Submit" value="新增">
<input type="submit" name="Submit" value="修改">
<input type="submit" name="Submit" value="删除">
</div></td>
</tr>
</table>
</form>
</body>
</html>
发布内容的页面edit.htm,如图14.4所示。

图14.4 发布内容的页面
该页面主要用来完成发布和管理内容的功能,管理员输入内容标题、正文,选择内容类别,然后单击“新增”按钮,即可完成对内容的发布。edit.htm的源代码如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>内容管理系统之内容发布</title>
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data" name="form1">
<table width="100%" border="1">
<tr>
<td height="17" colspan="2"><div align="center">内容发布『<span class="style1">消息提示:</span>』</div></td>
</tr>
<tr>
<td width="320"> <div align="right">内容标题:</div></td>
<td width="440"><input name="textfield" type="text" size="100" maxlength="100"></td>
</tr>
<tr>
<td><div align="right">内容正文:</div></td>
<td><textarea id="content" name="content" cols="76" rows="17" ></textarea> </td>
</tr>
<tr>
<td><div align="right">内容类别:</div></td>
<td><select name="select">
<option value="0">公告栏</option>
<option value="1">图片新闻</option>
<option value="2">会议纪要</option>
<option value="3">竞争情报</option>
</select></td>
</tr>
<tr>
<td><div align="right">发布日期:</div></td>
<td>2007年1月1日12点5分</td>
</tr>
<tr>
<td><div align="right">发布人:</div></td>
<td>gf2008</td>
</tr>
<tr>
<td colspan="2"><div align="center"></div> <div align="center">
<input type="submit" name="Submit" value="发布">
<input type="submit" name="Submit" value="修改">
<input type="submit" name="Submit" value="删除">
</div></td>
</tr>
</table>
</form>
</body>
</html>
浏览内容的页面index.htm,如图14.5所示。

图14.5 浏览内容的页面
该页面主要用来完成浏览内容的功能,管理员请求浏览已经发布的内容,系统按照内容类别显示已经发布的内容。index.htm的源代码如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
<html>
<head>
<title>内网首页</title>
<style>
*{font-size:12px}
.style1 {
font-size: x-large;
font-weight: bold;
}
</style>
</head>
<body >
<div align="center" class="style1" style='float:left;width:100%;height:10%;border: 1px solid #BA5B57;' >
内网首页
</div>
<table width="100%" border="1" cellpadding="0" cellspacing="0" >
<tr >
<td height="20"><strong>图片新闻</strong></td>
<td><strong>公告栏</strong></td>
</tr>
<tr >
<td height="150"><ol>
<li>××子公司新产品试制成功</li>
<li>××子公司新产品试制成功</li>
<li>××子公司新产品试制成功</li>
<li>××子公司新产品试制成功</li>
<li>××子公司新产品试制成功</li>
</ol></td>
<td><ol>
<li>控股公司五一值班安排</li>
<li>控股公司五一值班安排</li>
<li>控股公司五一值班安排</li>
<li>控股公司五一值班安排</li>
<li>控股公司五一值班安排</li>
</ol></td>
</tr>
<tr style=" border-top-width:0">
<td height="15" style=" border-top-width:0"><div style='width:100%;border: 1px solid red;' align='right'>
<a href="type.htm">更多内容</a>
</div></td>
<td style=" border-top-width:0"><div style='width:100%;border: 1px solid red;' align='right'>
<a href="type.htm">更多内容</a>
</div></td>
</tr>
<tr>
<td height="20"><strong>会议纪要</strong></td>
<td><strong>竞争情报</strong></td>
</tr>
<tr>
<td height="150"><ol>
<li>质量系统推进会议纪要</li>
<li>质量系统推进会议纪要</li>
<li>质量系统推进会议纪要</li>
<li>质量系统推进会议纪要</li>
<li>质量系统推进会议纪要</li>
</ol></td>
<td><ol>
<li>跨省兼并方兴未艾</li>
<li>跨省兼并方兴未艾</li>
<li>跨省兼并方兴未艾</li>
<li>跨省兼并方兴未艾</li>
<li>跨省兼并方兴未艾</li>
</ol></td>
</tr>
<tr >
<td height="15" style=" border-top-width:0"><div style='width:100%;border: 1px solid red;' align='right'>
<a href="type.htm">更多内容</a>
</div></td>
<td style=" border-top-width:0"><div style='width:100%;border: 1px solid red;' align='right'>
<a href="type.htm">更多内容</a>
</div></td>
</tr>
</table>
</body>
</html>
用户注册页面regedit.htm,如图14.6所示。
●

图14.6 用户注册的页面
该页面主要用来完成用户注册功能,用户输入用户名和密码以确认,如果用户名已经被注册将给出消息提示。regedit.htm的源代码如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>内容管理系统之用户注册</title>
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="">
<table width="776" border="1">
<tr>
<td colspan="2"><div align="center">用户注册『<span class="style1">消息提示:</span>』</div></td>
</tr>
<tr>
<td><div align="right">用户名:</div></td>
<td><input type="text" name="textfield"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="textfield"></td>
</tr>
<tr>
<td colspan="2"><div align="center"></div> <div align="center">
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit" value="重置">
</div></td>
</tr>
</table>
</form>
</body>
</html>
用户登录页面login.htm,如图14.7所示。

图14.7 用户登录的页面
该页面主要用来完成用户登录功能,用户输入用户名和密码以登录,如果用户名或密码不正确,将给出消息提示。login.htm的源代码如下所示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>用户登录</title>
<style type="text/css">
<!--
.style1 {
color: #FF0000;
font-weight: bold;
}
-->
</style>
</head>
<body>
<form name="form1" method="post" action="">
<table width="776" border="1">
<tr>
<td height="38" colspan="2"><div align="center">用户登录『<span class="style1">消息提示:</span>』</div></td>
</tr>
<tr>
<td width="320"><div align="right">用户名:</div></td>
<td width="440"><input type="text" name="textfield"></td>
</tr>
<tr>
<td><div align="right">密码:</div></td>
<td><input type="password" name="textfield"></td>
</tr>
<tr>
<td colspan="2"><div align="center"></div> <div align="center">
<input type="submit" name="Submit" value="登录">
<input type="reset" name="Submit" value="重置">
</div></td>
</tr>
</table>
</form>
</body>
</html>
14.3.2 设计持久层
在介绍控制层的设计之前,这里先列出整个内容管理系统的整体包结构图,如图14.8所示。
这里的包com.myEdition.action用来存放控制器类,包com.myEdition.domain用来存放业务逻辑接口类,包com.myEdition.domain.impl用来存放业务逻辑实体类,包com.myEdition.dao用来存放DAO接口类,包com.myEdition.dao.impl用来存放DAO实体类,包com.myEdition. bean用来存放持久层类。
根据前面的用例图,可以看出这里共需要3个持久层类,分别是:用户类、内容类别类、内容类。其持久层的类如图14.9所示。
经过分析可以知道,在该应用中,主要有用户、内容类别、内容等需要存储,所以对数据库表的设计也主要从这几个方面来考虑。
存储用户信息的表,表名为user,主要字段有:id,username,password,主键为id。
存储内容类别的表,表名为contentType,主要字段有:id,name,主键为id。
存储内容的表,表名为content,主要字段有:id,title,content,contentType,date,userId,主键为id。

图14.8 内容管理系统的整体包结构图 图14.9 持久层的类图
下面建立数据库表。通过Xampp来建立MySql数据库的步骤如下:
打开Xampp的控制台,启动MySql和apache,如图14.10所示。

图14.10 启动MySql和apache
启动mysql和apache后,在浏览器地址栏输入http://localhost/phpmyadmin/,进入phpmyadmin的管理画面,如图14.11所示。

图14.11 phpmyadmin的管理画面
选择“MySQL连接校对”为“gbk_bin”,目的是为了防止产生乱码。在“创建一个新的数据库”下面的文本框中输入myEdition,“整理”也选择“gbk_bin”,然后单击“创建”按钮,即可创建数据库myEdition,如图14.12所示。
创建数据库myEdition后,将进入创建数据库表的画面,这里创建一个存储用户信息的表,表名为user,主要包括3个字段,创建user表的向导如图14.13所示。
单击创建user表的向导画面的“执行”按钮,出现设定user表字段的画面,如图14.14所示。

图14.12 创建数据库myEdition

图14.13 创建user表的向导

图14.14 设定user表字段的画面
输入字段名称:id,username,password,其中id为整型,其他两个为varchar类型,长度为10,主键为id,自动增长型,然后单击“保存”按钮,创建user表,生成的sql语句如下所示:
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 10 ) CHARACTER SET gbk COLLATE gbk_bin NOT NULL ,
`password` VARCHAR( 10 ) NOT NULL)
ENGINE = MYISAM ;
最终的user表结构如图14.15所示。

图14.15 user表结构
单击上述画面最上方的数据库:myEdition,出现继续创建数据库表的画面,如图14.16所示。

图14.16 继续创建数据库表的画面
创建一个内容类别的表,表名为contentType,主要包括2个字段,然后单击“执行”按钮,出现设定contentType表字段的画面,如图14.17所示。

图14.17 设定contentType表字段的画面
输入字段名称:id,name,其中id为整型,name为varchar类型,长度分别为4,50,主键为id,自动增长型,然后单击“保存”按钮,创建contentType表,生成的sql语句如下所示。
CREATE TABLE `contentType` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 50 ) CHARACTER SET gbk COLLATE gbk_bin NOT NULL
) ENGINE = MYISAM ;
最终的contentType表结构如图14.18所示。

图14.18 最终的contentType表结构
单击上述画面最上方的数据库:myEdition,将出现继续创建数据库表的画面,如图14.19所示。

图14.19 继续创建数据库表的画面
创建一个存储内容的表,表名为content,主要包括6个字段,然后单击“执行”按钮,出现设定content表字段的画面,如图14.20所示。

图14.20 设定content表字段的画面
输入字段名称:id,title,content,contentType,date,userId,id为int类型,title和content为varchar类型,contentType为int类型,date为varchar类型,userId为int类型,长度分别为4,50,5000,4,10,4,主键为id,自动增长类型,然后单击“保存”按钮,创建content表,生成的sql语句如下所示:
CREATE TABLE `content` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 50 ) CHARACTER SET gbk COLLATE gbk_bin NOT NULL ,
`content` VARCHAR( 5000 ) CHARACTER SET gbk COLLATE gbk_bin NOT NULL ,
`contentType` INT( 4 ) NOT NULL ,
`date` VARCHAR( 10 ) NOT NULL ,
`userId` INT( 4 ) NOT NULL
) ENGINE = MYISAM ;
最终的content表结构如图14.21所示。

图14.21 content表结构
至此,3个表已经建立完毕,下面来设计DAO层的类。首先来看com.myEdition.dao包中的接口整体类图,如图14.22所示。再来看com.myEdition.dao.impl包中的DAO实体类图,如图14.23所示。

图14.22 com.myEdition.dao包中的接口整体类图

图14.23 com.myEdition.dao.impl包中的DAO实体类图
14.3.3 设计业务逻辑层
下面来设计业务逻辑层的类,首先来看com.myEdition.domain包中的业务逻辑接口整体类图,如图14.24所示。
再来看com.myEdition.domain.impl包中的业务逻辑实体整体类图,如图14.25所示。

图14.24 com.myEdition.domain包中的 图14.25 com.myEdition.domain.impl包中
业务逻辑接口整体类图 的业务逻辑实体整体类图
14.3.4 设计控制层
下面来设计业务逻辑层的类,首先来看com.myEdition.action包中的控制器整体类图,如图14.26所示。

图14.26 com.myEdition.action包中的控制器整体类图
14.4 架构设计和环境搭配
前面进行了需求分析和系统设计,下面主要进行架构设计和环境搭配,这里主要讲解如何选择架构、搭建环境,以及如何建立Ant文件和web.xml文件。
14.4.1 内容管理系统采用的架构
这里的内容管理系统采用Struts+Spring+Hibernate的架构来进行开发。
14.4.2 在Eclipse下建立项目myEdition
这里需要用到Struts,Spring和Hibernate的相关jar,还要使用JUnit,Ant和Log4j,具体实现思路如下:首先在Eclipse中建立一个项目myEdition,然后把Struts,Spring和Hibernate的相关jar配置到该项目中,最后在项目中建立6个包。
其中com.myEdition.action用来存放控制器类、com.myEdition.bean用来存放实体类、com.myEdition.domain用来存放业务逻辑接口类、com.myEdition.domain.impl用来存放业务逻辑实体类、com.myEdition.dao用来存放DAO接口类、com.myEdition.dao.impl用来存放DAO的实体类,具体步骤如下:
运行Eclipse,单击菜单栏中的“File”命令,Eclipse将显示“File”命令。
移动鼠标到“New”,在出现的子菜单中单击“Project”,Eclipse将弹出“New Project”对话框,如图14.27所示。
用鼠标选择列表框中“Java”下的“Tomcat Project”,然后单击“Next”按钮。将弹出“New Tomcat Project”对话框,如图14.28所示。

图14.27 “New Project”对话框 图14.28 “New Tomcat Project”对话框
在“New Tomcat Project”对话框中的“Project name”文本框中输入“myEdition”,然后单击“Finish”按钮,项目即建立成功,myEdition的目录结构如图14.29所示。
在myEdition上单击鼠标右键,在弹出的菜单中,将鼠标移动到“New”下子菜单中的“Package”,单击“Package”,将弹出“New Java Package”对话框,如图14.30所示。

图14.29 myEdition的目录结构 图14.30 “New Java Package”对话框
在“New Java
Package”对话框中的“Name”文本框中输入“com.myEdition.action”,然后单击“Finish”按钮,即可建立com.myEdition.action包。
用同样的方法建立com.myEdition.bean,com.myEdition.domain,com.myEdition.domain.
impl,com.myEdition.dao,com.myEdition.dao.impl。
在myEdition上单击鼠标右键,在弹出的菜单中,将鼠标移动到“New”下子菜单中的“Folder”,单击“Folder”,弹出“New Folder”对话框,如图14.31所示。
在“New Folder”对话框中的“Folder Name”文本框中输入“jsp”,然后单击“Finish”按钮,即可建立jsp文件夹。
把struts-core-1.3.8.jar,struts-extras-1.3.8.jar,struts-el-1.3.8.jar,struts-faces-1.3.8.jar,struts-
mailreader-dao-1.3.8.jar,struts-scripting-1.3.8.jar,struts-taglib-1.3.8.jar,struts-tiles-1.3.8.jar,common-s-beanutils-1.7.0.jar,commons-chain-1.1.jar,commons-digester-1.6.jar,spring.jar,spring-hibernate3.jar,hibernate3.jar,antlr-2.7.6.jar,asm.jar,asm-attrs.jars,cglib-2.1.3.jar,commons-collections-2.1.1.jar,commons-logging-1.0.4.jar,log4j-1.2.11.jar,dom4j-1.6.1.jar,ehcache-1.2.3.jar,jta.jar,mysql-connector-java-5.0.0-beta-bin.jar,将这25个jar放在\WEB-INF\ib\下复制到myEdition\WEB-INF\lib目录下,即CLASSPATH中。
在myEdition上单击右键,选择“Properties”命令,将弹出“Properties for myEdition”对话框,如图14.32所示。

图14.31 “New Folder”对话框 图14.32 “Properties for myEdition”对话框
在对话框左边的树形菜单中,单击“Java Build Path”,系统将在“Properties for myEdition”对话框的右边出现“Java Build Path”的相关属性,如图14.33所示。
在“Libraries”标签中,单击“Add JARs…”按钮,弹出“JAR Selection”对话框,如图14.34所示。

图14.33 “Java Build Path”的相关属性 图14.34 “JAR Selection”对话框
在“JAR Selection”对话框中,单击“myEdition”,打开树形菜单,如图14.35所示。
在打开的树形菜单中,选择struts-core-1.3.8.jar,struts-extras-1.3.8.jar,struts-el-1.3.8.jar,
struts-faces-1.3.8.jar,struts-mailreader-dao-1.3.8.jar,struts-scripting-1.3.8.jar,struts-taglib-1.3.8.jar, struts-tiles-1.3.8.jar,commons-beanutils-1.7.0.jar,commons-chain-1.1.jar,commons-digester-1.6.jar,
spring.jar,spring-hibernate3.jar,hibernate3.jar,antlr-2.7.6.jar,asm.jar,asm-attrs.jars,cglib-2.1.3.jar,commons-collections-2.1.1.jar,commons-logging-1.0.4.jar,log4j-1.2.11.jar,dom4j-1.6.1.jar,ehcache-1.2.3.jar,jta.jar,mysql-connector-java-5.0.0-beta-bin.jar,按住“Ctrl”键,选中这25个jar,然后单击“OK”按钮,返回“Properties for myEdition”对话框,如图14.36所示。

图14.35 打开树形菜单 图14.36 “Properties for myEdition”对话框
在“Properties for myEdition”对话框,单击“OK”按钮,即可将上述25个jar加入到CLASSPATH中,完成对Struts,Spring和Hibernate的配置。
用Windows自带的文本编辑器建立一个文件log4j.properties,把log4j.properties放到myEdition\WEB-INF\src目录下。
编辑log4j.properties文件,内容如下:
log4j.rootLogger=DEBUG,stdout,R
log4j.rootLogger=DEBUG,stdout,R
log4j.logger.org=ERROR, A1
log4j.logger.com. myEdition=DEBUG,A2
#A1应用于文件回滚
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.File=org.log
log4j.appender.A1.MaxFileSize=500KB
log4j.appender.A1.MaxBackupIndex=50
log4j.appender.A1.Append=true
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} - [%p] [%C{1}] - %m%n
#A2应用于文件回滚
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=gc.log
log4j.appender.A2.MaxFileSize=500KB
log4j.appender.A2.MaxBackupIndex=50
log4j.appender.A2.Append=true
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{ISO8601} - [%p] [%C{1}] - %m%n
#stdout应用于控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %c - %m%n
#--------------------R应用于按天产生文件--------------------------------
#log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#this log file will be stored in web server's /bin directory,modify to your path which want to store.
log4j.appender.R.File=myContent.log
#log4j.appender.R.datePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.R.datePattern='.'yyyy-MM-dd
log4j.appender.R.append=true
## Keep one backup file
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %c - %m%n
#[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
14.4.3 编写本项目的Ant build文件
在myEdition目录下新建一个Ant文件build.xml,示例代码如下:
<?xml version="1.0"?>
<!--配置myEdition的Ant文件,将myEdition包中的内容打成jar -->
<project name="myEdition" default="init" basedir=".">
<property name="myEdition.home" value="." />
<property name="myEdition.lib" value="${myEdition.home}/WEB-INF/lib" />
<property name="myEdition.jar" value="${myEdition.home}/WEB-INF/lib" />
<property name="myEdition.classes" value="${myEdition.home}/WEB-INF/classes" />
<!--配置使用Tomcat所在的目录 -->
<property name="tomcat.home" value="D\:/apache-tomcat-6.0.2" />
<!--<property file="build.properties" />以上内容还可以定义在build.properties中-->
<target name="init">
<path id="all">
<!--初始化时需要使用的jar -->
<fileset dir="${myEdition.lib}">
<include name="**/*.jar" />
</fileset>
<!--初始化时需要使用的jar -->
<fileset dir="${tomcat.home}/common/lib">
<include name="*.jar" />
</fileset>
</path>
<mkdir dir="${myEdition.classes}" />
</target>
<!--清空生成的calss -->
<target name="clean">
<delete dir="${myEdition.classes}">
</delete>
</target>
<!--编译时需要依赖与初始化的结果 -->
<target name="compile" depends="init">
<!--编译时使用的版本是1.5 -->
<javac srcdir="${myEdition.home}/WEB-INF/src" destdir="${myEdition.classes}" target="1.5">
<classpath refid="all" />
</javac>
</target>
<!--com. myEdition包下的代码打成加,命名为myEdition.jar -->
<target name="jar" depends="compile">
<jar jarfile="${myEdition.jar}/myEdition.jar" basedir="${myEdition.classes}" includes="com/myEdition/**">
</jar>
</target>
<!--将myEdition项目打成war文件-->
<target name="war" depends="jar">
<war destfile="${myEdition.home}/myEdition.war" webxml="${myEdition.home}/WEB-INF/web.xml">
<fileset dir="${myEdition.home}" casesensitive="yes">
<include name="WEB-INF/**" />
<exclude name="*.war" />
</fileset>
<!--所依赖的jar-->
<lib dir="${myEdition.home}/WEB-INF/lib">
<include name="*.jar" />
</lib>
</war>
</target>
</project>
14.4.4 配置本项目的web.xml文件
在myEdition\WEB-INF目录下,建立web.xml文件,web.xml的示例代码如下所示:
<?xml version="1.0" encoding="GBK"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>actionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!--初始参数-->
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--处理所有后缀为do的请求-->
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
最终配置好Struts,Spring和Hibernate的myEdition项目的目录结构,如图14.37所示。




