在 JSP 中,网页设计师要使用表达式语法 <%= name %> 或 JavaBean 组件来取得某些变量或属性的值,例如:
<tagLib:tag attribute="<%=
pageContext.getAttribute("name") %>">
或
<%= aCustomerBean.getAddress().getCountry() %>
表达使语言让网页设计师可以使用简化的语法来访问信息。如果你只是要访问一个简单的变量,你可以使用这样的语法:
<tagLib:tag attribute="${name}">
如果你要访问一个嵌套 JavaBean 的属性,你可以这样:
<tagLib:tag attribute ="${
aCustomerBean.address.country}">
表达式语言( EL )借用了 JavaScript 的语法,所以如果你对 JavaScript 很熟悉的话,你就会觉得巨爽。
- 使用过滤器( filter ): 过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达 Servlet/JSP 之前对其进行预处理,而且能够在响应离开 Servlet/JSP 之后对其进行后处理。所以如果你有几个 Servlet/JSP 需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文件( web.xml )中把该过滤器与对应的 Servlet/JSP 联系起来。
创建过滤器其实很容易,你只须实现 javax.servlet.Filter 接口及它的三个方法:
public void init(FilterConfig config)
public void doFilter(ServletRequest req, ServletResponse rep,
FilterChain chain)
public void destroy()
这样,你就可以完成你的过滤器。
- 使用可移植的安全模型: 大部分的应用服务器都提供了安全模型,不过一般它们都是针对某一个服务器或某一个厂商专有的。如果你的应用需要移植的话,那么你的应用最好使用可以移植的安全模型。如果你的应用有一些预先定义的固定用户的话,那么你可以使用 FROM 验证和 BASIC 验证。可是如果你要动态生成客户的话(一般都是这种情况),你可能就需要使用服务器特定的 API 来创建和管理用户。这样当你的应用移植到另外一个服务器时,你可能就会碰到 API 不兼容的问题。这种情况下,最好的解决方法是使用适配器( Adapter )模式(如果你对设计模式不熟悉的话,请参看 GoF 的《设计模式》一书)。
- 用数据库来保存持久性数据: Servlet/JSP 中可以使用 HttpSession 对象也就是会话对象来保存用户的临时数据。不过如果你想保存持久性数据的时候,你应该使用数据库,数据保存数据会更安全,而且对客户所用的浏览器没有什么要求。这样即使你的应用服务器由于某种原因崩溃了,你的数据依然良好。
- 高速缓存页面: 应用程序中总有一些东西是相对固定的,而另外一些东西是经常变化的。你应该使用静态的 HTML 文档来存储那些相对固定的内容,这样客户端就可以进行高速缓存,客户每次访问你的应用时,只需访问已经改动的部分。这样可以加快客户的访问速度。
- 使用连接池: 如果你要自己写数据库访问代码的话,我觉得使用你应该学会如何使用数据库连接池技术。每一个服务器都有针对数据库连接池的配置文档,你要学习一下如何使用。数据库连接池可以加速你的应用的数据访问的速度,而且由于服务器替你管理了数据库连接,这可以节省你的很多工作。
- 缓存数据库的访问结果: 如果你的应用要对数据库进行频繁访问的话,你可以使用一个对象来缓存你的数据,这样你就可以节省大量访问数据库的开销。在《 J2EE 核心模式》和《实用 J2EE 设计模式编程指南》两本书中都有关于值对象模式( Value Object Pattern )的详细探讨,你可以参考这两本书来获得相应的知识。
使用数据访问对象模式: 如果你的应用需要访问多个数据库系统或者可能会移植到其它的存储系统中,那么你针对特定厂商的优化代码就可能会失效。使用通用的代码存在执行效率的问题,而使用优化代码又存在移植的问题。所以就产生了数据访问对象模式( Data Access Object Pattern, DAO ),该模式既提供了各数据库厂商的适应性,又能利用到他们提供的独特的好处。按照面向对象的分离任务的原则,该模式将与企业信息系统( Enterprise Information System, EIS )通讯需要的逻辑隔离到它自己的类中。这样,事物对象,如 Servlet/JSP 组件、 JavaBean 就可以利用数据访问对象( DAO )处理所有与 EIS 有关的事务。
- 最好采用 JSP 的 XML 语法: JSP 技术中经常存在着两种完成同一个任务的语法,一种是常规的 JSP 语法,一种是对应的 XML 语法。虽然两种语法作用相同,你最好还是使用 XML 语法。存在两种语法的原因是, JSP 语法可以与以前的代码兼容,而 J2EE 使用 XML 作为其交换数据的核心,所以同时提供了 XML 语法。随着 J2EE 的发展, XML 的作用会越来越大,所以我建议你使用 XML 语法。
- 研究 Sun 提供的 J2EE BluePrints : Sun 的 Enterprise BluePrints 提供了大量指导原则、设计模式和很好的例子(宠物店, Pet Store )。你可以好好研究一下这些内容,这样可以提高你的设计和开发水平。
整合 Servlet 和 JSP
JSP 技术规范种给出了两种使用 JSP 开发 Web 应用的方式,这两种方式可以归纳为模型一和模型二,这两种模型的主要差别在于它们处理业务的流程不同。模型一,如下图所示,称之为 JSP+JavaBeans 模型。在这一模型中, JSP 页面独自响应请求并将处理结果返回给客户,所有的数据通过 JavaBean 来处理, JSP 实现页面的表现。
图 2 : JSP 模型一
从上图可以看出,模型一也实现了页面表现和业务逻辑相分离。然而使用这种方式就要在 JSP 页面使用大量的 Java 代码,当需要处理的业务逻辑很复杂时,这种情况会变得非常糟糕。大量嵌入式代码使整个页面程序变得异常复杂。对于前端界面设计的网页开发人员来说,这简直是一场噩梦。所以,模型一不能满足大型应用的需要,但是对于小型应用,因为该模型简单,不用涉及诸多要素,从而可以很好地满足小型应用的需要,所以在简单应用中,可以考虑模型一。
模型二,如下图所示,称之为 JSP+Servlet+JavaBeans 模型。这一模型结合了 JSP 和 Servlet 技术,充分利用了 JSP 和 Servlet 两种技术原有的优势。这个模型使用 JSP 技术来表现页面,使用 Servlet 技术完成大量的事务处理,使用 Bean 来存储数据。 Servlet 用来处理请求的事务,充当一个控制者的角色,并负责向客户发送请求。它创建 JSP 需要的 Bean 和对象,然后根据用户请求的行为,决定将哪个 JSP 页面发送给客户。
图 3 : JSP 模型二
从开发的观点看,模型二具有更清晰的页面表现,清楚的开发角色的划分,可以充分利用开发团队中的网页设计人员和 Java 开发人员。这些优势在大型项目中表现得尤为突出,网页设计人员可以充分发挥自己的美术和设计才能来充分表现页面,程序编写人员可以充分发挥自己的业务逻辑处理思维,实现项目中的业务处理。
另外,从设计结构来看,这种模型充分体现了模型视图控制器( MVC )的设计架构。事实上,现存的很多开发框架都是基于这种模型的,充分实现了 MVC ,例如 Apache Struts 框架和 JavaServer Faces 框架(关于 JavaServer Faces 框架,我翻译了一篇介绍性的文章 《 用 JavaServer Faces 开发 Web 应用 》,大家可以参考一下;关于 Struts ,大家可以参考 Apache 网站 )。
· 其他:
我们总结了一些用 JSP/Servlet 技术进行 Web 开发的原则,通过实施这些原则,可以开发出可以复用的、结构良好的 Web 应用。当然,我们这里的总结还是远远不够的,希望在以后的工作和学习中可以得到更大程度的提高。
如果想详细了解稳中提到的技术,大家可以参考:
1 、《 Servlet 和 JSP 权威指南》,它的网站为 http://www.moreservlets.com/ ,这里还有作者的另外一本书《 Core Servlet and JSP 》的 PDF 版本可以免费下载。这本书详细介绍了 Servlet 、 JSP 、 Tag 标记库、 JSTL 、 MVC 和 Servlet 容器模型等等技术,是一本比较全面的关于使用 Java 开发 Web 应用的书。它的缺陷就在于为了与以往程序兼容,它在很多地方使用了 JSP1.1 的语法,当然对于熟悉 JSP 历史的读者来说,这并没有什么影响。
2 、《 Java2 Web 开发认证学习指南》这是一本认证的书,不过里面还是详细介绍了 Servlet 模型、 Servlet 容器模型、 Java 授权和认证策略( JAAS )、 JSP 以及设计模式等等。大家也可以一看。
3 、《设计模式:可复用面向对象软件的基础》这是设计模式的经典书籍,这里就不说了。
4 、《 J2EE 核心模式》介绍了 15 个 J2EE 的设计模式,对如何设计一个结构良好的应用很有帮助,不过他有些模式使用的技术有些过时。
5 、《实用 J2EE 设计模式编程指南》这是一本新书,里面既有《 J2EE 核心模式》中的 15 个 J2EE 设计模式,又涉及了 TheServerSide.com 模式仓库(读者可以访问 模式仓库 )中的 17 个 J2EE 设计模式。
6 、 关于 Struts ,请参考 Apache Struts 网站 。
7 、关于 JavaServer Faces ,请参考 Sun 的 JavaServer Faces 网站 。








