读书人

WebLogic Server-避免用不着的JSP重新

发布时间: 2012-09-20 09:36:50 作者: rapoo

WebLogic Server-避免不必要的JSP重新编译
摘要
  关于JavaServer页面(JSP)新闻组的最常见的一个问题与重新编译有关。不想重新编译JSP,却又不得不这样做,这是许多开发人员所面对的烦恼。本文将描述造成重新编译的场景,并从解释WebLogic JSP容器的内部操作开始,介绍每个显然“不受欢迎的”场景,并应用容器的过期检查算法(Stale Checking Algorithm)。此外,本文还将讨论控制JSP和servlet类重载的参数。对以生产模式下运行的服务器,极力推荐这么做。

JSP容器的过期检查机制
  在WebLogic中,JSP被编译成.class文件。我们使用的术语过期检查机制(Stale Checking Mechanism)指的是用来判断某一特殊JSP .class文件是否比当前JSP文件更旧(“过期”)的逻辑。WebLogic JSP容器确保任何JSP及其相关文件只在修改后才能被重新编译。查看生成的Java代码是了解JSP容器内部操作的一个好方法。我们将采用一个JSP作为例子,使用命令行JSP编译器编译它,并查看生成的源代码。JSP编译器(WebLogic.jspc)是随标准WebLogic 服务器安装工具箱一起提供的。

考虑一个称为foo.jsp的简单JSP页面:

A simple JSP page

  现在使用命令行JSP编译器来编译这个JSP,指定一个称为keepgenerated的选项,顾名思义,该选项为JSP页面生成相应的Java代码,并将代码保存在磁盘上。

java weblogic.jspc -keepgenerated -d .WEB-INFclasses foo.jsp[jspc]warning: expected file /WEB-INF/web.xml not found,tag libraries cannot be resolved.<Jul 11, 2004 7:29:26 PM PDT> <Warning> <HTTP> <BEA-101181> <Could not find web. xml under WEB-INF in the doc root: ..>

  编译器在作为上述选项指定的输出目录(-d)中生成.java文件及其对应的.class文件。它将生成的类文件放在称为jsp_servlet的包中,这恰巧是默认的JSP包前缀(除非在weblogic.xml中覆盖),因此,生成的Java文件可在.WEB-INFclassesjsp_servlet中找到,并且称为__foo.java。
  请注意,我们可忽略编译器发出的关于未找到web.xml文件的警告,因为此时我们并没有真正使用标签库。
  在生成代码(__foo.java)中,与我们的讨论最相关的部份就是staticIsStale()方法,如下所示。

清单1. staticIsStale()方法

<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"><weblogic-web-app>    <container-descriptor>         <servlet-reload-check-secs>-1</servlet-reload-check-secs>     </container-descriptor></weblogic-web-app>

JSP类加载器
  我们将通过查看WebLogic服务器如何加载JSP类来结束我们的讨论。每个JSP都是在自己的类加载器(通常称为一次性类加载器)中加载的。该类加载器是Web应用程序类加载器的子加载器,负责加载有关的JSP类及其内部类(如果有的话)。好奇的读者可能会觉得奇怪,为什么WebLogic在每个JSP自己的类加载器中加载JSP。真的需要这么复杂吗?WebLogic不能只用应用程序类加载器而使得生活更轻松吗?所有这些问题都是有根据的,而且每个寻求WebLogic类加载器天堂的人都应该问自己这些问题。为了解决这些问题,让我们设想我们的Web应用程序有几个JSP、少数servlet、一个过滤器以及几百个还包含标签处理器类的实用类。现在,假设所有这些类都被加载到单个类加载器中。如果修改单个JSP,然后单击浏览器上的重载,那么下面的事情将不得不发生:

读书人网 >Web前端

热点推荐