js概要:
JSP规范的不断进展,可用的jsp开发工具数量不断增多,以及jsp技术可涉及领域的不断的扩展,促进了基于jsp技术的高维护性能和标准化的网络应用的开发。这篇文章讨论了在jsp进展中的一些主要内容以及如何更容易的开发健壮的JSP网络应用。这篇文章可以帮助读者提高应用JSP强大功能的能力,并能够让你为将来JSP的升级做好准备。
? 自从我(原文作者)在2001年底发表了“JSP最佳实践”以来,JSP技术已经有了戏剧性的发展。许多的工具已经使得开发基于JSP技术的网页变的更加容易。在上一篇我的“最佳实践”的文章中所提到的实践依然适用。然而,随着新的特性,工具,以及JSP开发思想的出现你需要使用更多的最佳实践来开发更加平滑的高维护性能的JSP的应用。这篇文章列出了一些应用了最重要的新的特性,工具和思想的最佳实践:
开始编写JSP document.
引入JSP编程约定
使用正确的范围(Scope)
小心的管理“会话”范围
利用JSTL(JavaServer Pages Standard Tag Library)的特点
利用servlet filers(Intercepting Filter pattern)的特点
创建你的Jsp pages的文档
预先编译JSP网页和文档
组织文件和目录以便于容易的开发和部署
小心使用私有的,与供应商特定的特性
HTML标签使用XHTML(Extensible HyperText Markup Language)语法
使用JSP document.不是JSP pages
JSP规范支持JSP pages同样也支持JSP document。两者之间主要的区别是它们对XML兼容的程度。JSP pages使用传统的或者说是“速记(shorthand)”语法,而JSP document.用的语法完全与XML相兼容。JSP document.时候被成为是使用了XML语法的JSP pages。但是这里我将分别称它们为JSP pages和JSP document.便加以区分。
基于以下几个原因我推荐使用JSP document.
1.JSP document.很好组织了的XML\HTML(You can easily verify JSP document. as well-formed XML/HTML)
2.可以使用XML Schema来验证JSP document. l 可以很容易的使用标准的XML工具来写和解析
3.可以使用XSLT(Extensible Stylesheet Language Transformations)以不同的form来编写JSP document.具体请看“JSP document.nbspwith XSLT”http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp.html
4.JSP使用了XML相容include和forward action,custom标签,因而使得整个document.XML相容,这样就提高了编码的一致性。
5.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)
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)。如果你的公司还没有遵循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应用中使用“页面范围”,但是这是的默认范围。
选择哪种范围(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一些特别的特点。
1.JSTL提供了基于标签的遍历,条件以及其他一些功能,这些功能以前或者是直接在JSP中嵌入代码来实现的,或者是使用了自己创建的标签,非标准的标签库,或者是通过使用Servlet来代替JSP来实现的。
2.JSTL使用了EL(expression language)语法
3.编写自定义标签相对其他一些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 核心标签库(JSTL core tag library)
正像名字一样,JSTL核心标签库是在JSTL四种标签库中最常用的一种。这个标签库提供了对collection的遍历,条件语句以及其它一些常用的程序结构。JSTL核心标签库可以使得JSP开放人员不必编写他们自己的自定义标签库或者直接在JSPs中嵌入Java代码。
JSTL XML 标签库(JSTL XML tag library)
这个标记库提供了一些令人赞叹的且功能强大的XML操纵标签和XSLT转换标签。
JSTL formatting 标签库
如果需要在多个国家提供网页和网址,那么国际化(internationalization)对网络开发项目(web development projects)来说是一个很大的挑战。JSTL formatting标签库为此向JSP开发人员提供了一些自定义标签,可以支持按照特定的区域读写数字和实践。
Expression Language
JSTL以上的自定义标签库有两种类型:RT(traditional request time)自定义标签库和EL标签。因为EL要更灵活一些,所有我推荐使用EL自定义标签库。
JSTL和其他一些自定义标签库
因为自定义标签库(custom tag library)在JSTL引入以前已经使用了很长的时间,许多的个体和组织都已经开发了自定义的标签库。这些标签库在很大程度上与JSTL的功能都有重复。在大多数情况下,在考虑实现相同的功能时,我推荐使用JSTL而不是自己开放的自定义标签库或者时其他一些可以得到的自定义标签库(other publicly available custom tag library)。JSTL提供的标准化是一个意义重大的优点因为API可以学一次,而后你就可以一贯的使用了。
比较Struts的标签库和JSTL标签库提供可以获得一个很好利用这些最佳实践的例子(Comparing Struts tag libraries and JSTL provides a good example of how to implement this best practice)。Struts提供了MVC框架以外其他的一些优点。其中包括的Struts的自定义标签库集合。在JSTL引入之前,Struts的自定义标签库已经支持遍历( iteration)以及条件标签,但是现在我开始使用JSTL的遍历和条件标签而不是Struts里面的标签。我现在仍然再使用Struts的form标签,这是因为这个标签与Struts的表单(form)紧密的联系在一起,而且在JSTL没有相对应的标签可用。
比较其他的一些自定义标签库和JSTL标签库,上面的讨论也是适用的。如果JSTL标签库可以完全的支持同样的功能的话,应该使用标准的JSTL标签。当然如果JSTL不支持的话,你就没有办法了。在大多数情况下,像我上面讨论的Struts标签和JSTL标签,通常需要同时使用JSTL和其他一些自定义标签。
JSTL:最后的补充
关于JSTL更详细的内容,她的特点,以及如何在你的jsp中应用JSTL请参考“resources” http://www.javaworld.com/javaworld/jw-07-2003/jw-0725-morejsp-p2.html。在“resource”中包含了到“Apache's Standard Taglib(一个开源的,广泛使用的JSTL实现)的连接。Web server的提供商已经开始在他们的web服务器上发布JSTL的实现,JSTL预测将成为最终的JSP2。0规范中的一部分。