• Tomcat 6 --- 使用Jasper引擎解析JSP


    熟悉JAVA web开发的朋友都知道JSP会被转换成java文件(预编译),然后编译成class使用,即按照JSP-->java-->class的过程进行编译。

    由于JVM只认识class文件,它不知道什么是JSP,因此在tomcat中 如何把JSP解析成java文件 就是本文所要描述的问题。

    其他翻译内容参考:Tomcat官方文档翻译 

    如有错误,请予指正。

    什么是Jasper

      Jasper是tomcat中使用的JSP引擎,在Tomcat 6中使用的是Jasper 2,相对于原来的版本作了不少的改进,比如:JSP的标签缓冲池、后台编译、页面改变时自动重新编译、Eclipse中JDT编译等等。

      那么Jasper到底是做什么的呢?

      简单的说,就是把JVM不认识的JSP文件解析成java文件,然后编译成class文件提供使用。目前有很多的JSP解析引擎,Tomcat中使用的是Jasper。

      在Tomcat中可以通过配置 CATALINA_HOME/conf/web.xml 中的内容,配置Jasper的选项(web.xml中的内容很长,截取其中的一部分):

      <!-- The JSP page compiler and execution servlet, which is the mechanism  -->
      <!-- used by Tomcat to support JSP pages.  Traditionally, this servlet    -->
      <!-- is mapped to the URL pattern "*.jsp".  This servlet supports the     -->
      <!-- following initialization parameters (default values are in square    -->
      <!-- brackets):                                                           -->
      <!--                                                                      -->
      <!--   checkInterval       If development is false and checkInterval is   -->
      <!--                       greater than zero, background compilations are -->
      <!--                       enabled. checkInterval is the time in seconds  -->
      <!--                       between checks to see if a JSP page (and its   -->
      <!--                       dependent files) needs to  be recompiled. [0]  -->
      <!--                                                                      -->
      <!--   classdebuginfo      Should the class file be compiled with         -->
      <!--                       debugging information?  [true]                 -->
      <!--                                                                      -->
      <!--   classpath           What class path should I use while compiling   -->
      <!--                       generated servlets?  [Created dynamically      -->
      <!--                       based on the current web application]          -->
      <!--                                                                      -->
      <!--   compiler            Which compiler Ant should use to compile JSP   -->
      <!--                       pages.  See the jasper documentation for more  -->
      <!--                       information.                                   -->
      <!--                                                                      -->
      <!--   compilerSourceVM    Compiler source VM. [1.5]                      -->
      <!--                                                                      -->
      <!--   compilerTargetVM    Compiler target VM. [1.5]                      -->  
      <!--                                                                      -->
      <!--   development         Is Jasper used in development mode? If true,   -->
      <!--                       the frequency at which JSPs are checked for    -->
      <!--                       modification may be specified via the          -->
      <!--                       modificationTestInterval parameter. [true]     -->
      <!--                                                                      -->
      <!--   displaySourceFragment                                              -->
      <!--                       Should a source fragment be included in        -->
      <!--                       exception messages? [true]                     -->
      <!--                                                                      -->
      <!--   dumpSmap            Should the SMAP info for JSR45 debugging be    -->
      <!--                       dumped to a file? [false]                      -->
      <!--                       False if suppressSmap is true                  -->
      <!--                                                                      -->
      <!--   enablePooling       Determines whether tag handler pooling is      -->
      <!--                       enabled. This is a compilation option. It will -->
      <!--                       not alter the behaviour of JSPs that have      -->
      <!--                       already been compiled. [true]                  -->
      <!--                                                                      -->
      <!--   engineOptionsClass  Allows specifying the Options class used to    -->
      <!--                       configure Jasper. If not present, the default  -->
      <!--                       EmbeddedServletOptions will be used.           -->
      <!--                                                                      -->
      <!--   errorOnUseBeanInvalidClassAttribute                                -->
      <!--                       Should Jasper issue an error when the value of -->
      <!--                       the class attribute in an useBean action is    -->
      <!--                       not a valid bean class?  [true]                -->
      <!--                                                                      -->
      <!--   fork                Tell Ant to fork compiles of JSP pages so that -->
      <!--                       a separate JVM is used for JSP page compiles   -->
      <!--                       from the one Tomcat is running in. [true]      -->
      <!--                                                                      -->
      <!--   genStringAsCharArray                                               -->
      <!--                       Should text strings be generated as char       -->
      <!--                       arrays, to improve performance in some cases?  -->
      <!--                       [false]                                        -->
      <!--                                                                      -->
      <!--   ieClassId           The class-id value to be sent to Internet      -->
      <!--                       Explorer when using <jsp:plugin> tags.         -->
      <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
      <!--                                                                      -->
      <!--   javaEncoding        Java file encoding to use for generating java  -->
      <!--                       source files. [UTF8]                           -->
      <!--                                                                      -->
      <!--   keepgenerated       Should we keep the generated Java source code  -->
      <!--                       for each page instead of deleting it? [true]   -->
      <!--                                                                      -->
      <!--   mappedfile          Should we generate static content with one     -->
      <!--                       print statement per input line, to ease        -->
      <!--                       debugging?  [true]                             -->
      <!--                                                                      -->
      <!--   modificationTestInterval                                           -->
      <!--                       Causes a JSP (and its dependent files) to not  -->
      <!--                       be checked for modification during the         -->
      <!--                       specified time interval (in seconds) from the  -->
      <!--                       last time the JSP was checked for              -->
      <!--                       modification. A value of 0 will cause the JSP  -->
      <!--                       to be checked on every access.                 -->
      <!--                       Used in development mode only. [4]             -->
      <!--                                                                      -->
      <!--   recompileOnFail     If a JSP compilation fails should the          -->
      <!--                       modificationTestInterval be ignored and the    -->
      <!--                       next access trigger a re-compilation attempt?  -->
      <!--                       Used in development mode only and is disabled  -->
      <!--                       by default as compilation may be expensive and -->
      <!--                       could lead to excessive resource usage.        -->
      <!--                       [false]                                        -->
      <!--                                                                      -->
      <!--   scratchdir          What scratch directory should we use when      -->
      <!--                       compiling JSP pages?  [default work directory  -->
      <!--                       for the current web application]               -->
      <!--                                                                      -->
      <!--   suppressSmap        Should the generation of SMAP info for JSR45   -->
      <!--                       debugging be suppressed?  [false]              -->
      <!--                                                                      -->
      <!--   trimSpaces          Should white spaces in template text between   -->
      <!--                       actions or directives be trimmed?  [false]     -->
      <!--                                                                      -->
      <!--   xpoweredBy          Determines whether X-Powered-By response       -->
      <!--                       header is added by generated servlet  [false]  -->
      <!--                                                                      -->
      <!-- If you wish to use Jikes to compile JSP pages:                       -->
      <!--   Please see the "Using Jikes" section of the Jasper-HowTo           -->
      <!--   page in the Tomcat documentation.                                  -->
    
        <servlet>
            <servlet-name>jsp</servlet-name>
            <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
            <init-param>
                <param-name>fork</param-name>
                <param-value>false</param-value>
            </init-param>
            <init-param>
                <param-name>xpoweredBy</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>3</load-on-startup>
        </servlet>

      具体的参数,上面都有解释,这里就不多赘述了。

      都是些调节JSP编译的参数,比如多长时间检测一次,debug的调试信息相关配置,编译信息等等。

    如何利用Japser.Jspc自定义预编译JSP

      1 jasper相关jar包

      在tomcat6中提供了几个jasper的jar包,相对于之前版本,去掉了jasper-compiler.jar以及jasper-runtime.jar,合并为jasper.jar

      另外如果开发者自己想要编译JSP,还需要使用ant以及tomcat-juli.jar。

      2 ant相关jar包

      其中ant相关的jar包可以去官网下载ant.zip,然后解压提取其中lib内的jar包。

      3 tomcat-juli相关jar包

      tomcat-juli.jar位于CATALINA_HOME/bin/目录下。

      在Eclipse的构建路径下添加上述相关的jar包即可,然后创建测试类:

      添加JAR包步骤:右键工程-->Properties-->Java Build Path-->Libraries-->Add External JARs-->选择添加的JAR包-->OK

    package com.test;
    import org.apache.jasper.JspC;
    
    public class testCompiler{
        public String jspcTest(){  
            String error="";  
            try {  
                JspC jspc = new JspC();  
                //第一种方式
                String[] arg0 = {"-uriroot", "F:/apache-tomcat-6.0.43/webapps/ROOT", "-d", "F:/test", 
                        "index.jsp" }; 
                jspc.setArgs(arg0); 
                
                //第二种方式
                /*jspc.setUriroot("F:/apache-tomcat-6.0.43/webapps/ROOT");//web应用的root目录  
                jspc.setOutputDir("F:/test");//.java文件和.class文件的输出目录  
                jspc.setJspFiles("index.jsp");//要编译的jsp  */
                
                jspc.setCompile(true);//是否编译 false或不指定的话只生成.java文件  
                jspc.execute(); 
            }catch(Exception e){
                error=e.toString();
            }
            return error;  
        }
        public static void main(String args[]){  
            testCompiler t=new testCompiler();  
            System.out.println(t.jspcTest());  
        }  
    }  

      可以使用两种方式进行自定义的JSP编译。

      测试后,可以在 F:/test 目录下发现编译出的index.jsp的java文件以及class文件。

    参考

    【1】Jasper2 JSP引擎:http://tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html

    【2】解读JSP解析过程:http://www.cnblogs.com/zollty/p/3309310.html

    【3】使用Jspc编译JSP文件:http://kjah.iteye.com/blog/625588

  • 相关阅读:
    Docker 部署zookeeper3.4
    Redis 3.2 生产环境集群部署
    Prometheus入门到放弃(7)之redis_exporter部署
    Docker部署ELK 7.0.1集群之Kibana安装介绍
    Docker部署ELK 7.0.1集群之Logstash安装介绍
    Docker部署ELK 7.0.1集群之Elasticsearch安装介绍
    Node web 框架
    写一个简单的选择器( 方便小项目使用 )
    Node web 框架
    Node进阶
  • 原文地址:https://www.cnblogs.com/xing901022/p/4592159.html
Copyright © 2020-2023  润新知