概要:
随着JSP规范的不断进展,以及可用的jsp开发工具数量不断增多,以及jsp技术可涉及领域的不断的扩展,促进了基于jsp技术的高维护性能和标准化的网络应用的开发。这篇文章讨论了在jsp进展的一些主要的内容以及这些是如何更加容易的开发处健壮的JSP网络应用。
这篇文章的最佳实践将能够帮助应用JSP强大的功能以及能够让你为将来JSP的升级做好准备。
JSP规范支持JSP pages同样也支持JSP document.。两者之间主要的区别是它们对XML兼容的程度。JSP pages使用传统的或者说是“速记(shorthand)”语法,而JSP document.用的语法完全与XML相兼容。JSP document.时候被成为是使用了XML语法的JSP pages。但是这里我将分别称它们为JSP pages和JSP document.便加以区分。
基于以下几个原因我推荐使用JSP document.
JSP document.很好组织了的XML\HTML(You can easily verify JSP document. as well-formed XML/HTML)
可以使用XML Schema来验证JSP document. l 可以很容易的使用标准的XML工具来写和解析
可以使用XSLT(Extensible Stylesheet Language Transformations)以不同的form来编写JSP document.具体请看“JSP document.nbspwith XSLT” http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#sidebar1
JSP使用了XML相容include和forward action,custom标签,因而使得整个document.XML相容,这样就提高了编码的一致性。
JSP document.相对JSP pages需要稍微多一点的开发规则,但是带来的好处是更加容易阅读和维持的document.,特别是对于刚刚开始学习JSP的人来说。
关于创建JSP document.和其特点的详细内容请参考“Write JSPs in XML Using JSP1.2”(http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#resources)
JSP document.最大的缺点是没有与XML相兼容的JSP注释存在。JSP document.以使用客户端的注释(HTML-/XML ?style)或者是嵌入的java注释。但是没有JSP document.<%--
-- 而JSP可用的上面的两种注释方法都有其自身的缺点。你可以在得到的网页中看到客户端的注释(通过浏览器视图里面的“查看源文件”功能),而且要使用java的注释需要将java代码直接的写在JSP document.中。
在本文剩下的章节中,我将使用JSPs来代表JSP pages和JSP document.,因为我所讨论的最佳实践同样的适用这两种形式的JSP。
使用JSP的编码规范
无论使用任何一种语言,创建的任何工程,在提高开发,维护,和测试你的软件的角度遵循编码的标准和规范都是很明智的选择。读其他开发人员的代码并不简单而且也不是愉快的事情。但是,如果所有的开发人员都遵循同样的命名规范和其他的一些约定的化,阅读代码和维护就会使得阅读代码对他人和编程人员自己变的容易一些。
Sun Microsytem 最近已经帮助一些组织来创建这样的规范,制定了文档“Code Conventions for the JavaServer Pages Technology Version 1.x Language”可以免费获得,参考“Resources”(http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html?#resources)。如果你的公司还没有遵循JSP编程规范的话,我建议使用这个文档作为一个起点。你可以完全的遵照该文档也可以在其基础上创建自己的规范。
为对象选择合适的Scope
JSP 规范支持四种scope(应用application,会话session,请求request和页面page),在JSPs中你可以为创建的对象选择其中的一种,因为绑定到这些scope的对象消耗内存,并且在有些时候需要释放,所以最好选择适当的scope来完成你的任务。
应用范围(Application scope)
Application scope 是最为广泛的一个范围,应该在必要的时候才采用这种形式。你可以在非会话相关(session-aware)的JSPs中创建绑定到application的对象(You can create objects bound at application level in JSPs that are not session-aware,)在这种类型的JSPs中可以用应用范围来存储数据和信息。( so application scope is useful for storing information when using these types of JSPs)。你也可以使用绑定到application的对象用来在不同的会话(session)间共享数据。当你不需要application范围的对象的时候一定要显式的删除它们以便释放内存。
会话范围(session scope)
在我的经验中,会话范围要比应用范围用的多。会话范围允许你创建并且将对象绑定到一个会话上面。你必须在session-aware的JSPs中创建绑定在会话的对象并且使在同一个会话中所有的JSP和servlet能够访问到这些对象。会话范围常常用在管理安全验证和管理多个页面的状态信息。绑定在会话范围的对象在不需要的时候也要显示的删除。当我计划将某个类的对象绑定到会话范围的时候我通常会使该类可串行化。
请求范围(request scope)
在绑定对象的时候,页面范围我用的最多。此类对象只在同一个请求的页面间有效。在请求处理完成的时候这些对象将会自动的被释放。因而不需要显式的释放它们,这样就没有了使系统被一些不必要内存消耗而拖累的危险。
页面范围(page scope)
当你创建只对当前页面相关的对象的时候你需要选择页面范围。和请求范围一样,绑定在页面范围的对象不要显式的删除。我很少在我的JSP应用中使用“页面范围”,但是这是<jsp:useBean的默认范围。
选择哪种范围(scope)
需要仔细的选择创建对象的范围来保证有效的利用内存,通常我会在刚刚开始的时候选择请求范围,然后在评估是否需要选择范围更大的范围。
仔细的管理会话范围
前面已经提到过,只有在必要的时候才选择会话范围并且当这些对象不在需要会话级访问的时候需要显式的去掉对象的其会话范围。当不使用会话范围的对象的JSP中你可以设置页面的directive的session属性为false,这样可以避免管理会话范围。但是,很少的网络应用不需要会话范围的支持。通常,我使用会话来支持安全机制以及其他的一些应用需求。尽管一个会在一个可以由你配置的时间后过期,但是在不需要对象的会话范围的时候最好显式的取消它们,而不是依赖会话自动释放的功能。
采用JSTL(标准标签库)
JSP的引入和采纳已经成为JSP开发人员的一个最为重要的进步。JSTL有时候也称为“JSP Standard Tag Library”。在JSTL中的T代表的是标签(Tag)而不是模板(Template)。
JSTL:背景与回顾
在我以前的文章里,我提到过JSP开发人员采纳可以得到的自定义标签库而不是自己从头开始创建。有许多的商业的或者开源的自定义标签库现在已经可以加以利用。但是有一个缺点就是:开发人员需要在JSP中按照这些自定义标签库所特定的格式来应用这些标签。JSTL的出现解决了这个问题,因为JSTL提供了自定义标签的标准接口,这些标签足以满足JSP开发人员的一些基本的要求。(The advent of JSTL has addressed this downside by providing standard interfaces to the custom tags that perform many basic functions JSP developers need.) 不同的供应商可能以不同的形式实现这些JSTL标签,但是JSP开发人员不要知道实现标签时的不同点。如果JSP开发人员使用JSTL编写了JSP page或者JSP document.JSP page或者JSP document.该适用所有的JSTL实现方法。
有许多有价值的书和一些在线的资源可以去学习JSTL。这里我将主要简单的介绍JSTL的优点与特性。
JSTL的优点
简短的说,JSTL提供了所有的已经公布的自定义标签库所有的好处,而且提供标准化的标签API。JSTL促进了高可维护性和可移植性的pages和document.。我列出了JSTL一些特别的特点。
JSTL提供了基于标签的遍历,条件以及其他一些功能,这些功能以前或者是直接在JSP中嵌入代码来实现的,或者是使用了自己创建的标签,非标准的标签库,或者是通过使用Servlet来代替JSP来实现的。
JSTL使用了EL(expression language)语法
编写自定义标签相对其他一些JSP开发任务来说需要更多的精力与经验。JSTL通过两种方法来简化这些步骤:首先,如前所述,jstl能解决很多定制(自定义)的tags的需要.(JSTL handles many common needs for custome tags)。其次,JSTL提供了一些机制使得编写你自定义的标签更简单,尤其是编写支持EL自定义标签的时候。
具体的JSTL特性与优点
下面简单的概括JSTL4个可用自定义标签库中三个标签库的一些优点,并且给出了不推荐使用数据库访问标签库(database access library)的原因。同样我也讨论了使用EL的优点。
数据访问标签库(Database access library)
JSTL提供了数据访问标签库,但是我很少用它,因为我强烈的认为不应该在JSP页面内直接访问数据库。如果在JSP中直接的访问数据库将会降低重用,因为数据库访问的代码在使用数据库范围标签的JSP页面外是不可以被访问到的。在JSPs中直接的进行数据库访问将会加大表示层与数据层之间的耦合。严格的分割意味着更好的模块化,复用性,以及更容易的满足表现层和数据层之间的规范(Disciplined separation means more modularity, greater opportunity for reuse, and better opportunities for specialization of presentation and database experts)。.我推荐在JSTL的其他三种标签库可以满足JSP开放人员的需求的时候使用这些标签库,但是我不推荐使用JSTL的数据库范围标签库outside of prototypes and the simplest Web applications。
JSTL 核心标签库(