开发JSP的动机
Servlet通过调用PrintWriter类的println方法创建XHTML响应文档
在Java程序代码中嵌入XHTML,非常烦琐
分离程序编制和页面设计工作可提高项目开发效率
JSP是在XHTML中嵌入程序代码
ü JSP适用于返回文档的大部分内容已经预先确定的情况
ü Servlet适用于返回文档的大部分内容需要动态产生的情况
JSP 文档包括四种文档
JSP Documents
模板文件,即传统的XHTML或XML代码,用来产生固定内容,直接发
送到浏览器
JSP 注释
<%-- … --%>,不发送到浏览器端
比较:客户端可以看到的批注,以“<!--”开头以“-->”结尾
Action Elements:动作元素
动作元素创建显示内容
起始标签(可包括属性)、内容(动作体)、结束标签
3种动作元素
1. 标准动作元素
2. JSP Standard Tag Library(JSTL) elements:JSP标准标签库
3. 自定义动作元素
Action Elements:动作元素——标准动作元素
由JSP规范定义
例如:<jsp:include>、<jsp:forward>
例如:<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>
forward动作:<jsp:forward>
把请求转到另外的页面
只有一个属性page
page属性包含的是一个相对URL
page的值既可以直接给出,也可以在请求的时候动态计算
示例
<jsp:forwardpage="/utils/errorReporter.jsp" />
<jsp:forward page="<%=someJavaExpression%>" />
Include动作:<jsp:include>
把指定文件插入正在生成的页面
<jsp:include page="relativeURL" flush="true" />
动态插入
插入文件的时间是在页面被请求的时候
被插入的文件是一个完整的JSP文件而非片段
把两个JSP输出到客户端的结果结合在一起
两个JSP文件分别被Web服务器转化为两个不同Java类
不存在变量定义方面的冲突
Action Elements:动作元素—— JSTL(JSP标准标签库)
包括5个子库
Core tags:核心标签库
XML Processing:XML处理标签库
Internationalization and formatting:国际化和格式化标签库
Database access:数据库访问标签库
Functions:函数标签库
支持表达式语言( expression language)
Action Elements:动作元素——自定义标签库
使用Java语言编程实现
使用标签比使用等价的Java语句更简单
Directives:指令
以<%@开始,以%>结束的标签
发送给JSP容器的消息,提供文档本身的信息和文档中预先定义的动
作元素的来源
例如:网页的编码方式、语法、信息等
JSP有3个编译指令:page、include和taglib
指令定义了JSP的解释环境
Directives:page指令
page指令是最复杂的指令,它的主要功能为设定整个JSP 网页的属
性和相关功能
page指令的基本语法
<%@ pageattribute1="value1" attribute2= "value2"
attribute3=…%>
示例
<%@ pagecontentType = “text/html” %>
<%@ pageimport="java.util.* java.lang.*" %>
<%@ pagebuffer="5kb" autoFlush="false" %>
<%@ pageerrorPage="error.jsp" %>
Directives:include指令
Include 指令将会在JSP 编译时插入一个包含文本或代码的静态文件,
同时解析这个文件中的JSP语句
Include 指令只有一个参数,即要插入文件的相对路径
<%@ includefile="relativeURL" %>
对比include动作元素
<jsp:includepage=“”/> 运行时插入
用<jsp:include>标签引入文件的效率要稍微差一点
如果两个文件中有重复的Java变量或函数定义,那么合并之后编译
要出错
html的标签同样会相互影响
避免片段文件中有<html><body>之类的全局标签出现
Directives:taglib指令
taglib指令定义可用的JSP标准标签库或自定义标签库
基本语法
<%@ tagliburi = "tagLibraryURI" prefix="tagPrefix" %>
示例:定义jstl标签
<%@ taglibprefix=“c”
uri=“http://java.sun.com/jsp/jstl/core”%>
可允许当前JSP页使用JSTL标签库
使用JSTL标签时采用”c: qualifier”的形式
Scriptlets:嵌入到JSP文档中的Java代码脚本
一般使用Java语言编写脚本
Scriptlets包括:注释、scriptlets代码、表达式、声明(很少使用)
The expressionscriptlet
<%= expression%>
如果不是String对象,则转换为String对象
示例
<font size=<%=i%>>读者,您好!</font>
欢迎:<%=request.getParameter("username")%>
JSP有以下九个内置对象
request、response、out、pageContext、session、application、
config、page、exception
用好JSP内置对象是JSP编程的精髓
使用request对象获取请求
javax.servlet.http.HttpServletRequest对象
包含所有请求的信息
如请求的来源、标头、cookies和请求相关的参数值等
常用方法
Object getAttribute( String name ):返回由name指定的属性值,该
属性不存在时返回null
void setAttribute( String name, Objectvalue ):在属性列表中添加/
删除指定的属性
String getParameter( String name ):获取客户端发送给服务器端的参
数值
String[] getParameterValues( String name):获得请求中指定参数的
所有值
String getProtocol():返回请求使用的协议。可以是HTTP1.1或者
HTTP1.0
String RequestURI():返回发出请求的客户端地址,但是不包括请求的
参数字符串
String getRemoteAddr():获取发出请求的客户端IP地址
HttpSession getSession():获取session
使用response对象做应答
表示javax.servlet.http.HttpServletResponse对象
提供了用于设置送回浏览器的响应的方法
sendRedirect(URL):可以将用户重定向到一个不同的页面(URL)
setContenType(String type):响应设置内容类型头
addHeader(String name,String value):添加String类型的值到HTTP文
件头
在session对象中保存用户会话
当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间
反复连接,反复刷新一个页面,服务器应当通过某种办法(比如
cookie)知道这是同一个客户,这就需要session对象
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开
这个服务器结束,被称为一个会话
session表示一个请求的javax.servlet.http.HttpSession对象
session可以存贮用户的状态信息
application对象
服务器启动后产生application对象
当客户在所访问的网站的各个页面之间浏览时,这个application对
象都是同一个
可以理解为在一个应用中applications对象是一个全局的Map
有setAttribute( )和getAttribute( )方法
pageContext对象
pageContext中保存的对象限于本网页内
有setAttribute( )和getAttribute( )方法
JSP的Scope
4个范围(scope):Page、Request、Session、Application
在这4个范围分别有pageContext,request,session,appliaction4个
内置对象用来保存对象
4个内置对象方法名都是setAttribute( )和getAttribute( )
使用out对象输出
javax.jsp.JspWriter的一个实例
是一个输出流,用来向客户端输出数据
常用方法
out.print():输出各种类型数据。
out.newLine():输出一个换行符。
out.close():关闭流。
<%@ pagecontentType="text/html;charset=GB2312" %>
<%@ pageimport="java.util.Date" %>
<HTML>
<HEAD>
<%
Date Now = new Date();
String hours=String.valueOf(Now.getHours());
Stringmins=String.valueOf(Now.getMinutes());
Stringsecs=String.valueOf(Now.getSeconds());
%>
</HEAD>
<BODY>
现在是<%out.print(String.valueOf(Now.getHours()));%>小时
<%out.print(String.valueOf(Now.getMinutes()));%>分
<%out.print(String.valueOf(Now.getSeconds()));%>秒
</BODY>
</HTML>
在exception对象中处理异常
Exception对象用作处理JSP文件执行时发生的错误和异常
只有在错误页面里才可以使用
前提是:在页面指令里要有isErrorPage=true的页面中
如:<%@ page contentType="text/html;charset=gb2312"
isErrorPage="true"%>
则:在此页面中页面中便可使用exception内置对象
<%=exception.getMessage()%>
page对象
表示从该页面产生的一个Servlet实例
相当于这个JSP 产生Servlet类的this
可通过page对象访问实例的属性和函数
config对象
javax.servlet.ServletConfig对象
用于存取Servlet实例的初始化参数
常用方法
String getInitParameter( String name ):返回名称为name的初始参数
的值
Enumeration getInitParameters():返回这个JSP所有的初始参数的名
称集合
ServletContext getContext():返回执行者的Servlet上下文
String getServletName():返回Servlet的名称