如何手工编译Servlet和JSP文件教程步骤



如何手工编译Servlet和JSP文件教程步骤,集成开发环境的使用(eclipse)在给开发人员的开发工作带来很多便利,但是也向用户屏蔽了很多具体的编译操作流程和细节,我们在感受开发工具带来的“智能”的时候,也常有“傻瓜式”感受。这篇文章试图“追本溯源”手动编译Servlet和JSP文件,讨论手工编译Servlet和JSP页面的方法以及步骤,但愿可以加深大家对相关技术的理解。

(1)手工编译Servlet和JSP文件说明

在本例使用的操作系统为CentOS 5.4,使用的Tomcat Servlet/JSP容器的为5.5.28,JDK的版本是OpenJDK 1.6.0。为便于测试,假设存在如下目录,以下是目录说明:

  • /codolio:存放用于编译的Servlet源文件以及JSP页面;
  • /codolio/dist:存放生成的目标文件,如Servlet class文件、由JSP转换来的Servlet源文件等;
  • /codolio/libs:存放编译过程中依赖的jar和class文件。

(2)手动编译Servlet

Servlet的本质就是一个普通的Java类,一般来讲,该类继承了javax.servlet.http.HttpServlet类。因此,编译Servlet遵从编译一般java类的规则,具体的操作步骤如下:

  • 编写Servlet源码文件

假设已编写名为ServletTest.java的Servlet,其包为test.servlet。并把其放置在/codolio/下,该Servlet的路径为/codolio/test/servlet/ServletTest.java。该Servlet的源文件代码如下:

 

  1. package test.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.RequestDispatcher;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. /**
  10.  * Servlet implementation class ServletTest
  11.  */
  12. public class ServletTest extends HttpServlet {
  13.     private static final long serialVersionUID = 1L;
  14.     /**
  15.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  16.      */
  17.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18.                 this.doPost(request, response);
  19.     }
  20.     /**
  21.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  22.      */
  23.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24.             response.setContentType(“text/html; charset=utf8″);
  25.             request.setAttribute(“message”, ”This is the message from servlet ServletTest”);
  26.             ServletContext sc = this.getServletContext();
  27.             RequestDispatcher dispatcher = sc.getRequestDispatcher(“/index.jsp”);
  28.             dispatcher.forward(request, response);
  29.     }
  30. }

手工编译Servlet

当前工作目录为/codolio,使用以下命令行进行编译该Servlet:javac -d dist -cp libs/servlet-api.jar test/servlet/ServletTest.java。该命令的具体解释如下:

(1)-d <dir>:javac的选项,用于指定生成的类文件的位置;

(2)-cp <路径>或者-classpath <路径>:javac的选项,用于指定查找用户类文件和注释处理程序的位置。在编译Servlet的时候,应该清楚Servlet依赖于$CATALINA_HOME/common/lib/servlet-api.jar包。为了编译方便,将该JAR包复制到/codolio/libs目录下。另外,还可以在CLASSPATH环境变量中添加该包的搜索路径来指定该JAR包,使用如下命令行:export CLASSPATH=$CLASSPATH:/codolio/libs/servlet-api.jar。

在编译完成后,在/codolio/dist/test/servlet目录下生成ServletTest.class文件,该文件即为编译完成后的Servlet。


(3)手工编译JSP

Tomcat默认使用JspServlet来完成JSP页面的转换、编译和执行工作。在处理JSP页面时,一般分作两步来处理:(1)将JSP页面转换成相应的Servlet(2)编译转换后的Servlet源文件为class文件。在$CATALINA_HOME/conf/web.xml部署描述符中存在如下配置:

 

  1. <servlet>
  2.   <servlet-name>jsp</servlet-name>
  3.   <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  4.   <init-param>
  5.     <param-name>fork</param-name>
  6.     <param-value>false</param-value>
  7.   </init-param>
  8.   <init-param>
  9.     <param-name>xpoweredBy</param-name>
  10.     <param-value>false</param-value>
  11.   </init-param>
  12.   <load-on-startup>3</load-on-startup>
  13. </servlet>
  14. <servlet-mapping>
  15.   <servlet-name>jsp</servlet-name>
  16.   <url-pattern>*.jsp</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19.   <servlet-name>jsp</servlet-name>
  20.   <url-pattern>*.jspx</url-pattern>
  21. </servlet-mapping>

Tomcat中,提供了一个名为JspC的类,位于$CATALINA_HOME/common/lib/jasper-compiler.jar包中,JspC是一个命令行JSP编译工具。虽然JSP页面经常位于一个容器运行环境中,但是有些时候由一个JSP页面来创建一个单纯的Servlet也很有用。JspC将由JSP页面向Servlet转换的核心过程封装在一个程序中,该程序不依赖于servlet引擎,并且允许你将JSP页面转换为一个等价的Java Servlet。

JspC类依赖于多个JAR包,在Tomcat 5.5.28目录结构中,其名称和位置列表如下:

  • commons-el.jar:位于$CATALINA_HOME/common/lib/下;
  • jasper-compiler.jar 位于$CATALINA_HOME/common/lib/下;
  • jasper-compiler-jdt.jar 位于$CATALINA_HOME/common/lib/下;
  • jasper-runtime.jar 位于$CATALINA_HOME/common/lib下;
  • jsp-api.jar 位于$CATALINA_HOME/common/lib下;
  • servlet-api.jar 位于$CATALINA_HOME/common/lib下;
  • ant.jar 该包可能需要另外下载,可以到Apache的官方网站或者别的链接上去下载。

在使用JspC进行JSP页面的转换、编译过程中,需要保证上述JAR包在CLASSPATH的搜索路径中。为了方便起见,将上述JAR包复制到/codolio/libs目录下。可以使用export命令或者使用java -cp参数来指定类的搜索路径,方法同上。

假设当前工作目录为/codolio,在该目录下存在一个名为test.jsp的JSP测试页面。在命令行中使用如下命令:java -cp libs/ant.jar:libs/commons-el.jar:libs/jasper-compiler.jar:libs/jasper-compiler-jdt.jar:libs/jasper-runtime.jar:libs/jsp-api.jar:libs/servlet-api.jar org.apache.jasper.JspC -compile -v -d dist -uriroot ./ -webxml dist/web.xml test.jsp。该命令的具体解释如下:

(1)-cp:指定类的搜索目录;

(2)-p <name>:目标package的名称;
(3)-c <name>:目标class的名称;
(4)-uriroot <dir>:将要被处理的页面的根目录,默认为包含JspC的目录;
(5)-webxml <file>:可以自动生成一个相关的web.xml;
(6)-v:输出详细信息;
(7)-compile:编译生成的Servlet;
(8)-classpath:覆盖java.class.path系统属性;
(9)-source <version>:设置编译器的-source参数,默认为1.4;

(10)-target <version>:设置编译器的-target参数,默认为1.4。

命令执行结束以后,在/codolio/dist目录下会生成由JSP页面转换而来的Servlet源文件和由Servlet编译而来的class文件,并在/codolio/dist目录下生成相应的web.xml部署描述符。

现在,手工编译Servlet和JSP的工作基本完成了。