`

JSP与Servlet的关系和实例分析(转帖)

阅读更多

            JSP是Servlet的扩展,在没有JSP之前,就已经出现了Servlet技术。Servlet是利用输出流动态生成HTML页面,包括每一个HTML标签和每个在HTML页面中出现的内容。
           由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在Java代码中,这的确让人不胜其烦。JSP的出现弥补了这种不足,JSP通过在标准的HTML页面中插入Java代码,其静态的部分无须Java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用Java脚本控制。
           从表面上看,JSP页面已经不再需要Java类,似乎完全脱离了Java面向对象的特征。事实上,JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例——JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。JSP其实也是Servlet的一种简化,使用JSP时,其实还是使用Servlet,因为Web应用中的每个JSP页面都会由Servlet容器生成对应的Servlet。对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
    看下面一个简单的JSP页面:
<!--  表明此为一个JSP页面 -->
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>第一个JSP页面</TITLE>
</HEAD>
<BODY>
<!--  下面是Java脚本-->
<%for(int i = 0 ; i < 10; i++)
{
out.println(i);
%>
<br>
<%}%>
</BODY>
</HTML>
    当启动Tomcat之后,可以在Tomcat的Catalina\localhost\jsptest\org\apache\jsp目录下找到如下文件(假如Web应用名为jsptest,上面JSP页的名为test1.jsp):test1_jsp.java和test1_jsp.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。
    下面是test1_jsp.java文件的源代码,这是一个特殊的Java类,是一个Servlet类:
    //JSP页面经过Tomcat编译后默认的包
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承HttpJspBase类,该类其实是个Servlet的子类
public final class test1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
{
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
//用于响应用户的方法
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, ServletException
{
//获得页面输出流
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
//获得页面输出流
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
 PageContext _jspx_page_context = null;
 //开始生成响应

             try

             {

                 _jspxFactory = JspFactory.getDefaultFactory();

                //设置输出的页面格式

            response.setContentType("text/html; charset=gb2312");

            pageContext = _jspxFactory.getPageContext(this, request,

            response, null, true, 8192, true);

            _jspx_page_context = pageContext;

            application = pageContext.getServletContext();

            config = pageContext.getServletConfig();

            session = pageContext.getSession();

            //页面输出流

out = pageContext.getOut();

            _jspx_out = out;

            //输出流,开始输出页面文档

            out.write("\r\n");

            //下面输出HTML标签

            out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0

            Transitional//EN\">\r\n");

            out.write("<HTML>\r\n");

            out.write("<HEAD>\r\n");

            out.write("<TITLE>first Jsp</TITLE>\r\n");

            out.write("</HEAD>\r\n");

            out.write("<BODY>\r\n");

            //页面中的循环,在此处循环输出

            for(int i = 0 ; i < 10; i++)

            {

             out.println(i);

             out.write("\r\n");

             out.write("<br>\r\n");

            }

            out.write("\r\n");

            out.write("</BODY>\r\n");

            out.write("</HTML>\r\n");

            out.write("\r\n");

           }

           catch (Throwable t)

           {

            if (!(t instanceof SkipPageException))

            {

               out = _jspx_out;

               if (out != null && out.getBufferSize() != 0)

                 out.clearBuffer();

               if (_jspx_page_context != null) _jspx_page_context.handle

               PageException(t);

            }

          }

           finally

         {

           if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_

           page_context);

        }

      }

    }

    即使读者不了解上面提供的Java代码,也依然不会影响JSP页面的编写,因为这都是由Web容器负责生成的。图2.1显示了test1.jsp的执行效果。

    根据图2.1的执行效果,再次对比test1.jsp和test1_jsp.java文件,可得到一个结论:该JSP页面中的每个字符都由test1_jsp.java文件的输出流生成。

    根据上面的JSP页面工作原理图,可以得到如下四个结论:

    —  JSP文件必须在JSP服务器内运行。

    —  JSP文件必须生成Servlet才能执行。

    — 每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。

    —  JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。

 

    JSP和Servlet会有如下转换:

    - JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。

    - JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。

    - JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。

    - 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。
*******************************************java生成静态页面**********************************************************
1   toHtml.java(不用修改,直接用)
   
    package com.jetsum.mystatic;

    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;

    public class toHtml extends HttpServlet {

        public void service(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                String url = request.getParameter("urls")!=null?request.getParameter("urls"):"";
                //url是要生成htm的jsp页面
                String name = "";
                response.setContentType("text/html;charset=gb2312");
                ServletContext sc = getServletContext();
                System.out.println("request.getRealPath"+request.getRealPath(""));
                 name = request.getRealPath("") + "/index.htm";      /*生成htm页  位置在%服务器的根目录%/工程名/index.htm 例如:d:/tomcat5.0/webapp/studyteach/index.htm  ,注意这里是在根目录生成,你可以生成后放到你想放的文件夹里,保证其它东西如图片的路径正确     这里就写成name = request.getRealPath("") + "/kszx/kszx.htm";      */

              RequestDispatcher rd = sc.getRequestDispatcher(url);

                final ByteArrayOutputStream os = new ByteArrayOutputStream();

                final ServletOutputStream stream = new ServletOutputStream()
                {
                        public void write(byte[] data, int offset, int length) {
                                os.write(data, offset, length);
                        }

                        public void write(int b) throws IOException {
                                os.write(b);
                        }
                };

                final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));

                HttpServletResponse rep = new HttpServletResponseWrapper(response)
                {
                        public ServletOutputStream getOutputStream() {
                                return stream;
                        }

                        public PrintWriter getWriter() {
                                return pw;
                        }
                };
                rd.include(request, rep);
                pw.flush();
                FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.htm
                os.writeTo(fos);
                fos.close();
                PrintWriter out = response.getWriter();
                out.print("<p align=center><font size=3 color=red>首页已经成功生成!</font></p>");
            }
    }
    web.xml
    中添加
       <servlet>
        <servlet-name>tohtm</servlet-name>
        <servlet-class>com.jetsum.mystatic.toHtml</servlet-class>
    </servlet>

      <servlet-mapping>
        <servlet-name>tohtm</servlet-name>
        <url-pattern>/web/tohtm</url-pattern>
      </servlet-mapping>
    使用方法很简单  mytest.jsp(wwwroot下)
    <a href="web/tohtm?urls=/kszx/kszx.jsp">生成静态页</a>    kszx.jsp为要生成htm的动态页
    如果不在wwwroot下,在wwwroot/pp下
    就要写成
    <a href="../web/tohtm?urls=/kszx/kszx.jsp">生成静态页</a>

分享到:
评论
2 楼 sornor 2011-07-26  
不错!总算对servlet和jsp之间的关系有了了解了!感谢感谢!
1 楼 yufylovefl 2011-01-31  
文章很好

相关推荐

    jsp与Servlet跳转实例

    ### jsp与Servlet跳转实例:深入理解信息提交与页面跳转 在Web开发中,JSP(Java Server Pages)和Servlet是两个重要的技术组件,它们共同协作来处理客户端请求并生成动态网页内容。本文将详细解析一个具体的案例...

    JSP与Servlet有什么关系

    ### JSP与Servlet的关系 #### 一、Servlet简介 Servlet技术是Java EE平台的重要组成部分,主要用于构建动态Web应用。在理解JSP与Servlet的关系之前,首先需要了解Servlet的基本概念。 **Servlet**是一种运行在...

    Jsp+Servlet+JavaBean实例

    在JSP中,Servlet通常用于处理业务逻辑和控制流程。 **JavaBean** 是Java编程中的一个组件模型,它遵循一定的规范来封装数据和行为,以便于在Java应用中重用。JavaBean通常具有公有的构造函数、属性(getter和...

    java +jsp+servlet 登录验证实例

    在本实例中,我们使用 JSP 和 Servlet 来实现登录验证功能。JSP 负责接收用户输入,并将其传递给 Servlet 进行处理。Servlet 负责处理用户的请求,并将结果返回给用户。 知识点五:MySQL 数据库连接 在本实例中,...

    jsp+servlet+mysql实例

    《基于JSP、Servlet与MySQL的学生管理系统实践》 在信息技术领域,开发一款学生管理系统是学习Web应用程序开发的经典案例。这个小实例将带你深入理解JSP(JavaServer Pages)、Servlet和MySQL数据库的集成应用,...

    jsp+servlet入门项目实例

    jsp+servlet实现班级信息管理项目

    JSP与Servlet学习课件

    **JSP与Servlet的关系:** JSP本质上是Servlet的一种简化版本,它们共同工作以处理Web请求。JSP侧重于视图展示,而Servlet负责业务逻辑。在实际应用中,通常采用MVC(Model-View-Controller)模式,Servlet作为控制...

    jsp+servlet+sql server购物车实例

    【标题】"jsp+servlet+sql server购物车实例"是一个基于Web开发的电子商务应用程序,它展示了如何使用JavaServer Pages(JSP)、Servlet和Microsoft SQL Server数据库来实现一个基本的在线购物车功能。在这个实例中...

    JSP + EJB + Servlet 实例

    使用原始的servlet操作熟悉EJB的实体管理。 本实例主要功能:实现对员工、角色、账号、部门的关系管理。 本实例的实体设计:部门-员工:一对多。员工-账号:一对一。账号-角色:一对一。 主要采用EJB进行会话管理。...

    JSP+Servlet+JavaBean实例(MVC)

    这是一个以JSP、servlet、JavaBean实现MVC三层架构的简单例子,使用XML作为数据库连接的配置文件。 使用环境:eclipse_3.2、myeclipse_5.1、jdk_6.0、tomcat_5.5、sql server 2005 &lt;br&gt;----------------------...

    jsp+servlet实例数据库

    本实例将深入讲解如何利用JSP和Servlet与数据库进行交互,实现一个基于餐馆数据库的应用。 1. **JSP基础** JSP是一种服务器端的脚本语言,它允许开发者在HTML页面中嵌入Java代码,使得网页具有动态性。JSP页面在...

    Servlet与JSP之间的关系

    Servlet和JSP之间的关系可以用"后端处理器"和"前端展示"来理解。Servlet通常处理业务逻辑和数据操作,而JSP则负责呈现视图。在实际开发中,常常使用Servlet来处理请求,调用JavaBean(Java类,封装业务逻辑)进行...

    jsp+servlet+jdbc实现简单的购物车实例.zip

    jsp+servlet+jdbc实现简单的购物车实例,购物数据通过session存储 1、加入购物车时,把数据保存在session中 2、点击系统退出时,购物车中的数据插入到数据库购物车表 3、再次登录时,查询数据库购物车表的数据加载到...

    JSP与Servlet核心技术

    JSP与Servlet的关系:** 在Java Web应用中,Servlet通常作为控制器,处理HTTP请求,进行业务逻辑处理,而JSP作为视图,负责展示数据。这种模式被称为MVC(Model-View-Controller)架构,是Web开发中的常见设计模式...

    Jsp+Servlet+JavaBean+JDBC简单登录实例

    **JSP+Servlet+JavaBean+JDBC简单登录实例详解** 在Web开发中,构建一个用户登录系统是常见的需求。本实例将详细讲解如何利用JavaServer Pages (JSP)、Servlet、JavaBean以及Java Database Connectivity (JDBC) 来...

    完整简洁的jsp+servlet+jstl实例

    【标题】"完整简洁的jsp+servlet+jstl实例"是一个综合性的学习资源,旨在帮助初学者或希望深入理解JSP、Servlet和JSTL技术的开发者。这个实例集成了这三个关键技术,提供了一个可以直接运行的项目,使得学习者能够...

    servlet+jsp实例

    一个servlet的demo,使用servlet实现方法具体实现,jsp实现前端

    基于JSP+Servlet小项目

    【基于JSP+Servlet小项目】是一个典型的JavaWeb应用程序,它是使用JavaServer Pages(JSP)技术和Servlet进行开发的。这个项目可能包含了从用户界面到后端数据处理的完整流程,展示了如何在Web环境中整合这两种技术...

    jsp&servlet电子书

    在学习JSP与Servlet的过程中,学生常常会遇到各种问题,例如概念混淆、操作难度、应用场景的理解以及相关认证考试的准备等,这本书都进行了详尽的解答和深入的探讨。 JSP(Java Server Pages)是Java平台上的动态...

    基于jsp+servlet实现的简单博客系统实例(附源码)

    主要介绍了基于jsp+servlet实现的简单博客系统,以完整实例形式分析了基于jsp+servlet简单博客系统的原理与相关技巧,并附带了完整源码供读者下载学习,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics