Jasper 2 JSP Engine How To

Table of Contents

Introduction

Tomcat 8.5使用Jasper 2 JSP Engine来实现JavaServer Pages 2.3规范.

Jasper 2已经过重新设计,以显着提高原始Jasper的性能. 除了对常规代码进行了改进之外,还进行了以下更改:

  • JSP自定义标签池 -现在可以将为JSP自定义标签实例化的java对象化并重新使用. 这极大地提高了使用自定义标记的JSP页面的性能.
  • 后台JSP编译 -如果更改了已经编译过的JSP页面,Jasper 2可以在后台重新编译该页面. 先前编译的JSP页面仍可用于处理请求. 成功编译新页面后,它将替换旧页面. 这有助于提高生产服务器上JSP页面的可用性.
  • 当包含的页面发生更改时,重新编译JSP -Jasper 2现在可以检测到在编译时来自JSP的页面是否发生了更改,然后重新编译父JSP.
  • 用于编译JSP页面的JDT-Eclipse JDT Java编译器现在用于执行JSP Java源代码编译. 该编译器从容器类加载器加载源依赖项. 仍然可以使用Ant和javac.

Jasper使用servlet类org.apache.jasper.servlet.JspServlet .

Configuration

默认情况下,Jasper配置为在进行Web应用程序开发时使用. 有关配置Jasper以在生产Tomcat服务器上使用的信息,请参见生产配置部分.

使用全局$CATALINA_BASE/conf/web.xml init参数配置实现Jasper的servlet.

  • checkInterval-如果开发错误,并且checkInterval大于零,则启用后台编译. checkInterval是两次检查之间的时间(以秒为单位),以查看是否需要重新编译JSP页面(及其相关文件). 默认值0秒.
  • classdebuginfo-是否应使用调试信息编译类文件? truefalse ,默认为true .
  • classpath-定义用于编译生成的servlet的类路径. 仅当未设置ServletContext属性org.apache.jasper.Constants.SERVLET_CLASSPATH时,此参数才有效. 在Tomcat中使用Jasper时,始终设置此属性. 默认情况下,类路径是基于当前Web应用程序动态创建的.
  • 编译器-Ant应该使用哪个编译器来编译JSP页面. 有效值与Ant的javac任务的编译器属性相同. 如果未设置该值,那么将使用默认的Eclipse JDT Java编译器,而不是使用Ant. 没有默认值. 如果设置了此属性,则应使用setenv.[sh|bat]ant.jarant-launcher.jartools.jarCLASSPATH环境变量中.
  • compilerSourceVM - What JDK version are the source files compatible with? (Default value: 1.7)
  • compilerTargetVM -什么JDK版本是生成的文件兼容? (默认值: 1.7
  • 开发 -Jasper是否在开发模式下使用? 如果为true,则可以通过ModifyTestInterval参数指定检查JSP修改的频率. truefalse ,默认为true .
  • displaySourceFragment-异常消息中应包含源片段吗? truefalse ,默认为true .
  • dumpSmap-是否应将用于JSR45调试的SMAP信息转储到文件中? truefalse ,默认为false . false如果suppressSmap是真实的.
  • enablePooling-确定是否启用标记处理程序池. 这是一个编译选项. 它不会改变已经编译的JSP的行为. truefalse ,默认为true .
  • engineOptionsClass-允许指定用于配置Jasper的Options类. 如果不存在,将使用默认的EmbeddedServletOptions. 如果在SecurityManager下运行,则忽略此选项.
  • errorOnUseBeanInvalidClassAttribute-当useBean操作中的类属性的值不是有效的bean类时,Jasper是否应发出错误? truefalse ,默认为true .
  • fork-是否已编译Ant fork JSP页面,以便在与Tomcat分开的JVM中执行它们? truefalse ,默认为true .
  • genStringAsCharArray-文本字符串是否应作为char数组生成,以在某些情况下提高性能? 默认为false .
  • ieClassId-使用<jsp:plugin>标记时要发送到Internet Explorer的class-id值. 默认clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 .
  • javaEncoding-用于生成Java源文件的Java文件编码. 默认为UTF8 .
  • keepgeneration-我们应该保留每个页面生成的Java源代码,而不是删除它吗? truefalse ,默认为true .
  • 映射文件 -我们是否应该在每行输入一条打印语句的情况下生成静态内容,以简化调试工作? truefalse ,默认为true .
  • maxLoadedJsps-将为Web应用程序加载的JSP的最大数量. 如果加载的JSP数量超过此数量,则将卸载最近最少使用的JSP,以便在任何一次加载的JSP数量均不超过此限制. 零或更少的值表示没有限制. 默认值-1
  • jspIdleTimeout - The amount of time in seconds a JSP can be idle before it is unloaded. A value of zero or less indicates never unload. Default -1
  • modifyTestInterval-导致自上次检查JSP的修改以来的指定时间间隔(以秒为单位),不检查JSP(及其相关文件)的修改. 值为0将导致每次访问都检查JSP. 仅在开发模式下使用. 默认值为4秒.
  • recompileOnFail-如果JSP编译失败,是否应该忽略modificationTestInterval,并且下次访问会触发重新编译尝试? 仅在开发模式下使用,并且默认情况下被禁用,因为编译可能很昂贵,并且可能导致过多的资源使用.
  • scratchdir-编译JSP页面时应该使用哪个草稿目录? 默认值为当前Web应用程序的工作目录. 如果在SecurityManager下运行,则忽略此选项.
  • suppressSmap -应该为JSR45调试SMAP信息的生成被抑制? truefalse ,默认为false .
  • trimSpaces-是否应删除完全由空格组成的模板文本? truefalse ,默认为false .
  • xpoweredBy-确定生成的servlet是否添加X-Powered-By响应标头. truefalse ,默认为false .
  • strictQuoteEscaping-将scriptlet表达式用于属性值时,是否应严格应用JSP.1.6中用于将引号字符转义的规则? truefalse ,默认为true .
  • quoteAttributeEL-当在JSP页面的属性值中使用EL时,是否应将JSP.1.6中描述的属性引用规则应用于表达式? truefalse ,默认为true .

Eclipse JDT中的Java编译器作为默认编译器包含在内. 它是一个高级Java编译器,将从Tomcat类加载器加载所有依赖项,当在具有数十个JAR的大型安装中进行编译时,这将极大地帮助您. 在快速服务器上,这将允许亚秒级的重新编译周期,即使是大型JSP页面也是如此.

通过如上所述配置编译器属性,可以在以前的Tomcat版本中使用Apache Ant代替新的编译器.

Known issues

错误39089中所述 ,已知的JVM问题( 错误6294277 )可能会导致java.lang.InternalError: name is too long to represent在编译非常大的JSP时java.lang.InternalError: name is too long to represent异常. 如果观察到这种情况,则可以使用以下方法之一解决该问题:

  • 减小JSP的大小
  • 禁止SMAP代,并通过设置JSR-045支持suppressSmaptrue .

Production Configuration

可以完成的主要JSP优化是JSP的预编译. 但是,这可能是不可能的(例如,在使用jsp-property-group功能时)或不实用,在这种情况下,Jasper servlet的配置变得至关重要.

在生产Tomcat服务器中使用Jasper 2时,应考虑对默认配置进行以下更改.

  • development-要禁用对JSP页面编译的访问检查,请将其设置为false .
  • genStringAsCharArray-要生成效率更高的char数组,请将其设置为true .
  • modifyTestInterval-如果出于某种原因(例如动态生成JSP)必须将开发设置为true ,则将该值设置为较高的值将大大提高性能.
  • trimSpaces-要从响应中删除无用的字节,请将其设置为true .

Web Application Compilation

使用Ant是使用JSPC编译Web应用程序的首选方法. 请注意,在预编译JSP时,仅当preventSmap为false并且compile为true时,SMAP信息才包含在最终类中. 使用下面给出的脚本("部署程序"下载中包含类似的脚本)来预编译Webapp:

<project name="Webapp Precompilation" default="all" basedir=".">

   <import file="${tomcat.home}/bin/catalina-tasks.xml"/>

   <target name="jspc">

    <jasper
             validateXml="false"
             uriroot="${webapp.path}"
             webXmlInclude="${webapp.path}/WEB-INF/generated_web.xml"
             outputDir="${webapp.path}/WEB-INF/src" />

  </target>

  <target name="compile">

    <mkdir dir="${webapp.path}/WEB-INF/classes"/>
    <mkdir dir="${webapp.path}/WEB-INF/lib"/>

    <javac destdir="${webapp.path}/WEB-INF/classes"
           debug="on" failonerror="false"
           srcdir="${webapp.path}/WEB-INF/src"
           excludes="**/*.smap">
      <classpath>
        <pathelement location="${webapp.path}/WEB-INF/classes"/>
        <fileset dir="${webapp.path}/WEB-INF/lib">
          <include name="*.jar"/>
        </fileset>
        <pathelement location="${tomcat.home}/lib"/>
        <fileset dir="${tomcat.home}/lib">
          <include name="*.jar"/>
        </fileset>
        <fileset dir="${tomcat.home}/bin">
          <include name="*.jar"/>
        </fileset>
      </classpath>
      <include name="**" />
      <exclude name="tags/**" />
    </javac>

  </target>

  <target name="all" depends="jspc,compile">
  </target>

  <target name="cleanup">
    <delete>
        <fileset dir="${webapp.path}/WEB-INF/src"/>
        <fileset dir="${webapp.path}/WEB-INF/classes/org/apache/jsp"/>
    </delete>
  </target>

</project>

以下命令行可用于运行脚本(将令牌替换为Tomcat基本路径和应预编译的webapp路径):

$ANT_HOME/bin/ant -Dtomcat.home=<$TOMCAT_HOME> -Dwebapp.path=<$WEBAPP_PATH>

然后,必须将预编译期间生成的servlet的声明和映射添加到Web应用程序部署描述符中. 在${webapp.path}/WEB-INF/generated_web.xml中的正确位置插入${webapp.path}/WEB-INF/web.xml . 重新启动Web应用程序(使用管理器)并对其进行测试,以验证其是否可以在预编译的Servlet正常运行. 放置在Web应用程序部署描述符中的适当令牌也可以用于使用Ant过滤功能自动插入生成的Servlet声明和映射. 实际上,这就是在构建过程中如何自动编译与Tomcat一起分发的所有Web应用程序的方式.

在jasper任务中,您可以使用选项addWebXmlMappings自动将${webapp.path}/WEB-INF/generated_web.xml与当前Web应用程序部署描述${webapp.path}/WEB-INF/web.xml并到${webapp.path}/WEB-INF/web.xml . 当您想在JSP中使用Java 6功能时,请添加以下javac编译器任务属性: source="1.6" target="1.6" . 对于实时应用程序,您还可以使用debug="off"禁用调试信息.

generation are printed out. 当您不想在第一次JSP语法错误时停止JSP生成时,请使用failOnError="false"并使用showSuccess="true"打印所有成功的生成. 有时在清理${webapp.path}/WEB-INF/src的生成Java源文件和${webapp.path}/WEB-INF/classes/org/apache/jsp的编译JSP servlet类时非常有用. ${webapp.path}/WEB-INF/classes/org/apache/jsp .

Hints:

  • 当您切换到另一个Tomcat版本时,请使用新的Tomcat版本重新生成并重新编译您的JSP.
  • 在服务器运行时使用java系统属性来禁用PageContext池org.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false . 并使用org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true限制缓冲. 请注意,更改默认设置可能会影响性能,但是会因应用程序而异.

Optimisation

Jasper内提供了许多扩展点,使用户可以优化其环境的行为.

这些扩展点中的第一个是标签插件机制. 这允许提供标记处理程序的替代实现,以供Web应用程序使用. 标签插件通过位于WEB-INF下的tagPlugins.xml文件进行注册. Jasper随附了JSTL的示例插件.

第二个扩展点是表达式语言解释器. 可以通过ServletContext配置其他解释器. 有关如何配置备用EL解释器的详细信息,请参见ELInterpreterFactory Javadoc.

by  ICOPY.SITE