日期:2014-05-16  浏览次数:20316 次

jetty实战2-jsp

1.概述

jetty会将jsp文件编译成servlet然后提供服务,主要原理是在webdefault.xml中,有一个关于jsp的配置

<servlet id="jsp">
 <servlet-name>jsp</servlet-name>
 <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

?
因此所有的jsp的请求都会由这个servlet来处理

?

?

jetty对于jsp的支持以及依赖的jar包

?

?

?

jetty用的的jsp-2.1-glassfish的核心类图如下:

?

?

?

2.编译

2.1 编译过程

?

编译的逻辑是(jsp2.1.6.jar),在每次请求JspServlet的service方法中,主要调用

?

serviceJspFile(request, response, jspUri, null, precompile);

?
然后调用

wrapper = (JspServletWrapper) rctxt.getWrapper(jspUri);

?
根据jsp的请求路径取得对应的JspServletWrapper(wrapper中就会有jspfile的路径)。然后将请求委托到JspServletWrapper,这个类的逻辑如下:

?

(1) Compile,调用Compiler的compile方法,然后调用ecj.jar或者jdk的javacompiler来编译并生成对应的class。(编译的过程主要是generateJava() ;generateclass();两个步骤)
(2) (Re)load servlet class file,并赋值给theServlet成员变量
(3) Service request ,调用servlet的服务

?

2.2 配置

?所有的初始化参数都在jspSevlet的init方法中被读取然后存入Options options;成员变量,在初始化JspServletWrapper的时候传入并被使用

?

development参数,默认是true,如果不设置,每次访问都会重新编译jsp文件,引起性能问题。

?

   <init-param>
      <param-name>development</param-name>
      <param-value>false</param-value>
    </init-param>

?

?

如果设置了上面的参数,但是需要在修改jsp文件后能够动态生效,需要在webdefault.xml中添加如下配置:

???

 <init-param>
      <param-name>checkInterval</param-name> (默认是0,也就是不扫描)
      <param-value>5</param-value>
    </init-param>

?

3. compiler的选择

都是使用javaComplier,从初始化逻辑可以看到,先尝试使用JDK的complier,不行就使用ecj的compiler。

    private void initJavaCompiler() {
        Class c = getClassFor("javax.tools.ToolProvider");
        if (c != null) {
            // JDK1.6
            c = getClassFor("org.apache.jasper.compiler.Jsr199JavaCompiler");
            if (c != null) {
                try {
                    javaCompiler = (JavaCompiler) c.newInstance();
                } catch (Exception ex) {
                }
            }
        }
        if (javaCompiler == null) {
            c = getClassFor("org.eclipse.jdt.internal.compiler.Compiler");
            if (c != null) {
                c = getClassFor("org.apache.jasper.compiler.JDTJavaCompiler");
                if (c != null) {
                    try {
                        javaCompiler = (JavaCompiler) c.newInstance();
                    } catch (Exception ex) {
                    }
                }
            }
        }
        if (javaCompiler == null) {
            javaCompiler = new AntJavaCompiler();
        }

        javaCompiler.init(ctxt, errDispatcher, jspcMode);
    }

??

4.参考文档

1. http://wiki.eclipse.org/Jetty/Howto/Configure_JSP

?