正所谓“工欲善其事,必先利其器”,在正式开始设计并开发我们的轻量级java Web框架之前,有必要首先掌握以下技能:
使用IDEA搭建并开发Java项目;
使用Maven自动化构建Java项目;
使用Git管理项目源代码。
1.1 使用IDEA创建Maven项目 3
1.1.1 创建IDEA项目 3
1.1.2 调整Maven配置 3
1.2 搭建Web项目框架 5
1.2.1 转为Java Web项目 5
1.2.2 添加Java Web的Maven依赖 6
1.3 编写一个简单的Web应用 10
1.3.1 编写 Servlet类 10
1.3.2 编写JSP页面 11
1.4 让Web应用跑起来 12
1.4.1 在IDEA中配置Tomcat 12
1.4.2 使用Tomcat的Maven插件 13
1.4.3 以Debug方式运行程序 13
1.5 将代码放入Git仓库中 14
1.5.1 编写.gitignore文件 14
1.5.2 提交本地 Git 仓库 15
1.5.3 推送远程Git仓库 15
1.5.4 总结 16
第2章 为Web应用添加业务功能 17
我们将在这个应用的基础上增加一些业务功能,您将学会更多有关项目实战的技能,具体包括:
如何进行需求分析;
如何进行系统设计;
如何编写应用程序。
2.1 需求分析与系统设计 19
2.1.1 需求分析 19
2.1.2 系统设计 19
2.2 动手开发Web应用 21
2.2.1 创建数据库 22
2.2.2 准备开发环境 22
2.2.3 编写模型层 23
2.2.4 编写控制器层 25
2.2.5 编写服务层 27
2.2.6 编写单元测试 28
2.2.7 编写视图层 31
2.3 细节完善与代码优化 31
2.3.1 完善服务层 32
2.3.2 完善控制器层 59
2.3.3 完善视图层 60
2.4 总结 65
第3章 搭建轻量级Java Web框架 66
我们需要这样的框架,它足够轻量级、足够灵巧,不妨给它取一个优雅的名字——Smart Framework,本章我们就一起来实现这个框架。
您将通过本章的学习,掌握如下技能:
如何快速搭建开发框架;
如何加载并读取配置文件;
如何实现一个简单的IOC容器;
如何加载指定的类;
如何初始化框架。
3.1 确定目标 68
3.2 搭建开发环境 70
3.2.1 创建框架项目 70
3.2.2 创建示例项目 73
3.3 定义框架配置项 74
3.4 加载配置项 75
3.5 开发一个类加载器 78
3.6 实现Bean容器 87
3.7 实现依赖注入功能 90
3.8 加载Controller 93
3.9 初始化框架 97
3.10 请求转发器 98
3.11 总结 109
第4章 使框架具备AOP特性 110
在本章中,读者将学到大量有用的技术,具体包括:
如何理解并使用代理技术;
如何使用Spring提供的AOP技术;
如何使用动态代理技术实现AOP框架;
如何理解并使用ThreadLocal技术;
如何理解数据库事务管理机制;
如何使用AOP框架实现事务控制。
4.1 代理技术简介 112
4.1.1 什么是代理 112
4.1.2 JDk动态代理 114
4.1.3 CGlib动态代理 116
4.2 AOP技术简介 118
4.2.1 什么是AOP 118
4.2.2 写死代码 119
4.2.3 静态代理 120
4.2.4 JDK动态代理 121
4.2.5 CGLib动态代理 122
4.2.6 Spring AOP 124
4.2.7 Spring + AspectJ 136
4.3 开发AOP框架 142
4.3.1 定义切面注解 142
4.3.2 搭建代理框架 143
4.3.3 加载AOP框架 150
4.4 ThreadLocal简介 158
4.4.1 什么是ThreadLocal 158
4.4.2 自己实现ThreadLocal 161
4.4.3 ThreadLocal使用案例 163
4.5 事务管理简介 172
4.5.1 什么是事务 172
4.5.2 事务所面临的问题 173
4.5.3 Spring的事务传播行为 175
4.6 实现事务控制特性 178
4.6.1 定义事务注解 178
4.6.2 提供事务相关操作 181
4.6.3 编写事务代理切面类 182
4.6.4 在框架中添加事务代理机制 184
4.7 总结 185
第5章 框架优化与功能扩展 186
本章将对现有框架进行优化,并提供一些扩展功能。通过本章的学习,读者可以了解到:
如何优化Action参数;
如何实现文件上传功能;
如何与Servlet API完全解耦;
如何实现安全控制框架;
如何实现Web服务框架。
5.1 优化Action参数 188
5.1.1 明确Action参数优化目标 188
5.1.2 动手优化Action参数使用方式 188
5.2 提供文件上传特性 191
5.2.1 确定文件上传使用场景 191
5.2.2 实现文件上传功能 194
5.3 与Servlet API解耦 214
5.3.1 为何需要与Servlet API解耦 214
5.3.2 与Servlet API解耦的实现过程 215
5.4 安全控制框架——Shiro 219
5.4.1 什么是Shiro 219
5.4.2 Hello Shiro 220
5.4.3 在Web开发中使用Shiro 224
5.5 提供安全控制特性 230
5.5.1 为什么需要安全控制 230
5.5.2 如何使用安全控制框架 231
5.5.3 如何实现安全控制框架 242
5.6 Web服务框架——CXF 261
5.6.1 什么是CXF 261
5.6.2 使用CXF开发SOAP服务 262
5.6.3 基于SOAP的安全控制 278
5.6.4 使用CXF开发REST服务 291
5.7 提供Web服务特性 308
5.8 总结 329
附录A Maven快速入门 330
附录B 将构件发布到Maven中央仓库 342
其实一开始黄勇找我为他的处女作写序的时候,我是拒绝的。因为你不能让我写,我马上就写。我要先看一下书,因为我不愿意写完后发现书很烂,然后读者来骂我乱推荐。
黄勇一直是开源中国非常活跃的会员,非常积极地回答各种问题和分享自己所擅长的知识。本身也是 Smart Framework 框架的作者,积分居然过千,要知道开源中国上超过 1000 积分的会员寥寥无几。我和黄勇并没有见过面,仅通过线上的信息大概觉得他是一个热情、虚怀若谷又非常接地气的技术牛人。
回归正题,2015年是 Java 的 20 周年。Java 是一门让我们又爱又恨的编程语言,在编程语言界里算是一棵老树,关键是这棵老树还频频长出新枝。Java 8 的出现使其具备了各种流行的编程理念,而全新的 Java 9 也已经奠定了Java发展的里程碑并将于2016年下半年发布正式版本。说起又爱又恨,在 Java *火热的那几年里,满世界的 SSH (Struts+Spring+Hibernate),所有人都在讨论 SSH 框架里的奇技淫巧,也出现了各种图书和培训教程。很多初学者认为 Java = SSH,学 Java 就是学 SSH,以至于很多人用 SSH 做了不少项目,但依然对 Java、HTTP 等基础知识一知半解、不甚了了。
在 Web 开发方面,Java 经历了这么几个阶段,从*开始使用大量 Servlet 来处理各种业务逻辑,然后出现了著名的 Struts 框架,大大简化了 Web 应用的开发以及配置,而后是 Hibernate 和 Spring 的出现,使这三者成为三驾马车,并一直流行到现在。
而如今,确切地说应该是*近几年,Java 用户开始回归理性。由于 SSH 在不断发展的同时,体积也变得越来越庞大,很多人在使用的过程中被各种配置、注解弄得头昏脑涨。而前些年 Ruby on Rails 框架以其“惯例优于配置”的理念让我们猛然清醒——原来 Web 的开发就应该这么简单。于是越来越多的 Java 开发者开始考虑轻量级框架解决方案。而黄勇的 Smart Framework 就是这种轻量级解决方案之一。
Java 的世界从来不缺乏各种优秀的开源软件,理念成熟后大量的轻量级 Web 框架如雨后春笋般出现在我们眼前。在开源中国网站上你会发现 Java 的 Web 框架有超过 300 款之多。那么多的框架对初学者来说简直是噩梦。于是三年前我写了一篇文章《初学 Java Web 开发,请远离各种框架,从 Servlet 开发》,今天一看,这篇文章居然超过了21万阅读量。这篇文章是针对 Java 初学者的,因为很多人为了学习各种框架而疲于奔命,但却从来没有思考为什么同样是做开发的,自己要比别人更累。*根本原因在于方法不对,事倍功半!
在招聘 Java 开发人员时我*爱问的一个问题是:请解释一下 Session 的工作原理,从而来判断应聘者对基础知识的掌握情况。那么什么才是初学者学习 Web 开发的好方法呢?其实我在前面提到的文章里包含了详细的步骤,简单地说就是先要熟悉 Java EE 里关于 Servlet API 中的常用类和方法。在这个基础上再去学习某个框架的使用,*后是阅读 HTTP 协议的内容。想成为高手必须对 HTTP 协议有着深入的了解。一旦掌握了这些基础的内容,你会发现使用框架甚至是开发一个适合自己业务的框架是多么的容易。
而黄勇的这本书,虽然我只是看到书的目录以及前面两三章的内容,但相信这是一本对初学者非常好的书,没有华丽的词藻,实实在在地讲述了整个开发流程。这本书不是在教你怎么用 Smart Framework,而是展示了作者开发这个框架的整个心血历程,包括设计一个框架所用到的各种技术,还涉及了很多底层的 Java 技术,如类加载器、依赖注入、线程本地、事务管理和安全控制,等等。
不管是学习还是在实际的开发中,少问怎么做,多问问为什么要这么做。或许,这就是黄勇想要告诉大家的吧。
红薯
开源中国(oschina.net)创始人
2015年6月12日
于北京到上海的 G123 列车上
前 言
记得在2013年9月,那时我工作不太忙,利用自己的闲暇时间,写了一款名为Smart的轻量级Java Web框架,并发布到“开源中国”(oschina.net)社区网站上。当时引发了同行们的大量关注,随后纷纷出现了其他大量关于“轻量级Java Web框架”的开源项目。
当然也有人觉得此类项目没有多大意义,毕竟Spring等框架已经足够成熟了,功能完全能够满足我们日常的开发需求,为什么还要“重复发明轮子”呢?
对此问题,我是这样认为的:
1.对于Spring框架而言,虽然它已经足够强大了,但也更加臃肿了,因为它提供的所有功能我们并非都需要。
2.市面上有很多优秀的开源框架,我们不妨取其精华,自己动手开发一款适合自身开发需求的框架。
3.国内开源环境与国外差距较大,我们需要从自身做起,才能带动身边更多的人一起投身到国内开源事业中去。
也许我的力量非常薄弱,但只要能涌现出一批热血的开源人,相信国内开源市场的前景一定会越来越好!
我认为自己的选择并没有错,于是我一边写代码,一边写博客,在短短的几个月里,写了上万行代码、上百篇博客(我的博客地址:http://my.oschina.net/huangyong/blog)。我想把自己在开发过程中遇到的问题与经验都记录下来,并且分享出去,让更多的人受益。
直到有一天,我接到了博文视点陈晓猛编辑的邀请,陈编辑想让我出一本书,选题让我自己来定。当时我既欢喜又发愁,欢喜是由于终于有机会出版自己的书了,发愁是由于自己的经验与水平十分有限,难以写出好的作品,所以只能大胆尝试了。
在写这本书之前,我发现在国内介绍如何使用一些开源框架的书已经非常多了,但教会大家怎样从零开始写框架的书却非常少,因此我打算写一本这样的书——从零开始写Java Web框架。在写书前我备感压力,因为我只写过一点技术博客,还从未写过书。对于写书而言,我是非常缺乏经验的,总是担心自己写得不够好,要么写得太晦涩,要么写得太肤浅。反反复复逐字推敲,直到交稿的时候,我心里还是忐忑不安。
我在写这本书时下定了决心,面对的读者非常具体,他们必须具备一定的Java功底,尤其是 Java Web 方面的开发经验,他们都是希望步入架构师行列的程序员。所以,这本书的内容不能过于理论,而是需要将理论融入到实践中。全书以实现一款轻量级Java Web框架为主线,建议读者能亲手实践,这样才能学到更多有价值的东西。
本书内容
全书共5章,每章有先后顺序,建议读者按照章节顺序进行阅读。
第1章:从一个简单的Web应用开始,教会读者如何使用IDEA、Maven、Git等开发工具来搭建一个Java Web项目。
第2章:为Web应用添加业务功能,从需求分析与系统设计开始,带领读者动手开发一款简单的Web应用,并进行了相关细节完善与代码优化。
第3章:搭建轻量级Java Web框架,一切都是从零开始,逐个实现类加载器、Bean容器、IOC框架、MVC框架,本章所涉及的代码也是整个框架的核心基础。
第4章:使框架具备AOP特性,从代理技术讲到AOP技术,从ThreadLocal技术讲到事务控制技术,通过阅读本章,读者可学会如何实现AOP框架,以及事务管理框架。
第5章:框架优化与功能扩展,通过对现有框架的优化,使框架提供更加完备的功能,并以扩展 Web 服务插件与安全控制插件为例,教会读者如何对框架进行扩展。
致谢
首先要感谢我的家人,特别是我的妻子,当占用大量休息时间写作的时候,她能够给予我极大的理解与支持,独自承担了所有的家务,以及照顾宝宝的生活,让我能够在没有任何打扰的环境下,全身心地投入到写作当中。如果没有她的帮助,这本书是无法完成的。
感谢开源中国社区网站,感谢创始人红薯,感谢曾经帮助我的朋友们,他们是:大漠真人、july、小菜的粉丝、ipandage、蛙牛、Liuzh_533、罗盛力、Bieber、哈库纳、悠悠然然、黄亿华、Dead_knight、疑似一僧、杨唯浩、V神、石头哥哥、乒乓狂魔、邹建芳、山哥、光石头(排名不分先后),没有你们的支持与鼓励,我是没有决心把开源做下去的,更不可能写出这本书。
感谢与我一起共事的同事们,让我体会到了团队的力量,在你们的身上我学到了许多宝贵的经验,也感谢你们为本书提供的宝贵建议。
感谢博文视点的编辑,这本书能够如期出版,离不开你们的敬业精神与一丝不苟的工作态度,我为你们点赞!
本书资源
本书下载资源请登录博文视点官网(www.broadview.com.cn/26829)中的“下载资源”进行下载。
黄勇
2015年6月于上海
¥399.00
¥249.00¥498.00
¥149.00¥298.00
¥29.00