一、JSP入门
(1) 建立对JSP的直观认识
(2) JSP的运行原理
(3) JSP页面的构成
(4) JSP隐式对象
(5) 分析JSP所生成的Servlet代码
(6) 注册与配置JSP页面的访问路径
(7) JSP与JavaScript的综合应用
(8) JSP与Servlet的应用比较
二、JSP的起源
在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序代码产生,整个Servlet程序的代码将非常臃肿,编写和维护都将非常困难。
对大量静态内容的美工设计和相关HTML语句的编写,并不是程序员所要做的工作,程序员对此也不一定在行。网页美工设计和制作人员不懂Java编程,更是无法来完成这样的工作。
为了弥补Servlet的缺陷,SUN公司在Servlet的基础上推出了JSP(Java Server Pages)技术作为解决方案。
JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。
三、建立对JSP的直观认识
JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。
在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。
JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用System.out.println语句将它们打印到命令行窗口。
JSP文件就像普通的HTML文件一样,它们可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。
在JSP页面中也可以使用一种称之为JSP表达式的元素,只需将要输出的变量或表达式直接封装在<%= 和 %>之中,就可以向客户端输出这个变量或表达式的运算结果。在JSP表达式中嵌套的变量或表达式后面不能有分号。
四、JSP的运行原理
WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina\<主机名>\<应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。
JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。
可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。
五、JSP页面的构成
JSP页面就是带有JSP元素的常规Web页面,它由静态内容和动态内容构成。
静态内容:指HTML元素;
动态内容:指JSP元素,包括指令元素、脚本元素、动作元素、注释等内容。
指令元素
指令元素主要用于为转换阶段提供JSP页面的相关信息,指令不会产生任何输出到当前的输出流中,它指定了有关页面本身的信息,这些信息在请求期间一直保持不变。
所有的JSP指令元素的作用范围为当前的JSP页面,即指令元素只影响当前的这个JSP页面,对其他JSP页面没有影响。
指令的语法如下:<%@ directive{attr="value"}* %>
指令元素有三种:page、include和taglib
page指令
该指令用于整个页面,定义与页面相关的属性,它是JSP页面和容器的通信员。
page指令可以出现在JSP页面的任何位置,但无论出现在何处,其作用范围都是这个页面,因此通常将之置于也的开头。
语法:<%@ page 属性名1="值1" 属性名2="值2" ... %>
<注意:可以使用多个page指令,但对于每个页只能声明给定属性一次,除了import属性外。属性名称是大小写敏感的>
page的属性共有13个,最常用的属性有:
import=“导包列表”:指示当前JSP文件引入需要使用的类或接口。多个类、包名之间用“,”隔开。
例如,<%@page import=“java.util.*,java.io.*”%>
或者,<%@page import=“java.util.*”%>
<%@page import=“java.io.*”%>
<注意:import属性是唯一一个可以在同一个页面中出现多次的属性。
注意:java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*都已经被隐含的引入,包中的类、接口等不需要引入就可以使用。>
language=“scriptingLangeuage”:指定当前的JSP文件中的程序代码是使用何种编程语言编写的,目前属性的值只能是java。
contentType=“ctinfo”:设置当前JSP页面的向客户浏览器输出内容的MIME类型和字符编码集。客户端的浏览器会根据你在contentType中指定的MIME类型和字符集代码来显示Servlet输出的内容。
<%@page contentType=”text/html;charset=utf-8”%>
pageEncoding =“peingo”:设置当前JSP页面使用的字符编码。如果设置了这个属性,则JSP页面的字符编码就是它指定的字符集,如果没有就使用contentType属性的值,如果都没有,页面默认的是ISO-8859-1。
session=”true|false”:指示当前JSP文件中session隐含对象是否有效,如果为true表示session对象有效,可以使用,否则session对象无效,不能使用
buffer=“none|8kb|sizekb”:指定JSP文件中out对象使用的缓冲区大小。
autoFlush=“true|false”:设置当输出缓冲区已经满了是否自动flush。需注意,如果buffer设定为none,则该属性就不能设成false,否则JSP文件运行时会抛出异常。
errorPage=“relativeURL”:设置当前JSP页面中代码出现异常后,专门处理异常的页面。
isErrorPage=“true|false”:设置当前JSP页面是否为专门处理异常的页面,如果为true,则该页面可以通过exception内置对象,处理其他JSP页面转过来的异常
include指令
– include指令用于在JSP页面中包含一个文件,该文件可以是HTML网页、文本文件或一段Java代码,用它可以简化页面代码,提高代码的重用性。
– 语法:<%@ include file="相对于当前文件的url" %>
– url为被包含文件的相对路径,如果以“/”开始,相对于这个应该的根目录,如果没有以“/”开头,则相对当前的JSP页面。
<注意:在包含的文件中,最好不要使用<html></html><body></body>等标签。>
taglib指令
taglib指令允许页面使用用户定制的标签,语法如下:
<%@taglib (uri="具有唯一标识和前缀相关的标签描述符地址" prefix="前缀")%>
• 使用JSP脚本元素可以将Java代码嵌入到JSP页面中,这些Java代码将出现在由当前JSP页面生成的Servlet中,使JSP将静态内容与动态内容分离出来。
• 表达式
– 表达式标签在JSP请求处理阶段进行运算,所得的结果转换成字符串,与静态标签数据组合在一起。表达式在页面的位置,就是该表达式计算结果显示的位置。
– 语法:<%= expression %>
例如,<%=9+9 %>
脚本元素
• 脚本
– 脚本是在<% %>里嵌入的Java代码,这里的Java代码和一般的Java代码没有什么区别,所以每一条语句同样要以分号“;”结束,这和表达式是不相同的。
– 语法:<% code %>
• 声明
– 声明用来定义当前JSP页面中使用的变量和方法。
– 该标签中定义的变量为JSP页面全局变量,JSP转化成Servlet后,定义的变量转化为类变量,方法转化为Servlet中的方法。
– 语法:<%! code %>
例如,<%! String str=“hello” ;%>
<%! public static final String DEFAULT_NAME=“World”;%>
<%! public String getName(HttpServletRequest request){
return request.getParameter(“name”);
}
%>
注意:变量的声明必须以;结尾,该声明仅在一个页面中有效,如果想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@include%>或<jsp:include>元素包含进来。