`
roruby
  • 浏览: 335238 次
  • 来自: ...
社区版块
存档分类
最新评论

12个最重要的J2EE最佳实践(二)

阅读更多
4. 从一开始就计划使用 J2EE 安全性。
启用 WebSphere 安全性。这使您的 EJB 和 URL 至少可以让所有授权用户访问。不要问为什么——照着做就是了。

在与我们合作的客户中,一开始就打算启用 WebSphere J2EE 安全性的顾客是非常少的,这一点一直让我们感到吃惊。据我们估计大约只有 50% 的顾客一开始就打算使用此特性。例如,我们曾与一些大型的金融机构(银行、代理等等)合作过,他们也没有打算启用安全性。幸运的是,这种问题在部署之前的检查时就得以解决.

不使用 J2EE 安全性是危险的事情。假设您的应用程序需要安全性(几乎所有的应用程序都需要),您敢打赌您的开发人员能够构建出自己的安全性系统,而这个系统比您从 J2EE 厂商那里买来的更好。这可不是个好的赌注,为分布式的应用程序提供安全性是异常困难的。例如,您需要使用网络安全加密令牌控制对 EJB 的访问。以我们的经验看来,大多数自己构建的安全性系统是不安全的,并且有重大的缺陷,这使产品系统极其脆弱。

一些不使用 J2EE 安全性的理由包括:担心性能的下降,相信其他的安全性(例如 Netegrity SiteMinder)可以取代 J2EE 安全性,或者是不知道 WebSphere Application Server 安全特性及功能。不要陷入这些陷阱之中,尤其是,尽管像 Netegrity SiteMinder 这样的产品能够提供优秀的安全特性,但是仅仅其自身不可能保护整个 J2EE 应用程序。这些产品必须与 J2EE 应用程序服务器联合起来才可能全面地保护您的系统。

其他的一种常见的不使用 J2EE 安全性的原因是:基于角色的模型没有提供足够的粒度访问控制以满足复杂的业务规则。尽管事实是这样的,但这也不应该成为不使用 J2EE 安全性的理由。相反地,应该将 J2EE 验证及 J2EE 角色与特定的扩展规则结合起来。如果复杂的业务规则需要做出安全性决策,那就编写相应的代码,其安全性决策要基于可以直接使用的以及可靠的 J2EE 验证信息(用户 ID 和角色)。

5. 创建您所知道的。
反复的开发工作将使您能够逐渐地掌握所有的 J2EE 模块。要从创建小而简单的模块开始而不是从一开始就马上涉及到所有的模块。

我们必须承认 J2EE 是庞大的体系。如果一个开发小组只是开始使用 J2EE,这将很难一下子就能掌握它。在 J2EE 中有太多的概念和 API 需要掌握。在这种情况下,成功掌握 J2EE 的关键是从简单的步骤开始做起。

这种方法可以通过在您的应用程序中创建小而简单的模块来得到最好的实现。如果一个开发小组通过创建一个简单的域模型以及后端的持久性机制(也许使用的是 JDBC),并且对其进行了完整的测试,这会增强他们的自信心,于是他们会使用该域模型去掌握使用 servlet 和 JSP 的前端开发。如果一个开发组发现有必要使用 EJB,他们也会类似地开始在容器管理的持久性 EJB 组件之上使用简单的会话 Facades,或者使用基于 JDBC 的数据访问对象(JDBC-based Data Access Objects,DAO),而不是跳过这些去使用更加复杂的构造(例如消息驱动bean和JMS)。

这种方法并不是什么新方法,但是很少有开发组以这种方式来培养他们的技能。相反地,多数开发组由于尝试马上就构建所有的模块,同时涉及 MVC 中的视图层、模型层和控制器层,这样做的结果是他们往往会陷入进度的压力之中。他们应该考虑一些敏捷(Agile)开发方法,例如极限编程(XP),这种开发方法采用一种增量学习及开发方法。在 XP 中有一种称为 ModelFirst 的过程,这个过程涉及到首先构建域模型作为一种机制来组织和实现用户场景。基本说来,您要构建域模型作为您要实现的用户场景的首要部分,然后在域模型之上构建一个用户界面(UI)作为用户场景实现的结果。这种方法非常适合让一个开发组一次只学到一种技术,而不是让他们同时面对很多种情况(或者让他们读很多书),这会令他们崩溃的。

还有,对每个应用程序层重复的开发可能会包含一些适当的模式及最佳实践。如果您从应用程序的底层开始应用一些模式如数据访问对象和会话 Facades,您就不应该在您的JSP和其他视图对象中使用域逻辑。

最后,当您开发一些简单的模块时,在开始的初期就可以对您的应用程序进行性能测试。如果直到应用程序开发的后期才进行性能测试的话,这往往会出现灾难性的后果。

6. 当使用 EJB 组件时,始终使用会话 Facades。
决不要将实体 bean 直接暴露给任何用户类型。对实体 bean 只可以使用本地 EJB 接口(Local EJB interfaces)。

当使用 EJB 组件时,使用一个会话 Facades 是一个确认无疑的最佳实践。实际上,这个通用的实践被广泛地应用到任何分布式的技术中,包括 CORBA、EJB 和 DCOM。从根本上讲,您的应用程序的分布“交叉区域”越是底层化,对小块的数据由于多次重复的网络中继造成的时间消耗就越少。要达到这个目的的方法就是:创建大粒度的 Facades 对象,这个对象包含逻辑子系统,因而可以通过一个方法调用就可以完成一些有用的业务功能。这种方法不但能够降低网络开销,而且在 EJB 内部通过为整个业务功能创建一个事务环境也可以大大地减少对数据库的访问次数。

EJB 本地接口(从 EJB 2.0 规范开始使用)为共存的 EJB 提供了性能优化方法。本地接口必须被您的应用程序显式地进行访问,这需要代码的改变和防止以后配置 EJB 时需要应用程序的改变。由于会话 Facades 和它包含的整个 EJB 对于彼此来说都应该是本地的,我们建议对会话 Facades 后面的实体 bean 使用本地接口。然而,会话 Facades 本身的实现(典型例子如无状态会话 bean)应该设计为远程接口。

为了性能的优化,可以将一个本地接口添加到会话 Facades。这样做利用了这样一个事实:在大多数情况下(至少在 Web 应用程序中),您的 EJB 客户端和 EJB 会共同存在于同一个 Java 虚拟机(JVM)中。另外一种情况,如果会话 Facades 在本地被调用,可以使用 J2EE 应用服务器配置优化(configuration optimizations),例如 WebSphere 中的“No Local Copies”。然而,您必须注意到这些可供选择的方案会将交互方法从按值传递(pass-by-value)改变为按引用传递(pass-by-reference)。这可能会在您的代码中产生很微妙的错误。当您要利用这些方案时,您应该在一开始就考虑其可行性。

如果在您的会话 Facades 中使用远程接口(而不是本地接口),您也可以将同样的会话 Facades 在 J2EE 1.4 中以兼容的方式作为 Web 服务来配置。这是因为 JSR 109(J2EE 1.4 中的 Web 服务部署部分)要求使用无状态会话 bean 的远程接口作为 EJB Web 服务和 EJB 实现的接口。这样做是值得的,因为这样做可以为您的业务逻辑增加客户端类型的数量。

7. 使用无状态会话 bean,而不是有状态会话 bean。
这样做可以使您的系统经得起错误的终止。使用 HttpSession 存储和用户相关的状态。

以我们的观点看来,有状态会话 bean 的概念已经过时了。如果您仔细对其考虑一下,一个有状态会话 bean 实际上与一个 CORBA 对象在体系结构上是完全相同的,无非就是一个对象实例,绑定到一个服务器,并且依赖于服务器来管理其生命周期。如果服务器关闭了,这种对象也就不存在,那么这个 bean 的客户端的信息也就不存在。

J2EE 应用服务器为有状态会话 bean 提供的故障转移(failover)能够解决一些问题,但是有状态的解决方案没有无状态的解决方案易于扩展。例如,在 WebSphere Application Server 中,对无状态会话 bean 的请求,是通过对部署无状态会话的成员集群进行平衡加载来实现。相反地,J2EE 应用服务器不能对有状态 bean 的请求进行平衡加载。这意味着您的集群中的服务器的加载过程会是不均衡的。此外,使用有状态会话 bean 将会再添加一些状态到您的应用服务器上,这也是不好的做法。这样就增加了系统的复杂性,并且在出现故障的情况下使问题变得复杂化。创建健壮的分布式系统的一个关键原则是尽量使用无状态行为。

因此,我们建议对大多数应用程序使用无状态会话 bean 方法。任何在处理时需要使用的与用户相关的状态应该以参数的形式传送到 EJB 的方法中(并且通过使用一种机制如 HttpSession 来存储它)或者从持久性的后端存储(例如通过使用实体 bean)作为 EJB 事务的一部分来进行检索。在合适的情况下,这个信息可以缓存到内存中,但是要注意在分布式的环境中保存这种缓存所潜在的挑战性。缓存非常适合于只读数据。

总之,您要确保从一开始就要考虑到可伸展性。检查设计中的所有设想,并且考虑到当您的应用程序要在多个服务器上运行时,是否也可以正常运行。这个规则不但适合上述情况的应用程序代码,也适用于如 MBean 和其他管理界面的情况下。

避免使用有状态性不只是对 IBM/WebSphere 的建议,这是一个基本的 J2EE 设计原则。
分享到:
评论

相关推荐

    12个最重要的J2EE最佳实践

    12个最重要的J2EE最佳实践,开发过程中需要注意的事项。都是经验的分享

    Java高级-12个最重要的J2EE最佳实践

    以下是对"Java高级-12个最重要的J2EE最佳实践"的详细解释: 1. **模块化设计**:将应用分解为独立的模块,每个模块负责特定的功能,有利于代码复用和团队协作。使用Maven或Gradle等构建工具进行依赖管理。 2. **...

    最重要的 JavaEE 最佳实践

    ### 最重要的Java EE最佳实践详解 #### 一、引言 自2004年以来,IBM® WebSphere® 开发者技术期刊上曾发布过一篇关于Java Platform, Enterprise Edition (Java EE) 最佳实践的文章。随着时间的发展和技术的进步,...

    J2EE核心模式第二版

    总而言之,这本书不仅提供了丰富的J2EE开发实践经验,还引导读者理解软件设计背后的原则和最佳实践。通过学习这些核心模式,开发者能够构建出更加健壮、高效的企业级应用,同时也能更好地应对不断变化的技术环境。...

    J2EE 7英文API最新版

    总之,"J2EE 7英文API最新版"文档是开发者理解和使用J2EE 7框架不可或缺的参考资料,它详尽地介绍了各项技术的用法和最佳实践,有助于开发者高效地构建和维护企业级应用。通过深入学习这些API,开发者可以更好地掌握...

    J2EE tutorial 中文版

    **J2EE教程中文版** 是一篇关于...总之,**J2EE教程中文版** 是一份详尽的开发者指南,它不仅介绍了J2EE平台的关键技术和最佳实践,还记录了Java技术演进的历史,为那些想要掌握企业级Java开发的人员提供了宝贵的资源。

    精通BEA WebLogic Server——构建与部署J2EE应用的最佳策略

    《精通BEA WebLogic Server——构建与部署J2EE应用的最佳策略》这本书是针对企业级Java开发者和系统管理员的一份重要指南,它深入探讨了如何有效地利用BEA WebLogic Server来构建、部署以及管理J2EE(Java 2 ...

    j2ee中文帮助文档

    文章集可能涵盖了这些主题,帮助开发者深入理解Java的精髓,并提供实际项目中的最佳实践。记得解压并阅读这些文章,从中汲取经验和技巧。 然后是"Hibernate中文参考文档V3.2(CHM)"。Hibernate是一个流行的Java持久...

    j2ee的设计模式(最新版)

    设计模式是软件工程中的重要概念,它代表了在特定上下文中解决常见问题的最佳实践。"j2ee的设计模式(最新版)"这个标题暗示我们将探讨的是如何在J2EE环境中应用设计模式来提高代码的可维护性、可扩展性和可重用性。...

    J2EE系统优化大全

    J2EE(Java 2 Platform, Enterprise Edition)作为企业级应用开发的重要平台之一,一直以来都是众多开发者关注的焦点。随着技术的发展与应用需求的增加,如何高效地进行系统优化成为了一个重要的课题。本文将根据...

    j2ee企业级培训教程

    - 最后,通过分析提供的源代码,加深对J2EE设计原则和最佳实践的理解。 本教程适合有一定Java基础,希望通过实践提升到企业级开发水平的学习者。通过学习和实践,不仅可以掌握J2EE的核心技术,还能提升解决问题和...

    开发完整J2EE解决方案的八个步骤

    设计应遵循J2EE的最佳实践,如使用EJBs进行业务逻辑处理,JSPs呈现用户界面,以及数据库存储持久数据。 5. **实现与编码**:根据设计文档,编写代码实现各个组件。这包括编写JSP页面、EJBs、DAO(数据访问对象)和...

    J2EE API文档 chm格式

    4. **指南**: 包含最佳实践、设计模式和部署策略,帮助开发者做出明智的决策。 5. **附录**: 提供附加信息,如错误代码、配置选项等。 **使用J2EE API文档** 开发者通常会通过API文档查找特定的类、接口或方法,...

    J2EE课件及源代码 大连理工大学软件学院

    《J2EE技术详解:大连理工大学软件学院课程资源解析》 J2EE(Java 2 Platform, ...通过学习和实践这些课件与源代码,可以逐步掌握J2EE应用的开发流程和最佳实践,为成为一名优秀的Java EE开发者打下坚实基础。

    j2ee学习路径 路线图

    8. **最佳实践和性能优化** - **代码质量**:遵循编码规范,理解异常处理、日志记录、单元测试的重要性。 - **性能调优**:学习如何进行JVM调优、SQL优化、缓存策略等,提升应用性能。 9. **项目实践** - 完成...

Global site tag (gtag.js) - Google Analytics