아파치 톰캣 서블릿/JSP 컨테이너

아파치 톰캣 7

Version 7.0.28-dev, Oct 2 2013
Apache Logo

Links

User Guide

참고

아파치 톰캣 개발

Jasper 2 JSP Engine How To

컨텐츠 목록
소개

톰캣 7.0은 Jasper 2 JSP 엔진을 JavaServer Pages 2.2 명세서를 구현하기 위해 사용합니다.

Jasper 2는 기존 Jasper의 성능을 향상시키기 위해 다시 디자인 되었습니다. 일반적인 코드 향상 이외에도 다음과 같은 변경이 있었습니다:

  • JSP 커스텀 태크 풀링 - JSP 커스텀 태크를 위해 사용된 자바 오브젝트가 이제 사용될 수 있습니다. 이는 커스텀 태크를 사용하는 JSP 페이지의 성능을 월등히 향상시킵니다.
  • 백그라운드 JSP 컴파일레이션 - 만약 여러분이 이미 컴파일된 JSP 페이지를 변경하면 Jasper 2는 그 페이지를 백그라운드로 재컴파일 할 수 있습니다. 기존에 컴파일된 JSP 페이지는 여전히 서버 요구에 따라 이용 가능합니다. 새로운 페이지가 성공적으로 컴파일되면 이는 예전 페이지를 대체하게 됩니다. 이는 여러분의 JSP 페이지가 생산 서버에 반영되기 쉽게 도와줍니다.
  • 포함된 페이지가 변경될 때 JSP 재컴파일 하기 - Jasper 2는 컴파일 타임에 JSP가 변경된 것을 감지할 수 있으며 부모 JSP를 재컴파일 합니다.
  • JDT는 JSP 파일을 컴파일 하는데 사용됩니다 - 이클립스 JDT 자바 컴파일러는 이제 JSP 소스 컴파일을 수행하는데 사용됩니다. 이 컴파일러는 소스 의존도를 컨테이너 클래스로더로 부터 로드합니다. Ant와 javac은 여전히 사용 가능합니다.

Jasper는 서블렛 클래스를 사용하여 구현됩니다 org.apache.jasper.servlet.JspServlet.

설정

기본적으로 Jasper는 웹 애플리케이션 개발을 위해 설정됩니다. 생산 톰캣 서버를 사용하기 위한 Jasper 설정은 다음에서 정보를 얻으실 수 있습니다 생산 설정

