《揭秘J2EE项目开发的70个问题》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:戎伟,孟劼,苏威编著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2008
  • ISBN:9787115167132
  • 页数:497 页
图书介绍:本书以软件项目生命周期各个阶段的问题为主线,从需求分析师、设计师、程序员三种不同角色的角度出发,提出问题,解决问题。书中给出各种有价值的经验、实践参考,给出不同的解决方案并分析其优劣。本书所含盖的软件项目生命周期包括:需求阶段、分析阶段、设计阶段、开发阶段四个迭代部分,而开发阶段按照J2EE模型又依次分为:表示层、持久层、业务逻辑层。在本书中,涵盖了Struts、Spring、Hibernate、UML、Ajax等多个流行技术,并对他们的原理、难点进行了深入的阐述。

第1章 项目基础 1

1.1 问题:选择怎样的开发模式 1

1.1.1 瀑布模式和迭代模式 1

1.1.2 理解开发模式 1

1.1.3 4种常见的开发模式 2

1.1.4 串行式开发模式和瀑布式开发模式 2

1.1.5 迭代式开发模式和螺旋式迭代开发模式 3

1.1.6 增量式开发模式 3

1.1.7 并行式开发模式 4

1.1.8 开发模式之间的关系 5

1.1.9 结语 5

1.2 问题:B/S还是C/S 6

1.2.1 B/S架构存在的问题 6

1.2.2 从全局考虑项目 6

1.2.3 C/S架构 7

1.2.4 B/S架构 8

1.2.5 解决顾虑 9

1.3 问题:如何谈需求 10

1.3.1 慌乱的需求调研 10

1.3.2 需求调研的工作 10

1.3.3 准备需求调研 11

1.3.4 进行需求调研 11

1.3.5 需求调研的结果 13

1.3.6 需求调研的注意事项 13

1.4 问题:如何设计用例 13

1.4.1 用例的作用 13

1.4.2 用例模型和用例的种类 14

1.4.3 业务用例和系统用例基本图素的介绍 14

1.4.4 如何创建业务用例模型 15

1.4.5 如何创建系统用例模型 16

1.4.6 系统用例的示例一 16

1.4.7 系统用例的示例二 17

1.4.8 用例描述 18

1.5 问题:分析师如何看用例 19

1.5.1 用例不能清晰表达吗 19

1.5.2 另一张用例模型图 20

1.5.3 更多的用例模型画法 21

1.5.4 理解extend和include 21

1.5.5 正确的用例模型图 22

1.5.6 看图说话 22

1.6 问题:如何管理软件需求 23

1.6.1 软件需求的层次与关系 23

1.6.2 项目范围文档 24

1.6.3 用例文档 26

1.6.4 功能性需求文档 27

1.6.5 非功能性需求 28

1.7 问题:需求管理和开发 30

1.7.1 客户的需求观 30

1.7.2 软件需求的开发和管理 31

1.7.3 需求获取的过程 32

1.7.4 需求获取中出现冲突的解决方案 32

1.7.5 需求分析的过程 33

1.7.6 需求规格矩阵 34

1.7.7 需求管理 34

1.7.8 成果 35

1.8 问题:软件需求之验证和评审 35

1.8.1 需求验证和审核 36

1.8.2 评审的过程 37

1.8.3 评审的内容 37

1.8.4 需求评审的一些建议 38

1.9 问题:软件需求之风险管理 41

1.9.1 考虑风险 41

1.9.2 风险的知识 41

1.9.3 软件需求需要考虑的风险因素 42

1.10 问题:软件需求之变更和需求跟踪 43

1.10.1 需求变更可否采纳 43

1.10.2 需求变更的流程 44

1.10.3 需求变更的验证 44

1.10.4 需求跟踪的意义 45

1.11 问题:软件需求之软件过程改进 46

1.12 问题:找谁来调研 48

1.12.1 寻找用户代表的准备 48

