`
Aether
  • 浏览: 14265 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JSP拾遗(二)——从jsp到servlet

    博客分类:
  • Java
阅读更多

     无代码无真相。这里我们来看看,一个简单的jsp页面,在被服务器解释执行时,到底发生了怎么样的转换。

     在你的tomcat根目录下的webapps目录下,新建一个test目录。在新建的test目录里面,创建一个WEB-INF目录。将tomcat根目录下的conf目录里的web.xml目录拷贝到/webapps/test/WEB-INF目录下,这里的web.xml的可以把<web-app>标签里面的内容全部删除,因为conf里面已经声明过了。然后在/webapps/test目录下新建一个txt文档,并把名称改为MyJsp.jsp,注意后缀名是.jsp

完成上面操作后的目录结构如下:

wbapps - test -

             -MyJsp.jsp

                    -WEB-INF -

                                       - web.xml

      启动tomcat,在地址栏中输入http://127.0.0.1:8080/test/MyJsp.jsp。浏览器里一片空白,这是自然的,因为我们的MyJsp.jsp文件本身就什么内容也没有。

      在tomcatwork目录中找到test目录,它的位置是/work/Catalina/localhos/下面,然后依次顺着目录找下去,在/work/Catalina/localhos/org/apache/jsp目录下面,你会发现一个MyJsp_jsp.java文件。这个文件就是MyJsp.jsp文件被翻译成的java文件。它并不是在jsp文件名后面加了Servlet,而是直接把"."变成"_"作为类名。

    打开MyJsp_jsp.java文件:

   

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class MyJsp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.List _jspx_dependants;

  public Object 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");
      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;

    } 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.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

 

 

呵呵,原来即使是一个空白的jsp文件,也照样会生成这么长的一段代码的。没有看到servlet的字样?翻翻tomcatapi,你就会发现,MyJsp_jsp的父类HttpJspBase已经实现了javax.servlet.Servlet接口的。

下面我们在MyJsp.jsp文件中加入以下HTML代码:

<html>
<body>
	This is my first JSP!
</body>
</html>

 

 

 

刷新一下浏览器,我们发现,MyJsp_jsp.java中, _jspService()方法中,增加了以下代码:

out.write("<html>\r\n");
out.write("<body>\r\n");
out.write("\tThis is my first JSP!\r\n");
out.write("</body>\r\n");
out.write("</html>");

 

 

 

      原来,所有的HTML代码都要用out.write()方法输出出来的啊。所以可以想象,如果使用纯粹的Servlet编写一个复杂的web页面,将是一件多么麻烦的事情。

 

下面,我们来实验将jsp里面插入代码段的情况。教材里面说jsp里面的java代码段有两种形式,一种是<%!  %>包围,一种是<%  %>包围。(当然取值符<%=  %>里面的表达式里也可以有相当长java代码段,这个我们暂时不予考虑)

<%!  %>一般用来表示全局变量的声明,以及方法的声明,而<%  %>则是普通的可执行程序段。什么意思呢?用代码来说话!

 

MyJsp.jsp文件里面加入以下代码:

 

<%!   
        double PI = 3.14159;

         int  plus(int a, int b){
         return a+b;
}
%>
<%
         String hello = "Hello World!";
%>

 

 

再次刷新浏览器,查看MyJsp_jsp.java代码:

 

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class MyJsp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

   
	double PI = 3.14159; //<%! %>里面的变量成为成员变量
	
	int  plus(int a, int b){//<%! %>里面的方法成为成员方法 
	return a+b;
	}
	
  private static java.util.List _jspx_dependants;

  public Object 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");
      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;

      String hello = "Hello World!";  //<%%>里面的代码段

      out.write("\r\n");
      out.write("\r\n");                     //HTML代码段
      out.write("<html>\r\n");
      out.write("<body>\r\n");
      out.write("\tThis is my first JSP!\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } 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.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

 

我们发现,<%!  %>里面声明的变量成为了MyJsp_jsp的成员变量,里面声明的方法成为了MyJsp_jsp类的成员方法,而<%  %>的代码则被填充到了_jspService()方法中。

 

 注意<%  %>中的代码在_jspService()方法中的填充位置。这里的代码是被填充在一大堆对象的初始化之后,因此, _jspService()方法中的这一大堆对象就可以在<% %>里面直接拿来使用,这些对象就是所谓JSP的内置对象,除了_jspFactory对象没什么用处外,这里有八个内置对象,按照声明顺序依次是:requestresponsepageContextsessionapplicationconfigoutpage。这些内置对象除了可以直接在你的<% %>代码段中使用外,还会在你试图声明和它们同名的对象时,优雅地给你报出一个错误。(废话)

 

 

分享到:
评论

相关推荐

    《Java Web开发基础——从Servlet到JSP》源代码v1.0

    《Java Web开发基础——从Servlet到JSP》是一本深入探讨Java Web开发的教程,主要涵盖了从基础的Servlet到高级的JSP技术。这个压缩包包含的源代码是该书教学内容的实践部分,旨在帮助读者更好地理解和应用所学知识。...

    JSP源码——jsp+servlet+javaBean实现MVC_jspmvc.zip

    【JSP源码——jsp+servlet+javaBean实现MVC】是基于Java Web技术构建的一种经典MVC(Model-View-Controller)模式的应用实例。在Web开发中,MVC模式被广泛采用,它将应用程序的业务逻辑、数据处理和用户界面分离,...

    HttpSession/session,jsp,servlet——综合练习题一

    在IT行业中,尤其是在Web开发领域,`HttpSession`、`jsp`和`servlet`是三个非常重要的概念。这里我们将深入探讨这些技术,并结合一个名为"web26_session5示例1"的压缩包文件,来解析它们在实际应用中的综合运用。 ...

    JSP源码——音乐网站(JSP+SERVLET).zip

    2. **音乐搜索**:用户可以按歌曲名、歌手名等关键字搜索音乐,这需要Servlet处理搜索请求,查询数据库,并将结果返回到JSP页面。 3. **播放列表**:用户可以创建、编辑和删除播放列表,Servlet需要处理这些操作,...

    jsp网络编程——源文件(06——09)

    通过这些源文件,学习者可以跟随章节逐步深入,从基础概念到进阶应用,全方位地掌握JSP网络编程技术。实践中,可以通过运行和修改代码,加深对JSP工作原理的理解,从而提高实际开发能力。同时,结合理论讲解和实际...

    Servlet JSP深入详解 基于Tomcat的Web开发

    ### Servlet与JSP深入详解:基于Tomcat的Web开发 #### 一、Servlet技术概述 Servlet是一种用Java编写的服务器端应用程序接口(API),它扩展了Java Web开发的功能。Servlet可以响应HTTP请求,并且能够处理复杂的...

    JSP核心技术——JSP引擎内幕(2010).pdf

    ### JSP核心技术——JSP引擎内幕 #### 一、JSP引擎的工作原理 JSP(Java Server Pages)是一种基于Java的服务器端脚本技术,它允许开发者将动态内容嵌入到HTML网页中。JSP的核心功能是通过JSP引擎来实现的。JSP...

    库存商品管理(jsp)——试题讲解源码及资料

    《库存商品管理(jsp)——试题讲解源码及资料》 在IT行业中,库存商品管理是企业运营的重要组成部分,尤其在电子商务与供应链管理领域更是不可或缺。本资源集合以"库存商品管理"为主题,通过JSP(JavaServer Pages...

    jsp+servlet 网上书城项目

    【jsp+servlet 网上书城项目】是一个典型的Web应用程序示例,它结合了JavaServer Pages (JSP) 和Servlet技术,用于构建一个在线图书销售平台。该项目旨在帮助学习者掌握这两种核心技术,并且提供了Oracle数据库支持...

    jsp程序设计——图灵奖

    7. **JSP的生命周期和状态管理**:理解JSP页面从加载到销毁的过程,以及session和cookie等在管理用户状态中的应用。 8. **安全性与性能优化**:探讨JSP开发中的安全问题,如防止SQL注入和XSS攻击,以及提高JSP应用...

    jsp网络编程——源文件(01——05)

    在本教程的"jsp网络编程——源文件(01——05)"中,我们将逐步学习JSP的基本概念、语法结构以及常用功能。 **章节概览** 1. **chap01:JSP基础** - JSP的起源与发展 - JSP与HTML、Servlet的关系 - JSP基本结构...

    Jsp程序设计——交友网站

    总之,这个JSP交友网站项目涵盖了Web开发的多个方面,从基础的JSP语法到高级的MVC设计模式,从数据库操作到前端交互,从服务器部署到安全防护,都是学习和实践JSP程序设计的绝佳案例。通过这个项目,开发者可以提升...

    jsp网络编程——源文件(10——11)

    【标题】"jsp网络编程——源文件(10——11)"主要涵盖了JSP(Java Server Pages)技术在网络编程中的应用,这是Java Web开发的重要组成部分。这两个章节可能包括了第10章和第11章的学习内容,涉及到JSP的基础语法、...

    jsp网络编程——源文件(12——13)

    【标题】"jsp网络编程——源文件(12——13)"主要涵盖了JSP(Java Server Pages)技术在网络编程中的应用,这部分内容通常包括了第十二章和第十三章的知识点。JSP是Java平台上的动态网页技术,它允许开发者在HTML或...

    JSP网络编程——多媒体(1——3)

    通过"JSP网络编程——多媒体(1——3)"的学习,初学者不仅可以掌握JSP的基本语法,还能了解到如何在实际项目中有效地处理和展示多媒体内容,这对于构建富媒体的Web应用程序至关重要。这个系列教程对于想要提升自己...

    jsp开发案例——租房系统jsp列子

    【jsp开发案例——租房系统jsp列子】 在IT行业中,JavaServer Pages(JSP)是一种广泛使用的服务器端脚本语言,用于动态网页开发。本案例是基于JSP技术开发的一个租房系统,它涵盖了用户登录、房屋信息查询以及会员...

    Head First Servlet & JSP

    在《Head First Servlet & JSP》中,你会了解到如何创建Servlet,包括Servlet生命周期、服务方法、初始化参数、会话管理以及如何在Servlet间进行协作。 JSP则是另一种用于生成动态网页的技术,它将HTML模板与Java...

    网络程序设计——JSP从入门到精通

    **网络程序设计——JSP从入门到精通** JSP(JavaServer Pages)是Java平台上的一个标准技术,用于创建动态网页。它结合了HTML、Java代码和Java Servlet技术,允许开发者在服务器端生成HTML响应,提供了高效且灵活的...

    JSP源码——ERP管理系统(jsp+servlet).zip

    JSP源码——ERP管理系统(jsp+servlet).zip

    jsp小游戏——猜数字相加大小

    【jsp小游戏——猜数字相加大小】是一款基于JavaServer Pages(JSP)技术开发的简单游戏,旨在帮助用户更好地理解和掌握JSP的基本用法。在这个游戏中,系统会随机生成两个数字,玩家需要猜测这两个数字相加的结果是...

Global site tag (gtag.js) - Google Analytics