Jasper를 구현하는 서블렛은 여러분의 글로벌 $CATALINA_BASE/conf/web.xml에 있는 초기 파라미터를 사용하여 설정됩니다.

  • checkInterval - 만약 development가 false 이고 checkInterval이 0보다 크면 백그라운드 컴파일이 활성화 됩니다. checkInterval은 JSP 페이지(그리고 그것에 의존해 있는 파일들)가 재컴파일을 해야 하는지 check 하는 초단위 시간을 뜻합니다. 기본적으로는 0 초 입니다.
  • classdebuginfo - 클래스 파일이 디버깅 정보와 함께 컴파일 되어야 하는가? true or false, 기본적으로는 true 입니다.
  • classpath - 생성된 서블렛을 컴파일하는데 사용되는 클래스 경로를 뜻합니다. 이 파라미터는 오직 ServletContext attribute org.apache.jasper.Constants.SERVLET_CLASSPATH이 세팅되어 있지 않을 때만 효력이 있습니다. 이 속성은 Jasper가 톰캣 안에서 사용될때는 언제나 세팅되어 집니다. 기본적으로 classpath는 현재 웹 애플리케이션에 따라 다이나믹하게 생성됩니다.
  • compiler - Ant가 어떤 컴파일러는 JSP 페이지를 컴파일 하기 위해 사용해야 하는가를 결정합니다. 더 많은 정보를 위해서는 Ant 문서를 참고하세요. 만약 값이 세팅되어 있지 않으면 기본적으로 Eclipse JDT Java 컴파일러가 Ant 대신에 사용됩니다. 기본적은 값은 없습니다.
  • compilerSourceVM - 어떤 JDK 버젼이 소스 파일과 호환이 되는가? (기본 값: 1.6)
  • compilerTargetVM - 어떤 JDK 버젼이 생성된 파일과 호환이 되는가? (기본 값: 1.6)
  • development - Jasper가 개발 모드에서 사용되는가? 만약 true이면 어떤 JSP가 수정을 위해 체크되었는지를 확인하는 빈도가 modificationTestInterval 에서 명시될 것 입니다. true 또는 false, 기본값은 true 입니다.
  • displaySourceFragment - 소스 조각이 예외 메시지에 포함되어야 하는가? true or false, 기본값은 true 입니다.
  • dumpSmap - JSR45 디버깅을 위한 SMAP 정보가 파일에 덤프되어야 하는가? true or false, 기본값은 false 입니다. 만약 suppressSmap가 true 이면 false 입니다.
  • enablePooling - 태그 핸들러 풀링이 활성화 되었는지를 결정합니다. 이는 컴파일 옵션이며 이미 컴파일된 JSP의 행동을 바꾸지 않습니다. true or false, 기본값은 true 입니다.
  • engineOptionsClass - Jasper를 설정하는 클래스의 옵션을 명시합니다. 만약 없다면 기본 EmbeddedServletOptions가 사용됩니다.
  • errorOnUseBeanInvalidClassAttribute - useBean 액션의 클래스 속성이 유효한 클래스가 아닐때 에러를 이슈해야 하는가? true 또는 false, 기본값은 true 입니다.
  • fork - Ant fork JSP 페이지가 톰캣으로부터 개별적인 JVM에서 실행되는가? true 또는 false, 기본값은 true 입니다.
  • genStringAsCharArray - 몇몇 경우에 텍스트 스트링이 char 배열로 생성되어야 하는가? 기본값은 false 입니다.
  • ieClassId - <jsp:plugin> 태그들을 쓸 때 인터넷 익스플로어로 보내지는 class-id 값. 기본값은 clsid:8AD9C840-044E-11D1-B3E9-00805F499D93 입니다.
  • javaEncoding - 자바 소스 파일을 생성할 때 사용되는 자바 파일 인코딩. 기본값은 UTF8 입니다.
  • keepgenerated - 각 페이지에 대해 생성되는 자바 소스 코드를 지니고 있어야 하는가 아니면 지워야 하는가? , 기본값은 true 입니다.
  • mappedfile - 디버깅이 쉽게 하기 위해서 각 인풋 라인마다 정적인 컨탠츠와 함께 statement를 출력해야 하는가? true or false, 기본값은 true 입니다.
  • maxLoadedJsps - 웹 애플리케이션을 위해 로드되는 JSP의 최대 갯수. 만약 이보다 많은 JSP가 로드되면 이 한계점을 지키기 위해서 가장 오래전에 사용된 JSP가 언로드 됩니다. 0 또는 그보다 작은 값은 한계점이 없다는 것을 뜻합니다.기본값은 -1 입니다.
  • jspIdleTimeout - JSP가 언로드 되기 전에 비활성화 되는 초단위 시간. 0 또는 그보다 작은 값은 언로드 되지 않음을 뜻합니다. 기본값은 -1 입니다.
  • modificationTestInterval - JSP가 수정되었는지 체크를 한 마지막 시간으로부터 특정 시간 간격동안 (초단위) JSP (그리고 그에 의존한 파일들)가 수정되었는지 체크하지 않도록 합니다. 0 값을 쓰면 매번 접근 시 마다 JSP가 체크됩니다. 개발 모드에서만 사용 가능합니다. 기본값은 4 초 입니다.
  • recompileOnFail - 만약 JSP 컴파일이 실패한다면 modificationTestInterva가 무시되고 다음 접근이 재컴파일을 시도하는가? 개발 모드에서만 사용되며 기본적으로는 비활성화 되어 있습니다. 이는 과도한 리소스 사용을 막기 위함 입니다.
  • scratchdir - JSP 페이지를 컴파일 할 때 어떤 스크래치 디렉토리를 사용해야 하는가? 기본 값은 현재 웹애플리케이션 작업 디렉토리 입니다.
  • suppressSmap - JSR45를 위해 SMAP 정보를 생성하는 것이 억압되어 있는가? Should the generation of SMAP info for JSR45 true 또는 false, 기본값은 false 입니다.
  • trimSpaces - 액션간에 탬플레이트 텍스트를 빈공간으로 해야 하는가 아니면 명령이 다듬어 져야 하는가?, 기본값은 false 입니다.
  • 재해석 필요!!!
  • xpoweredBy - X-Powered-By 응답 해더가 생성된 서블렛에 의해 추가되어야 하는가를 결정합니다. true or false, 기본값은 false 입니다.

Eclipse JDT에 포함된 자바 컴파일러가 기본 컴파일러로 사용됩니다. 이는 톰캣 클래스 로더로 부터 모든 디펜던시를 로드하는 향상된 컴파일러 이며, 수십개의 JAR를 사용하여 대용량의 설치를 컴파일할 때 많은 도움을 줍니다. 빠른 서버에서 이는 많은 JSP 페이지에서도 서브-세컨드 재컴파일 사이클을 허용합니다.

예전 톰캣 릴리즈에서도 사용된 아파치 안트가 새로운 컴파일로에서도 대신 사용될 수 있습니다. 이는 단순히 lib/ecj-*.jar 파일을 삭제하고,최신 안트 배포판의 lib 안에 있는 ant.jarant-launcher.jar 파일로 대체하면 됩니다.

알려진 이슈들

bug 39089 에서도 기술되어 있듯이, 알려진 JVM 이슈는 bug 6294277, java.lang.InternalError: name is too long to represent 예외를 많은양의 JSP를 컴파일 할 때 발생시킬 수 있습니다. 만약 이러한 상황이 발생할 시에는 이들 중 하나를 사용하면 해결할 수 있습니다:

  • JSP 사이즈를 줄입니다JSP
  • SMAP 생성을 비활성화 하고 JSR-045 suppressSmaptrue로 변경합니다.

Production Configuration

주요 JSP 최적화 방법은 JSP를 미리 컴파일 하는 것입니다. 그러나 이 방법은 Jasper 서블렛 설정이 중요할 때는 가능하지 않거나 실용적이지 않습니다 (예를 들어 jsp-property-group feature를 사용할 때).

When using Jasper 2 in a production Tomcat server you should consider making the following changes from the default configuration.

  • development - To disable on access checks for JSP pages compilation set this to false.
  • genStringAsCharArray - To generate slightly more efficient char arrays, set this to true.
  • modificationTestInterval - If development has to be set to true for any reason (such as dynamic generation of JSPs), setting this to a high value will improve performance a lot.
  • trimSpaces - To remove useless bytes from the response, set this to true.

Web Application Compilation

Using Ant is the preferred way to compile web applications using JSPC. Note that when pre-compiling JSPs, SMAP information will only be included in the final classes if suppressSmap is false and compile is true. Use the script given below (a similar script is included in the "deployer" download) to precompile a 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}"
             webXmlFragment="${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"
           optimize="off"
           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>

The following command line can be used to run the script (replacing the tokens with the Tomcat base path and the path to the webapp which should be precompiled):

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

Then, the declarations and mappings for the servlets which were generated during the precompilation must be added to the web application deployment descriptor. Insert the ${webapp.path}/WEB-INF/generated_web.xml at the right place inside the ${webapp.path}/WEB-INF/web.xml file. Restart the web application (using the manager) and test it to verify it is running fine with precompiled servlets. An appropriate token placed in the web application deployment descriptor may also be used to automatically insert the generated servlet declarations and mappings using Ant filtering capabilities. This is actually how all the webapps distributed with Tomcat are automatically compiled as part of the build process.

At the jasper2 task you can use the option addWebXmlMappings for automatic merge the ${webapp.path}/WEB-INF/generated_web.xml with the current web application deployment descriptor at ${webapp.path}/WEB-INF/web.xml. When you want to use Java 6 features inside your jsp's, add the following javac compiler task attributes: source="1.6" target="1.6". For live applications you can also compile with optimize="on" and without debug info debug="off".

When you don't want to stop the jsp generation at first jsp syntax error, use failOnError="false"and with showSuccess="true" all successfull jsp to java generation are printed out. Sometimes it is very helpfull, when you cleanup the generate java source files at ${webapp.path}/WEB-INF/src and the compile jsp servlet classes at ${webapp.path}/WEB-INF/classes/org/apache/jsp.

Hints:

  • When you switch to another Tomcat release, then regenerate and recompile your jsp's with the new Tomcat version.
  • Use java system property at server runtime to disable PageContext pooling org.apache.jasper.runtime.JspFactoryImpl.USE_POOL=false. and limit the buffering with org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true. Note that changing from the defaults may affect performance, but it will vary depending on the application.


Copyright © 1999-2013, Apache Software Foundation