1.12.2 用户代表的职责和资格 48

1.12.3 用户代表参与的其他工作 49

1.13 问题:获取需求的沟通途径 49

1.13.1 问卷调查 49

1.13.2 问卷调查的优点和适用性 50

1.13.3 会议讨论 50

1.13.4 会议讨论的过程 51

1.13.5 会议讨论的优缺点和解决方案 51

1.13.6 关联图 52

1.13.7 原型法 53

1.13.8 原型法的应用 53

1.13.9 原型构建的技巧和注意事项 54

1.14 问题:需求获取的注意事项 54

1.14.1 明确最终目的 54

1.14.2 调查需求的业务背景 55

1.14.3 反复沟通是关键 55

1.14.4 敢于质疑 55

1.14.5 善于总结归纳 56

1.14.6 需求分析过程不要考虑开发 56

1.14.7 应对包含实现的需求 57

1.15 问题:沟通的基本技巧 57

1.15.1 三思而后言 57

1.15.2 失言时立刻致歉 57

1.15.3 和别人沟通 58

1.15.4 挑对说话的时机 58

1.15.5 对事不对人 58

1.15.6 了解别人的感觉 58

1.15.7 聆听他人的反馈 59

第2章 分析建模阶段 61

2.1 问题:UML模型图各有什么意义 61

2.1.1 UML中的模型图 61

2.1.2 模型图的分类 61

2.1.3 活动图 62

2.1.4 状态图 63

2.1.5 类图 64

2.1.6 对象图和协作图 64

2.1.7 序列图 65

2.1.8 组件图 66

2.1.9 部署图 67

2.1.10 模型图总结 67

2.2 问题:什么是分析建模 68

2.2.1 分析建模的困惑 68

2.2.2 需求分析和逻辑模型 69

2.2.3 分析建模的过程 69

2.2.4 解惑:分析阶段没有类 70

2.2.5 解惑:不是描述业务逻辑 70

2.2.6 解惑:不能立即进入设计阶段 70

2.3 问题:如何搭建业务对象模型 70

2.3.1 业务对象模型 70

2.3.2 搭建业务对象模型的过程 71

2.3.3 业务对象模型举例 71

2.4 问题:如何搭建分析模型 73

2.4.1 什么是分析模型 73

2.4.2 分析模型的作用 73

2.4.3 分析模型基础 73

2.4.4 用例实现举例 74

2.4.5 序列图描述用例实现 75

2.4.6 协作图描述用例实现 76

2.4.7 结语 76

2.5 问题:分析的经验之谈 76

2.5.1 想要更好地做分析 76

2.5.2 沟通与文档 77

2.5.3 用例与文档 77

2.5.4 分析过程中的经验 78

2.6 问题:解决问题的基本方法 78

2.6.1 陈述问题 79

2.6.2 阐述问题 79

2.6.3 分解问题 80

2.6.4 消除非关键问题 80

2.6.5 制定工作计划 81

2.6.6 关键分析、综合结果、建立结论 82

2.7 问题:Business Analysis的存在 83

2.7.1 “骑在”IT头上的Business Analyst 83

2.7.2 Business Analyst的困境 84

2.7.3 Business Analyst的角色 85

2.7.4 解惑疑问 86

2.8 问题:如何寻找参与者 87

2.8.1 寻找参与者 87

2.8.2 识别首要参与者 87

2.8.3 一个简单的示例 88

2.8.4 辅助参与者 88

2.8.5 考虑所有已经获得的需求 89

2.8.6 参与者不总是人 89

2.8.7 关注系统边界 89

2.8.8 寻找系统的信息来源 90

2.8.9 不要提前进行系统设计 90

2.8.10 不要将参与者与它们使用的设备相混淆 90

2.8.11 寻找参与者与寻找用例共同开展 90

2.9 问题:文档化参与者 91

2.9.1 怎样给参与者命名 91

2.9.2 不要将参与者的名字与组织角色名或职位名称相混淆 92

