简而言之,你可以使用和使用HTML创建表达式一样的方法来通过自定义标记完成复杂的任务。
编写自定义标记库的时候,可以使用下列编程指南:
或自定义的JavaBeans组件的值:
<%= aCustomer.getAddress().getCountry() %>表达式语言允许页面作者使用简化的语法存取对象。例如,可以使用下面的语句存取简单变量:
<someTags:aTag attribute="${aName}">如果想要存取嵌套的JavaBeans属性,可以使用下面的语句:
<someTags.aTag attribute="${如果你使用JavaScript,你将会觉得非常熟悉,因为EL采用JavaScript语法存取结构化数据。
使用可移植的安全模型:
绝大多数服务器提供服务器或供应商特定的安全功能,这样就将开发者局限于某台特定的服务器。为了最大化企业应用的可移植性,使用一个可移植的Web应用安全模型。然而,到最后,这归结成权衡问题。例如,如果你有一组早就定义好的用户,你可以使用基于表单的登录或基本认证来管理他们。但是如果你希望动态创建用户,你就需要使用容器特定的API来创建和管理用户。但是容器特定的API不具有可移植性,使用适配器(Adapter)设计模式能够克服这一点。使用数据库存储持久信息:
可以使用HttpSession 对象实现会话,该对象提供了一个简单方便的机制来存储用户、识别用户的cookie。使用会话存储临时信息—所以即便这些信息丢失了,你也不用担心。(当会话过期或客户端改变浏览器的时候,会话数据就会丢失。) 如果你希望存储持久信息,使用数据库,在浏览器之间共享数据库中的持久信息更加安全更具有可移植性。缓存内容:
永远都不要动态重新生成请求之间不会改变的内容。你可以在客户端、代理端或服务器端缓存内容。使用连接缓冲池:
推荐使用JSTL进行数据库存取。但是如果你希望自己定制编写数据库存取的行为,推荐你使用连接池,这样能有效地让所有请求共享数据库连接。然而,注意,J2EE服务器在背后提供了该项功能。缓存数据库请求结果:
如果你希望缓存数据库结果,不要使用JDBC的ResultSet 对象作为缓存对象。它和一个链接紧密结合,这个链接和连接池相冲突。将数据从ResultSet 复制到特定应用的bean,如Vector或JDBC的RowSets。在必要的时候采取新的
JSP XML
语法:
实际上这基于你希望你的应用程序如何遵守XML。然而,这需要进行权衡,因为这使得JSP成为更加强大的工具,但是对开发者却不怎么友好。读取并应用
Enterprise BluePrints
:Sun的 Enterprise BluePrints 给开发者提供了 指南 、 模式 、 和 例子应用程序 ,如Adventure Builder和Pet Store。总的来说, J2EE BluePrints提供了最佳实践和一组设计模式,这些实践和模式是构建具有可移植性、强壮可扩展的Java应用程序中经常出现的问题的解决方案。· 集成Servlets和JSP页面
JSP规范给出了使用JSP页面构建Web应用程序的两个方案:JSP模型1和模型2体系结构。这两个模型的区别在于处理的位置。在模型1的体系结构中,如图2所示,JSP页面负责处理请求并将响应发送给客户端。

图 2: JSP 模型 1 体系结构
模型2体系结构,如图3所示,集成使用了servlets 和JSP页面。在该模型中,JSP页面用于表示层,并且servlets负责处理各类任务。Servlet作为一个 控制器 ,负责处理请求并创建JSP页面所需的任何bean。该控制器也负责确定将该请求传递到哪个JSP页面。JSP页面检索servlet创建的对象,并提取动态内容插入在一个模板中。

图 3: JSP 模型 2 体系结构
该模型促进了模型视图控制器(MVC)体系结构风格设计模式的使用。注意,早就存在多个框架能够实现该有用的设计模式,并将内容和表示真正地独立开来。Apache Struts是MVC的形式化框架。该框架非常适用于复杂的应用程序,在这些复杂的应用程序中单个请求或表单提交会产生看起来截然不同的结果。
· 结束语最佳实践—事实证明是经常重复出现的问题的解决方案—产生了高质量的应用程序。本文是开发servlet时需要遵守的多个指南和最佳实践-和基于JSP的Web应用程序。
请留心servlets和JSP技术,因为在这些技术中有许多激动人心的东西。例如,JavaServer Faces (JFC),是一个Java程序社区(Java Community Process),它的目标是定义一个标准的Web应用框架,这将很好地和Apache Struts集成。