`

手工编译Servlet和JSP

阅读更多

集成开发环境的使用在给开发人员的开发工作带来极大便利的同时,也带来了一些“朦胧感”——它向用户屏蔽了一些具体的操作流程和细节,开发人员在感受开发工具带来的“智能”的同时也常常会有一种“傻瓜式”的感觉。本文试图“追本溯源”,讨论手工编译Servlet和JSP页面的方法与步骤,希望能够加深大家对相关技术的理解。

(1)说明

在本例中,使用的操作系统为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的源文件如下:

 

package test.servlet;   
import java.io.IOException;   
import javax.servlet.RequestDispatcher;   
import javax.servlet.ServletContext;   
import javax.servlet.ServletException;   
import javax.servlet.http.HttpServlet;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
/**  
 * Servlet implementation class ServletTest  
 */  
public class ServletTest extends HttpServlet {   
    private static final long serialVersionUID = 1L;   
    /**  
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  
     */  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
                this.doPost(request, response);   
    }   
    /**  
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)  
     */  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
            response.setContentType("text/html; charset=utf8");    
            request.setAttribute("message", "This is the message from servlet ServletTest");   
               
            ServletContext sc = this.getServletContext();   
            RequestDispatcher dispatcher = sc.getRequestDispatcher("/index.jsp");   
               
            dispatcher.forward(request, response);   
    }   
}  

 编译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部署描述符中存在如下配置:

<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>  
...   
<servlet-mapping>  
  <servlet-name>jsp</servlet-name>  
  <url-pattern>*.jsp</url-pattern>  
</servlet-mapping>  
<servlet-mapping>  
  <servlet-name>jsp</servlet-name>  
  <url-pattern>*.jspx</url-pattern>  
</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的工作基本完成。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/codolio/archive/2010/01/11/5177236.aspx

分享到:
评论

相关推荐

    手工编译jsp

    但是,手工编译JSP可以提前完成这个步骤,提高应用程序的启动速度和运行效率。 1. **JSP预编译原理** - JSP预编译过程实际上是将JSP转换为对应的Servlet源代码,然后编译成字节码。这使得应用在首次请求时无需等待...

    JSP所需的jar包

    6. **jasper-compiler.jar**和**jasper-runtime.jar**:Apache Tomcat服务器的Jasper引擎用于编译JSP页面到Java servlet。这两个jar包包含了编译和执行JSP的必要组件。 7. **javassist.jar**:在某些情况下,如...

    编译tomcat源码所需jar包

    6. **其他依赖库**:Tomcat源码中还包括了其他一些必要的库,如`servlet-api.jar`、`jsp-api.jar`等,这些都是Java Web应用的标准API,用于提供Servlet和JSP的支持。 编译步骤大致如下: 1. **获取源码**:从...

    李兴华视频教程笔记 Java JSP 技术

    它主要用来部署和运行Java Web应用,特别是那些基于Java Servlet和JavaServer Pages (JSP)技术的应用程序。 - **特性**:作为一款轻量级的应用服务器,Tomcat因其简单易用、配置灵活以及开源免费的特点而广受欢迎。...

    Jsp开发的基本的网上书店

    对于初学者,这个项目是一个很好的实践平台,可以了解JSP和SQL Server的基本使用,以及Java Web开发的基本流程。而对于有一定经验的开发者,这个项目可以作为不依赖框架的简单应用实例,理解如何手工管理请求响应和...

    基于JSP技术的教师办公系统的设计与实现.pdf

    JSP和Servlet都支持HTTP请求/响应模型,并且采用多线程的方式来处理来自客户端浏览器的请求。对于客户端的Servlet请求,直接由Servlet引擎处理。JSP能够将静态HTML与动态内容分离,这使得开发者在处理静态内容时无需...

    JSP源码基于JSP技术的猎头公司管理软件的设计和实现-内部事务部分(源代码+论文)

    当用户请求一个JSP页面时,Web服务器会将该页面转换成一个Servlet,并编译执行。这个过程包括三个主要步骤: - **翻译阶段**:将JSP文件翻译成Java源代码。 - **编译阶段**:将Java源代码编译成字节码。 - **执行...

    JavaWeb开发(jsp)课程设计借鉴.pdf

    在系统实现中,Tomcat作为Java Web应用服务器,是Apache软件基金会Jakarta项目的一部分,被广泛用于部署JSP和Servlet应用。Tomcat以其开源、兼容性好、性能稳定等优点,成为许多开发者的首选服务器。 整个报价管理...

    手工完成java项目(二)——web项目

    首先,一个Java Web项目通常包含以下组件:Servlet、JSP(JavaServer Pages)、DAO(Data Access Object)、Model、Controller以及视图层。在这个项目中,"testweb"很可能就是我们的项目根目录,它将包含这些组件的...

    基于JSP的图书管理系统的课程设计报告

    随着图书数量的增加和读者需求的变化,传统的手工管理模式已经无法满足图书馆的日常管理需求。基于此背景,本项目提出了一种基于JSP技术的图书管理系统设计方案。 **重要性分析**: - **提高效率**:自动化图书...

    JSP设计的学生管理系统

    - **教育信息化的需求**: 随着教育规模的不断扩大和学生数量的增多,传统的手工管理方式已经无法满足高效、准确地处理大量学生信息的需求。因此,开发一个高效的学生管理系统显得尤为重要。 - **提高管理效率**: ...

    Java框架面试题Java框架面试题.doc

    JSP 标签的作用是分离 JSP 页面的内容和逻辑,业务逻辑开发者可以创建自定义标签,封装业务逻辑,并且易于手工修改和工具维护。JSP 标签的定义需要写标签处理器、写 tld 文件,然后将标签处理器和 tld 文件放到同一...

    JSP源码JSP自动排课管理系统(源代码+论文+开题报告)

    - JSP 页面最终会被编译成 Servlet,并由服务器执行。 2. **Java**: - Java 是一种广泛使用的面向对象编程语言,具有良好的跨平台特性。 - 在本系统中,Java 主要用于处理后台逻辑,如数据库操作、算法实现等。...

    高校人事档案管理系统的设计与实现 文献综述.docx

    JSP是一种由SUN公司发起的动态网页技术,它基于JAVA SERVLET和整个JAVA体系,用于构建安全、跨平台的动态网站。相较于Microsoft的ASP,JSP拥有诸多优势。例如,它实现了动态内容和静态内容的分离,使得网页设计更为...

    3-张壮壮-201730910524-开题报告-基于JSP的学生公寓管理系统设计与实现1

    - 编码实现:利用JSP和相关Java技术编写代码。 - 测试优化:进行单元测试、集成测试,确保系统稳定性和性能。 通过这个基于JSP的学生公寓管理系统,预期能提高学校宿舍管理的效率,减少人为错误,同时提升学生和...

    高校人事档案管理系统的设计与实现 文献综述.pdf

    JavaBean作为一种可重用的组件,用于封装业务逻辑和数据,提供给JSP和Servlet调用,增强系统的可维护性和可扩展性。 Servlet是Java平台上的Web应用程序接口,具备以下特点: 1. 与平台无关:Servlet可以在任何支持...

    基于JSP的图书管理系统设计与实现毕业论文(35页).doc

    - 分离业务逻辑与表示逻辑:通过JSP和JavaBean的结合,实现逻辑和显示的分离。 ##### Struts框架 Struts是一个基于MVC架构的开源框架,主要用于构建企业级Java Web应用程序。 - **优势**: - 易于集成:与其他...

    JSP源码jsp高校智能排课系统设计(源代码+论文)

    - **JSP**:JSP 是 Java Server Pages 的缩写,是一种基于 Java Servlet 以及整个 Java 体系的 Web 开发技术。它简化了动态网页的开发过程,适合用于快速构建企业级应用。 - **Java**:作为服务器端的主要编程语言,...

    tomcat服务器的配置及其使用

    Tomcat是一个广泛使用的开源Web服务器,它是Apache软件基金会Jakarta项目的一部分,专为运行Java Servlet和JSP(JavaServer Pages)而设计。本篇文章将深入探讨Tomcat的配置与使用,帮助你更好地理解和操作这个强大...

Global site tag (gtag.js) - Google Analytics