2.9.3 不要过度泛化 92

2.9.4 给参与者写一段简述 93

2.9.5 了解参与者的特征 93

2.9.6 参与者、用户类、风险承担者 93

2.10 问题:如何寻找用例 94

2.10.1 从识别参与者的目标开始 94

2.10.2 考虑系统和参与者需要的信息 94

2.10.3 不要担心用例的共用 94

2.10.4 不要把用例与功能相混淆 95

2.10.5 关注系统给参与者带来的价值 95

2.10.6 不要忘记辅助用例 96

2.10.7 寻找用例与寻找参与者共同开展 96

2.11 问题:文档化用例 96

2.11.1 把用例和参与者联系起来 97

2.11.2 命名用例 97

2.11.3 给用例一个简短的说明 98

2.11.4 描述用例的大纲 98

2.11.5 跟踪用例到风险承担者 99

2.11.6 追踪用例到系统特性和约束 99

2.12 问题:用例设计技巧与注意事项 100

2.12.1 切忌需求描述代替场景描述 100

2.12.2 切忌描述属性和方法 100

2.12.3 切忌忽略备选流 100

2.12.4 考虑时间因素,摆放用例位置 100

2.12.5 将首要参与者摆放在左上角 101

2.12.6 为定期任务引入时间参与者 102

2.12.7 使用〈〈include〉〉表达用例包含 102

2.12.8 使用〈〈extend〉〉表达用例扩展 102

2.12.9 使用“Is Like规则来判断用例泛化 103

2.12.10 使用“Is Like”规则来判断参与者泛化 103

2.12.11 切忌用例的粒度太小 104

2.12.12 使用用例收集非功能性需求 104

第3章 设计建模阶段 107

3.1 问题:类图与关系 107

3.1.1 类的关系困惑 107

3.1.2 依赖关系 107

3.1.3 泛化关系 108

3.1.4 实现关系 109

3.1.5 单向关系 111

3.1.6 无向关系 112

3.1.7 聚合关系 113

3.1.8 结语 114

3.2 问题:什么是设计模型 115

3.2.1 设计建模的困惑 115

3.2.2 分析建模和设计建模 115

3.2.3 类图 115

3.2.4 第一步:获取实体类 116

3.2.5 第二步:获取边界类 119

3.2.6 第三步:获取控制类 120

3.2.7 完整的类图 121

3.2.8 设计模型之时序图 121

3.2.9 结语 122

3.3 问题:UML建模技巧之通用篇 122

3.3.1 避免连线交叉 123

3.3.2 对称的摆放图中元素 123

3.3.3 使用行业术语 124

3.3.4 用“?”来标记未知的问题 124

3.3.5 慎用颜色来标记元素 125

3.4 问题:UML建模技巧之具体篇 125

3.4.1 在领域模型中明确类图的责任 125

3.4.2 在分析模型中建模关联类 126

3.4.3 指出类在关联中所扮演的角色 127

3.4.4 使用聚合关系 127

3.4.5 注意类之间基于数据的继承关系 127

3.5 问题:如何定义方法调用双方的义务和权利 128

3.5.1 职责不清的困境 128

3.5.2 契约设计 129

3.5.3 断言的应用 131

3.5.4 断言的一个简单示例 132

3.5.5 断言的原则 134

3.5.6 解决疑问 134

3.6 问题:抛出Checked Exception还是Runtime Exception 136

3.6.1 一种常见的“写法” 136

3.6.2 切忌“吞掉”异常 136

3.6.3 处理异常 137

3.6.4 抛出适当抽象的异常 139

3.6.5 异常链 142

3.6.6 异常的争论 145

3.7 问题:如何及时释放资源 149

3.7.1 资源释放 149

3.7.2 单一资源的不适当释放 149

3.7.3 单一资源的正确释放 150

3.7.4 关联资源的不适当释放 152

3.7.5 关联资源的适当释放 153

