如何devise和构buildJava / Java EE Web应用程序?
我是拥有近5年Struts,Spring和Hibernate经验的Java开发人员。
我们有一个新的项目在几天内出现。 我们有完整的需求,我们将使用Spring MVC,Spring和Hibernate来完成这个项目。
我被要求devise和构build整个Web应用程序。 devise和创build一个build筑师是我迄今为止在我职业生涯中还没有做过的事情。 我不知道我该怎么做,从哪里开始,使用什么工具等等。 我甚至不知道A,B,C的devise和build筑。
你可能想知道为什么我甚至要求我在第一时间做这件事。 事情是我有机会做到这一点,在每个阶段我都会受到监控,我会让我的前辈们审查devise。
因此,欢迎任何build议,想法和步骤开始和继续。
我可以从我自己的经验中增加2美分(尽pipe它更多地是对开发最佳实践的汇编,但在devise应用程序时可能会考虑到这一点):
- 没有一种万能的devise
- 尽量保持应用程序尽可能轻。
- 使用Maven / Gradle来pipe理依赖关系
- 不要过度依赖IDE。 确保你的项目没有IDE(如果你使用的是Maven / Gradle,它会:)尝试用IDEA,Netbeans和Eclipse来打开你的项目。
- 对于上面提到的技术,appfuse是一个很好的起点。
- 首先devise您的数据库/实体
- 明智而明智地使用图书馆。 不要过度使用它们。
- 不要忘记写JUnit / TestNG(至less对于服务层)
- 在所有主stream浏览器上testing应用程序(不只是你最喜欢的:)
- 确定您的Web应用程序将拥有多less个总用户和多less个并发用户。
- 然后决定是否需要caching。
- 您将使用应用程序服务器群集或不使用。
- 根据其functionselect应用程序服务器,更重要的是select“您的需要”
- Tomcat / Jetty绝大多数情况下都是好的
- 避免使用任何应用程序服务器特定的API
- 即使使用hibernate作为JPA实现,也使用JPA接口/注释
- 在实体中映射关系时要格外小心。 决定哪些属性和关系会加载懒惰,哪些会急切加载
- 在devise应用程序时请记住应用程序的安全性。 春季安全是非常好的select。
- 千万不要滥用HttpSession。 不要在这里储存太多。
- 保持实体可序列化。 强制开发者使用toString(),hashCode()和equals()
- 不要忘记从第1天开始使用版本控制
- 不要只是假设spring / hibernate / spring-mvc将是您的最佳select。 用至less3到4个选项创build小概念certificate。
- 尝试使用Jenkins等CI工具自动进行集成/构build/部署
- 检查和调整Hibernate生成的SQL(时间到)
- 不要让业务逻辑进入视图层。 讨厌jsp scriptlets? 考虑速度/ Freemarker。 JSP不是唯一的select。
- 通过使用Spring的PropertyPlaceholderConfigurator外部化特定于环境的configuration。
- 如果可能的话,尝试与现有的用户authentication机制(如LDAP / OpenID)集成,而不是自己写。 这样可以避免重新发明轮子,使用户无法记住另一组用户名和密码。
架构devise文档需要几件事情。 不是一件容易的事,而是要抓住机会。 由于这是一个很大的问题,希望这些链接可以让你开始,你可以改进问题,让你的脚湿了。
方法
您使用的方法会影响您首先执行的任务。 瀑布是一种stream行但过时的方法。 一个更新的方法是敏捷,有几个面孔。 我最喜欢的是Scrum敏捷开发任何规模的软件。
图
图表是将系统作为一个整体来表示的最有力的方式之一,也是个别的组件。 您创build的图表types取决于系统。 通常有结构图,行为图,交互图和其他吨。 这些图表显示了整个系统的各个部分,每个部分的物理布局和/或逻辑布局,通信stream程,程序stream程等。
文档
文档就像听起来一样,文档和文档具有项目描述,范围,用户案例,序列图以及描述项目或项目组成部分的任何其他文档。
仔细阅读推动“恰到好处”build模的敏捷build模网站。 他们有一些很好的指导方针,包括从需求收集到devise/开发的完整的“敏捷build模过程”。
http://www.agilemodeling.com/essays/amdd.htm
http://www.agilemodeling.com/essays/agileArchitecture.htm
http://www.agilemodeling.com/essays/agileAnalysis.htm
http://www.agilemodeling.com/essays/agileDesign.htm
至于工具,我喜欢Visual Paradigm。 它相对便宜(与其他工具相比)。 有各种免费的build模工具(谷歌是你的朋友),但没有任何比较视觉范式,只是有点花费,这是非常值得的。 如果我的雇主没有为此付出现金,我会自己购买… 🙂
看看罗伯特·马丁(又名叔叔鲍伯)的清洁build筑。 这是一个快速的概述。 使用这种方法,您可以稍后推迟Spring或Hibernate等细节,并更多地关注业务逻辑。 甚至从Spring迁移到Java EE,而无需触及业务和应用程序逻辑。 您还将获得符合SOLID原则的可testing应用程序,而不需要太多的额外工作。
我刚刚创build了一个应用程序,我必须说我很高兴。 我可以轻松地将其移植到桌面或移动应用程序,或者换出存储模块。 细节取决于政策是一个很长的路要走。 它还以API的方式促进思考,并在正确应用时使您的模块非常可重用。
马丁说,像框架的细节是烦人的,而不是你的架构的一部分。 我认为他们属于build筑,但只属于不同的层次。 通常情况下,您希望在早期阶段包含框架,以便能够生成一小段工作的应用程序,以便向用户演示。 或者当你事先知道你的框架,并没有关于他们的讨论,就像我的情况。 但是,您可以将其视为单独的软件架构,将它们结合在一起创build您的应用程序架构。
更多细节
-
在开始编码之前,请降低业务需求。 构build完整的请求function列表,示例屏幕截图(如果可用),用例图,业务规则等作为function规范文档。 这是业务分析师和开发人员会提出有关用户界面需求,数据层集成要求,用例等问题的阶段。还要根据实现所需的业务目标,交付周期和迭代来优先考虑function。
-
根据function规格准备技术规格文件。 技术规范文件应包括:文件的目的:例如,本文件将强调客户服务function。 概述:本节主要介绍背景信息,范围,任何包含和/或排除,参考文档等。基本体系结构:讨论或引用基准体系结构文档。 回答这个问题会不会缩小? 这个performance能改善吗? 它是可扩展的和/或可维护的吗? 有没有什么安全问题? 描述要在早期迭代中使用的垂直切片,以及要由每个切片certificate的概念。 等等,比如我们应该使用哪一个MVC [model-1,model-2 etc]范例? 我们应该使用Struts,JSF和Spring MVC等,还是构build我们自己的框架? 我们应该使用业务委托来将中间层与客户端层分离吗? 我们应该使用AOP(Aspect Oriented Programming)吗? 我们应该使用dependency injection吗? 我们应该使用注释吗? 我们需要国际化吗? 等假设,依赖,风险和问题:突出所有的假设,依赖,风险和问题。 例如列出您可以识别的所有风险。 每个关键function要求的deviseselect。 还讨论为什么select一个特定的devise替代scheme。 这个过程将鼓励开发人员分析可能的devisescheme,而不必跳过显而易见的解决scheme,这可能并不总是最好的解决scheme。 处理逻辑:讨论客户层,中间层和数据层的处理逻辑。 在需要的地方添加工艺stream程图。 添加任何预处理条件和/或后处理条件。 UML图将devise传达给开发人员,解决schemedevise师,架构师等。通常需要类图和序列图。 其他图表可以添加为任何特殊情况。 状态图图:用于描述跨多个用例的对象的行为活动图:用于表示复杂的操作。 支持并鼓励并行行为。 活动和状态图对于使用multithreading编程的工作streambuild模是有益的。 协作和序列图:当您想要查看单个用例中多个对象的行为时,请使用协作或序列图。 如果您想跨多个用例查看单个对象,请使用状态图。 对象图:对象图显示实例而不是类。 它们对于详细解释一些复杂的对象非常有用,例如突出显示recursion关系。 以表格forms列出软件包名称,类名称,数据库名称和表格名称以及其责任的简要说明。
- 为整个团队编写一个编码标准文件,以提高一致性和效率。 一些编码实践可能会降低性能,例如:不恰当的使用String类。 计算密集型突变使用StringBuffer而不是String。 接口方面的代码。 例如,您可能会决定LinkedList是某些应用程序的最佳select,但稍后决定ArrayList可能是一个更好的select。 错误的方法 ArrayList list = new ArrayList(); 正确的做法 List list = new ArrayList(100); 适当地设置一个集合的初始容量(例如ArrayList,HashMap等)。 促进一致性定义variables名称的标准,方法名称,logging的使用,大括号位置等。
- 准备一个代码审查文档和整个团队的模板。 让我们看看代码审查应包含的一些元素:适当的variables声明:例如,实例与静态variables,常量等。性能问题:例如,当没有线程安全问题时,使用ArrayList,HashMap等代替Vector,Hashtable。 内存问题:例如,不恰当的实例化对象而不是对象重用和对象池,不closuresfinally块中的宝贵资源等。线程安全问题:例如SimpleDateFormat,Calendar,DecimalFormat等Java API类不是线程安全的,声明variables在JSP不是线程安全的,在Struts操作类或multithreadingservlet中存储状态信息是不安全的。 error handling:例如,重新抛出exception而不嵌套原始exception,EJB方法不抛出EJBexception,用于系统exception等。编码标准的使用:例如,不使用框架,使用System.out而不是log4j等。devise问题:无 – 使用代码,没有明确的职责分离,无效使用inheritance以获得方法重用,servlet执行JDBC直接访问而不是使用DAO(数据访问对象)类,Struts action或servlet类中的HTML代码,用作实用程序类的servlet错误:例如在容器pipe理的事务中调用setAutoCommit,使用二进制或“|”而不是逻辑或“||”,依靠通过EJB远程调用中的引用,ResultSet不会在exception时closures,EJB方法不会为系统exception抛出EJBException等。
- 按照要求由团队共享的要求准备额外的可选准则文件。 这将促进一致性和标准。 例如:build立J2EE开发环境的指南。 版本控制系统指南(CVS,VSS等)。 部署步骤,环境设置,ant目标等准则。数据build模准则(任何公司标准)。 error handling准则。 用户界面devise指南。 项目概述文件,软件开发过程文件等
我已经编辑了一本关于Spring,Hibernate和数据build模的新书,它将回答您对Java EE Web应用程序devise方面的查询。 通常,Java EE Web应用程序有5层 – 客户端,演示文稿,业务服务,数据访问和资源(实体)。 本书重点介绍如何通过使用Spring和Hibernate的数据build模的所有关系来devise和开发这些层。 下载整个Web应用程序,您可以在其中find有关pipe理数据build模场景的每个关系的信息。
让我们看看一个简单的独立实体。 为了pipe理实体,必须devise创build,读取,更新,删除和查找所有logging等方法。 所以如果我们自下而上,实体创造就是第一步。 接下来我们看看有上面描述的方法的Repository。 进一步来说,商业服务层,然后是基于JSON的REST Spring控制器。 剩下的任务包括编写JSP页面和JQuery AJAX调用到REST控制器。
你可以在这里find关于这本书的更多信息