JSP入门——第4章JSP技术入门

来源:互联网 发布:web数据挖掘 微盘 编辑:程序博客网 时间:2024/05/06 02:50
 

第4章JSP技术入门

王开锋 wangkf05AT163.com

本将将通过一个简单的实例使读者对JSP技术有一个初步的认识,并对JSP的执行机制有所了解。具体而言,本章包含如下内容:

l         JSP技术概述

l         一个简单的JSP程序

l         JSP的执行机制

4.1 JSP技术概述

JSP(JavaServer Pages)是SUN公司在推出Java程序设计语言与Servlet技术之后,另外推出的一种动态网页制作技术。JSP是基于java语言的一种脚本技术,它提供了一种简单快速的方法来创建、显示带有动态内容的Web 页面。

简单的说一个JSP页面包含了两部分内容:一是以任何基于文本格式表述的静态数据,如HTML、XML等;二是包含动态内容的JSP元素。JSP源文件的扩展名一般为.jsp。JSP技术具有Java程序设计语言的许多优点,与其它动态网页技术相比,JSP具有如下优点:

l         平台无关性

由于JSP技术所依靠的是Java语言,而Java语言的一个显著特点就是“平台无关性”,这也就决定了JSP技术也具有良好的平台无关性,这也是JSP的一大优越性。

l         内容与显示的分离

开发人员可以使用HTML或者XML等语言来设计显示页面,而页面上的动态内容(根据请求而变化的内容)通过使用JSP标识或者脚本来生成。生成动态内容的部分被封装在Servlet和JavaBean组件中,并且结合在脚本中,所有的脚本在服务器端运行。

l         组件的重用

JSP技术强调了组件的重用。JSP页面充分利用了可重用的组件(JavaBean、EJB)来处理较为复杂的过程。组件重用加速了Web程序的开发。

l         可扩充性

通过使用JavaBean,可以使JSP程序具有更强大的功能。

4.2 第一个JSP页面

本节将给出第一个JSP页面,它的主要功能是显示出当前的日期、月份和年份,并且根据当前的时间,动态选择显示“Good morning”或者“Good afternoon”。虽然这个JSP页面非常简单,但是能够很好的反映出一个最基本的JSP页面是如何工作的。

这个JSP页面的源程序如例程4-1所示:

例程4-1 first.jsp

<!--

   这是我们的第一个JSP程序,它的主要功能是现实当前的日期.

 -->

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.util.*" %>

<html>

<head>

  <title>我的第一个JSP页面</title>

</head>

<body>

  <h2>我的第一个JSP页面</h2><hr>

  <b>Today is: </b><p/>

  <%!

    int getDate(){

      return Calendar.getInstance().get(Calendar.DATE);

    }

    int getMonth(){

      return Calendar.getInstance().get(Calendar.MONTH)+1;

    }

    int getYear(){

      return Calendar.getInstance().get(Calendar.YEAR);

    }

  %>

  Date:  <%=getDate() %><br>

  Month: <%=getMonth() %><br>

  Year: <%=getYear() %><p/>

  <%if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){ %>

    Good morning

  <%} else {%>

    Good afternoon

  <%} %>

<body>

</html>

该页面在经过JSP引擎编译执行后,在浏览器中实现的效果如下所示:

图4-1第一个JSP页面

这个JSP程序由以下结构组成:

注释:

本程序的前面几行由“<!-- -->”包裹的部分是程序的注释,在源程序中添加恰当的注释是良好的编程习惯。当然注释不是越多越好,当程序非常简单,不加注释也不影响可读性。但是对于比较复杂的程序,由必要在恰当的地方添加正确、简明的注释。

JSP指令:

JSP指令可以将信息传送到JSP引擎。本例中的第一行和第二行,就是使用JSP的page指令,定义了contextType属性和import属性。

函数声明:

“<%!”和“ %>”之间的部分是JSP的声明部分。在本例中,声明了3个函数,分别获取当前的日期、月份和年份。

表达式:

JSP引擎用来输出在“<%=”和“ %>”之间的代码运行结果。本例中,通过使用表达式,来显示函数运行的结果。

scriptlet:

在“<%”和“ %>”之间的代码,它是一个或多个Java语句的集合,它是JSP页面中最常见的元素。

本例比较简单,主要是通过对JSP组件的简单运用,使读者对于 JSP有一个直观的概念,更多的内容将在后面的章节中详细介绍。

4.4 JSP的执行机制

JSP文件不能由浏览器直接运行,而需由web服务器解释执行。当一个JSP文件第一次被请求时,JSP引擎首先把JSP文件转换为一个java源文件,转换成功后,JSP引擎调用将java源文件编译成class文件,这个class文件就是一个Servlet程序,最后执行这个Servlet,响应用户的请求。这种转换只在JSP页面第一次被执行或JSP页面的内容发生改变时进行,因此JSP页面第一次执行时速度往往比较慢。所有这些操作都在服务器端执行,网络上传送给客户端的仅是得到的结果。JSP的工作模式可以用下面的图来描述:

图3-2 JSP的工作模式

       参照第一个JSP页面,可以看出一个JSP页面通常由静态模版数据(一般为HTML)何JSP元素组成,后者可以分为一下三种:

l         伪指令(如page、include等)

l         脚本元素(包括声明、表达式、scriptlet)

l         动作(<jsp:useBean>等)

当HTTP客户端向某一个JSP页面发送请求时,JSP引擎将检查.jsp文件和编译声称的.class文件,如果.java文件不存在或比.jsp文件已经发生修改,JSP引擎将重新将其转换为servlet并编译他。转换的原则如下:

l         伪指令转化的时候并不声称代码,而是向JSP引擎提供转换时的信息。

l         声明(包括变量声明、函数声明)被原封不动的复制到_jspService( )方法之外,作为servlet类的成员变量或成员函数。例如,在第一个JSP页面中声明了getDate( )、getMonth( )、getYear( )三个函数,这三个函数被原封不动的转化为servlet的成员函数。

l         静态模版数据依照其出现的顺序被逐行的转化到out.print( )语句中作为参数,如<html>被转化为“out.write("<html>\r\n");”。

l         JSP表达式依照其出现的顺序被逐行的转化到out.print( )语句中作为参数,如<%=getDate() %>表达式被转化为“out.print(getDate() );”。

l         Scriptlet被原封不动的转化到_jspService( )方法中。

l         JSP动作被转换成执行其功能的运行时逻辑。

JSP页面最终都要编译成servlet文件,但是servlet文件的位置及名字等信息依赖于特定的服务器。以Tomcat5.0为例,对于第一个JSP文件,它经过编译后生成的.java文件及.class可以在<install_dir>\work\Catalina\localhost下找到。源程序如例程4-2所示:

例程4-2 first_jsp.java

package org.apache.jsp;

 

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

import java.util.*;

 

public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {

 

    int getDate(){

      return Calendar.getInstance().get(Calendar.DATE);

    }

    int getMonth(){

      return Calendar.getInstance().get(Calendar.MONTH);

    }

    int getYear(){

      return Calendar.getInstance().get(Calendar.YEAR);

    }

 

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

      out.write("   这是我们的第一个JSP程序,它的主要功能是现实当前的日期.\r\n");

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

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

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

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

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

      out.write("  <title>我的第一个JSP页面</title>\r\n");

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

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

      out.write("  <h2>我的第一个JSP页面</h2><hr>\r\n");

      out.write("  <b>Today is: </b><p/> \r\n");

      out.write("  ");

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

      out.write("  Date:  ");

      out.print(getDate() );

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

      out.write("  Month: ");

      out.print(getMonth() );

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

      out.write("  Year: ");

      out.print(getYear() );

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

      out.write("  ");

if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){

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

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

      out.write("  ");

} else {

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

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

      out.write("  ");

}

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

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

      out.write("</html>\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.handlePageException(t);

      }

    } finally {

      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);

    }

  }

}

 

4.5 小结

本章通过实例,首先让读者对JSP有一个直观的感受,而后以这个实例为基础讲解了JSP的工作模式,使得读者对JSP的认识逐渐深入。本章只是对JSP技术简要的介绍,本书的后续章节,将配合大量的实例对JSP进行深入的讲解。

原创粉丝点击