3.8 问题:怎样使用正则表达式验证数据有效性 155

3.8.1 正则表达式简介 155

3.8.2 Java对于正则表达式的支持 158

3.8.3 JavaScript对于正则表达式的支持 160

3.8.4 验证数据有效性的具体方法 163

第4章 表示层 167

4.1 问题:Struts的ActionForm与类型 167

4.1.1 ActionForm的作用 167

4.1.2 数据库端的设计方案 167

4.1.3 两个领域模型与一个ActionForm 168

4.1.4 Action、JSP与实现 170

4.1.5 显示结果与运行 172

4.1.6 错误的认识 172

4.1.7 BigDecimal的错误 173

4.1.8 解决问题 174

4.1.9 结语 175

4.2 问题:Struts如何工作 175

4.2.1 了解Struts框架的原理 175

4.2.2 搭建Struts框架 176

4.2.3 初始入口 178

4.2.4 ActionServlet初始化Struts 178

4.2.5 initInternal()方法和内部资源文件初始化 179

4.2.6 initOther()方法和特性配置 181

4.2.7 initServlet()方法和ActionServlet 182

4.2.8 initModuleConfig()方法和struts-config.xml解析 183

4.2.9 initModuleMessageResources()方法和资源文件初始化 185

4.2.10 initModuleDataSources()方法和初始化连接 186

4.2.11 initModulePluglns()方法和初始化插件 187

4.2.12 结语 188

4.3 问题:ActionForm与Struts标签库 188

4.3.1 ActionForm与Struts标签库的关系 188

4.3.2 和配置文件相关的〈html:form〉标签 190

4.3.3 需要区别的〈html:cancel〉和〈html:submit〉标签 191

4.3.4 与Struts框架密切相关的标签 192

4.3.5 与Struts框架松散耦合的标签 195

4.3.6 结语 198

4.4 问题:如何使用Struts标签之选择框 198

4.4.1 如何使用选择框标签 198

4.4.2 不使用Struts标签而使用Struts框架 198

4.4.3 不使用Struts标签补充漏洞 202

4.4.4 使用Struts标签解决需求 203

4.4.5 使用Struts标签补充漏洞 205

4.4.6 多选框和单选框的区别 207

4.5 问题:如何使用Struts标签之下拉框 208

4.5.1 如何使用下拉框标签 208

4.5.2 第一种实现方式 208

4.5.3 第二种实现方式 211

4.5.4 第三种实现方式 212

4.5.5 第四种实现方式 213

4.5.6 多选的下拉框实现方式 215

4.5.7 结语 217

4.6 问题:JSTL和Struts标签的整合 217

4.6.1 为什么需要JSTL 217

4.6.2 什么是JSTL 218

4.6.3 EL表达式简介 219

4.6.4 JSTL标签库介绍 221

4.6.5 JSTL与Struts标签整合 226

4.7 问题:页面输入乱码的解决方案 232

4.7.1 页面输入乱码的困惑 232

4.7.2 乱码的原因 233

4.7.3 解决问题的思路 234

4.7.4 第一个方案 234

4.7.5 第二个方案 235

4.7.6 结语 237

4.8 问题:如何使用AJAX构建响应快速的动态Web页面 238

4.8.1 什么是AJAX 238

4.8.2 Web应用模型和AJAX的Web应用模型 238

4.8.3 传统Web应用同步交互和AJAX Web应用异步交互 239

4.8.4 AJAX的交互流程 240

4.8.5 XMLHttpRequest对象 243

4.8.6 XMLHttpRequest对象的属性 245

4.8.7 XMLHttpRequest对象的方法 246

4.9 问题:如何使用AJAX构建响应快速的动态Web页面(续) 246

4.9.1 传统Web应用的策略 246

4.9.2 捕获用户交互时产生的DOM事件 247

4.9.3 创建XMLHttpRequest对象 248

4.9.4 组装HTTP请求的URL 249

4.9.5 打开HTTP请求 249

4.9.6 设置回调函数 250

4.9.7 发送请求 251

4.9.8 服务器响应AJAX请求 253

4.9.9 客户端处理AJAX响应 256

4.10 问题:如何响应AJAX请求 264

4.10.1 纯文本响应 264

4.10.2 自行序列化XML 265

4.10.3 自行序列化XML的问题 269

4.10.4 XML数据绑定 269

4.10.5 Castor框架的XML数据绑定 270

4.10.6 Castor框架示例 273

4.10.7 示例改进 275

4.10.8 页面模板生成XML 277

4.10.9 非XML格式响应 278

4.10.10 org.json框架的JSCON对象生成 280

4.10.11 比较4种AJAX请求方式 284

4.11 问题:AJAX的常见应用场景 285

4.11.1 调换HTML片段 285

4.11.2 案例——Web页面动态显示服务器时间 285

4.11.3 案例——Tab样式显示动态内容 288

4.11.4 案例——使用XML文档响应AJAX请求 290

第5章 持久层 295

5.1 问题:可否使用Serializable实现持久化 295

5.1.1 Serializable替代数据库 295

5.1.2 理想状态下的测试 295

5.1.3 可行性讨论 298

5.1.4 缺失讨论 303

5.2 问题:选择怎样的方式来实现持久层 304

5.2.1 纯JDBC方式的持久层 304

5.2.2 纯JDBC方式持久化的讨论 308

5.2.3 O/R Mapping方式的持久层 309

5.2.4 为什么选择O/R Mapping方式的持久层 309

5.2.5 O/R Mapping方式的持久层实现策略 310

5.3 问题:连接表的困惑 312

5.3.1 业务对象的一对多 312

5.3.2 为什么需要连接表 313

5.3.3 使用连接表的一对多 314

5.3.4 连接表的意义 316

5.4 问题:如何使用临时表 317

5.4.1 无法显示的数据 317

5.4.2 理解临时表 321

5.4.3 查找问题 322

5.4.4 提供一个ConnectionManager 322

5.4.5 不能被忽略的ON COMMIT DELETE ROWS 324

5.4.6 被改写的完整代码 324

5.5 问题:DAO模式是否需要接口 328

5.5.1 DAO接口的困惑 328

5.5.2 不需要DAO接口的理由 329

5.5.3 反驳的理由:设计 329

5.5.4 反驳的理由:调试 330

5.5.5 总结 333

5.6 问题:选择最好的分页方式 333

5.6.1 在持久层的分页 333

5.6.2 逻辑分页的第一种方式 334

5.6.3 逻辑分页的第二种方式 336

5.6.4 物理分页的第一种方式 338

5.6.5 物理分页的第二种方式 341

5.6.6 分页方式的效率评估 342

5.7 问题:可以使用存储过程吗 344

5.7.1 存储过程的困惑 344

5.7.2 理解存储过程 344

5.7.3 在Java中调用存储过程 345

5.7.4 什么情况下使用存储过程 347

5.8 问题:怎样解决大批量数据的条件 348

5.8.1 正确代码奇怪的错误 348

5.8.2 大批量条件引发的错误 351

5.8.3 改变SQL语句的解决方案 352

5.8.4 临时表的解决方案 353

5.8.5 需求过程中的解决方案 357

第6章 框架持久层的问题 359

6.1 问题:Hibernate中的实体状态 359

6.1.1 怎样理解实体状态 359

6.1.2 实体状态的定义 359

6.1.3 实体状态的代码实现:瞬时—持久化 360

6.1.4 实体状态的代码实现:脱管-持久化、持久化-脱管 362

6.1.5 持久化方法对状态的影响 363

6.1.6 结语 372

6.2 问题:Hibernate单、双向关联与inverse属性 372

6.2.1 Hibernate的单、双向关联 372

6.2.2 Hibernate的单向关联常规实现 373

6.2.3 单向关联的实现和问题 375

6.2.4 Hibernate的双向关联常规实现 380

6.2.5 双向关联的实现和问题 381

6.2.6 inverse属性与双向关联 382

6.2.7 结语 384

6.3 问题:在Hibernate中配置连接表 385

6.3.1 提出问题 385

6.3.2 在Hibernate中的连接表配置 385

6.3.3 多对多连接表配置和实现 389

6.3.4 其他通过连接表的映射配置 394

6.3.5 结语 398

6.4 问题:Spring如何支持JDBC 399

6.4.1 什么是JdbcTemplate 399

6.4.2 如何使用JdbcTemplate 399

6.4.3 如何使用JdbcDaoSupport 403

6.4.4 如何声明配置JDBC事务 405

6.4.5 什么是RDBMS Operation 406

6.4.6 如何使用MappingSqlQuery 407

6.4.7 如何使用SqlUpdate 410

6.5 问题:Spring如何支持IBatis 412

6.5.1 领域对象映射 412

6.5.2 IBatis配置和DAO 413

6.5.3 Spring和事务声明配置 415

6.6 问题:Spring如何支持Hibernate 417

6.6.1 ER分析 417

6.6.2 领域对象映射 418

6.6.3 使用Spring简化DAO 421

6.6.4 整合配置 422

6.6.5 事务控制 424

第7章 Spring业务逻辑层问题 427

7.1 问题:Spring发布包的基本构成元素有哪些 427

7.1.1 Spring核心发布包的构成 427

7.1.2 Spring相关软件包的构成 428

7.1.3 Spring自带范例的简单介绍 429

7.1.4 结语 429

7.2 问题:怎么理解控制反转 429

7.2.1 简单示例 430

7.2.2 应用控制反转 432

7.2.3 结语 434

7.3 问题:怎么理解依赖注入 434

7.3.1 依赖注入的几种形式 434

7.3.2 设值注入和构造子注入 435

7.3.3 设值注入和构造子注入的比较 436

7.4 问题:如何使用Bean Factory 437

7.4.1 Bean Factory简介 437

7.4.2 如何通过配置文件定义一个Bean 439

7.4.3 如何使用默认构造函数创建Bean 440

7.4.4 如何使用静态工厂方法创建Bean 440

7.4.5 如何使用普通工厂方法创建Bean 441

7.5 问题:如何装配各种Bean并使它们协作 443

7.5.1 设置Bean的属性和协作者 443

7.5.2 如何实现自动装配 449

7.5.3 如何实现依赖检查 451

7.5.4 如何定义父子Bean 452

7.6 问题:如何使用ApplicationContext 454

7.6.1 实现国际化 455

7.6.2 事件传播 457

7.6.3 使用PropertyPlaceholderConfigurer便捷地设置属性 460

7.6.4 如何创建Web应用上下文 461

7.6.5 如何自定义属性编辑器 462

7.6.6 结语 465

7.7 问题:如何使用Spring验证器 465

7.8 问题:如何使用Spring发送E-mail 468

7.8.1 Spring的邮件抽象层 468

7.8.2 定义抽象父类 469

7.8.3 好的重构 471

7.9 问题:如何使用Spring Web MVC框架 475

7.9.1 什么是Spring Web MVC 475

7.9.2 什么是DispatcherServlet 476

7.9.3 什么是HandlerMapping 477

7.9.4 什么是HandlerInterceptor 478

7.9.5 如何使用Controller 481

7.9.6 如何使用SimpleFormController 482

7.9.7 如何使用Form、Domain Model和View 485

7.9.8 如何使用Validator和处理异常 490

7.9.9 结语 491

7.10 问题:Spring如何集成Struts 491

7.10.1 如何装载上下文 492

7.10.2 通过ActionSupport集成Struts 493

7.10.3 通过DelegatingRequestProcessor集成Struts 495

7.10.4 结语 497