300 likes | 414 Views
J2EE —— 第 12 章 Java Serer Pages 技术. JavaServer Pages 技术. 主要特性 开发 JSP 页面的语言 访问服务器端对象的表达式语言 定义 JSP 语言扩展的机制 供 Web 容器开发人员使用的 API JSP 页面 静态数据 (HTML, SVG, WML, XML) JSP 元素 ( 用于构造动态内容 , 标准、 XML 语法 ). JSP 示例 (1). <%@ page contentType="text/html; charset=UTF-8" %>
E N D
JavaServer Pages技术 • 主要特性 • 开发JSP页面的语言 • 访问服务器端对象的表达式语言 • 定义JSP语言扩展的机制 • 供Web容器开发人员使用的API • JSP页面 • 静态数据(HTML, SVG, WML, XML) • JSP元素(用于构造动态内容,标准、XML语法)
JSP示例(1) <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="/functions" prefix="f" %> <html> <head><title>Localized Dates</title></head> <body bgcolor="white"> <jsp:useBean id="locales" scope="application“ class="mypkg.MyLocales"/> <form name="localeForm" action="index.jsp" method="post"> <c:set var="selectedLocaleString" value="${param.locale}" /> <c:set var="selectedFlag" value="${!empty selectedLocaleString}" /> <b>Locale:</b>
JSP示例(2) <select name=locale> <c:forEach var="localeString" items="${locales.localeNames}" > <c:choose><c:when test="${selectedFlag}"> <c:choose> <c:when test="${f:equals(selectedLocaleString,localeString)}"> <option selected>${localeString}</option> </c:when> <c:otherwise> <option>${localeString}</option></c:otherwise> </c:choose> </c:when><c:otherwise><option>${localeString}</option></c:otherwise> </c:choose></c:forEach> </select> <input type="submit" name="Submit" value="Get Date"> </form> <c:if test="${selectedFlag}" > <jsp:setProperty name="locales" property="selectedLocaleString" value="${selectedLocaleString}" /> <jsp:useBean id="date" class="mypkg.MyDate"/> <jsp:setProperty name="date" property="locale" value="${locales.selectedLocale}"/> <b>Date: </b>${date.date}</c:if></body></html>
JavaServer Pages Standard Tag Library • 流程控制 • c:if、c:choose、c:when、c:otherwise • 设置作用域变量 • c:set • 编码URL • c:url • 提供地区敏感的消息、编号和日期 • fmt:message、fmt:formatNumber • fmt:formatDate
JSP页面的生命周期 • 如果servlet更旧,则将jsp转换为servlet并编译 • 静态数据:可将该数据发送到响应流中的代码 • JSP元素 • 指令:控制Web控制器如何转换和执行JSP页面 • 表达式:作为参数传递到JSP表达式计算器的调用 • jsp:[set|get]Property:到JavaBeans组件的调用 • jsp:[include|forward]:到Java Servlet API的调用 • jsp:plugin:转换为激活applet的浏览器特定标记 • 自定义标签:到实现自定义标签的标签处理器调用
转换和编译后的生命周期 • 如果JSP页面的servlet的实例不存在,则容器将 • 加载JSP页面的servlet类 • 实例化servlet类,生成一个实例 • 通过调用jspInit方法初始化servlet实例 • 容器调用_jspService方法,传递request和response对象 • 如果容器需要删除JSP页面的servlet,则调用jspDestroy方法
页面指令--缓冲 • <%@ page buffer=“none|xxxkb” %> • 大的缓冲区允许在实际发回客户端前编写更多的内容,从而使JSP页面有更多的时间来设置适当的状态代码和标题,或者转发到另外的Web资源 • 小的缓冲区将降低服务器内存的加载量,使客户端更快地启动接收数据的操作
页面指令--处理错误 • <%@ page errorPage=“file_name” %> <%@ page isErrorPage="true" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <html><head><title><fmt:message key="ServerError"/></title></head> <body bgcolor="white"><h3><fmt:message key="ServerError"/></h3> ${pageContext.errorData.throwable}<c:choose> <c:when test="${!empty pageContext.errorData.throwable.cause}"> : ${pageContext.errorData.throwable.cause} </c:when> <c:when test="${!empty pageContext.errorData.throwable.rootCause}"> : ${pageContext.errorData.throwable.rootCause} </c:when></c:choose></body></html>
创建静态内容和动态内容 • <%@ page contentType="text/vnd.wap.wml"%> • <%@ page contentType="text/html; charset=UTF-8" %> • 在JSP页面中使用对象 • 隐含对象:page,request,session,application • 应用程序特定对象:JSP标准标签、脚本元素 • 共享对象 • <%@ page isThreadSafe="true|false" %> • 正确同步page级别定义的所有共享对象的访问 • 声明、page作用域的JavaBean和pageContext
表达式语言 <c:if test="${sessionScope.cart.numberOfItems > 0}"> ... </c:if> <c:if test="${bean1.a < 3}">...</c:if> <c:if test="true">...</c:if> <mytags:example attr1="an expression is ${'${'}true}" /> <%@ page isELIgnored ="true|false" %> • EL表达式可用于 • 静态文本 • 可以接受表达式的任何标签属性 <some:tag value="${expr}"/> <some:tag value="some${expr}${expr}text${expr}"/> <some:tag value="sometext"/>
变量 • PageContext.findAttribute(String) • ${product}:page,request,session,application等scope • expr-a.expr-b等价于expr-a[expr-b] • 隐含对象 • PageContext: servletContext, session, request, response • param, paramValues, header, headerValues, cookie, initParam • pageScope, requestScope, sessionScope, applicationScope
常量 • true, false • java整数 • java浮点数 • 字符串:”或’ 转义:\ • null
运算符 • +、-、*、/、div、%、mod • and、&&、or、||、not、! • ==、eq、!=、ne、<、lt、>、gt、<=、le、>=、ge • empty • A?B:C • 保留字:以上、instanceof
函数 <%@ taglib prefix="f" uri="/functions"%> ... <c:when test="${f:equals(selectedLocaleString, localeString)}" > package mypkg; public class MyLocales { ... public static boolean equals( String l1, String l2 ) { return l1.equals(l2); } } functions.tld: <function> <name>equals</name> <function-class>mypkg.MyLocales</function-class> <function-signature>boolean equals( java.lang.String, java.lang.String )</function-signature> </function>
JavaBeans组件 • 可重用的Java类,符合特定的设计约定 • 组件属性 • 读/写、只读、只写 • 简单属性(单个值),或索引属性(值数组) • PropertyClass getProperty() {…} • setProperty(PropertyClass pc) {…}
创建和使用JavaBeans组件 <jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"/> <jsp:useBean id="beanName" class="fully_qualified_classname" scope="scope"> <jsp:setProperty … /> </jsp:useBean> <jsp:useBean id="locales" scope="application" class="mypkg.MyLocales"/>
设置JavaBeans组件属性 <jsp:setProperty name="beanName" property="propName" value="stringconstant"/> <jsp:setProperty name="beanName" property="propName" param="paramName"/> <jsp:setProperty name="beanName" property="propName"/> <jsp:setProperty name="beanName" property="*"/> <jsp:setProperty name="beanName" property="propName" value="expression"/> <jsp:setProperty name="beanName" property="propName" > <jsp:attribute name="value">expression</jsp:attribute> </jsp:setProperty> • beanName必须是在useBean元素中为id属性指定的那一个 • 在JavaBeans组件中,setPropertyName方法必须存在 • paramName必须是参数名称
设置JavaBeans组件属性(示例) <c:set var="bid" value="${param.bookId}"/> <jsp:setProperty name="bookDB" property="bookId" value="${bid}" /> <jsp:useBean id="bookDB" class="database.BookDB" scope="page"> <jsp:setProperty name="bookDB" property="database" value="${bookDBAO}" /> </jsp:useBean> • 检索JavaBeans组件属性 ${bookDB.bookDetails.title} <jsp:getProperty name="beanName" property="propName"/>
使用自定义标签 <prefix:tag attr1="value" ... attrN="value" /> <prefix:tag attr1="value" ... attrN="value" > body</prefix:tag> <%@ taglib prefix="tt" [tagdir=/WEB-INF/tags/dir | uri=URI ]%> <%@ taglib prefix="tlt" uri="/WEB-INF/iterator.tld"%> <%@ taglib prefix="tlt" uri="/tlt"%> • 标签文件.tag和标签库描述符文件.tld • 绝对URI Core: http://java.sun.com/jsp/jstl/core XML: http://java.sun.com/jsp/jstl/xml Internationalization: http://java.sun.com/jsp/jstl/fmt SQL: http://java.sun.com/jsp/jstl/sql Functions: http://java.sun.com/jsp/jstl/functions
包括标签库实现 • 标签文件:/WEB-INF/tag • 标签处理器类:/WEB-INF/classes • 打包的标签库:/WEB-INF/lib • <J2EE_HOME>/lib/appserv-jstl.jar • 在JSP页面中重用内容 • 静态包含<%@ include file="filename" %> <%@ include file="banner.jspf" %> • 动态包含<jsp:include page="includedPage" /> <jsp:include page="response.jsp"/>
将控制转移到另一Web组件 <jsp:forward page="/main.jsp" /> <jsp:include page="..." > <jsp:param name="param1" value="value1"/> </jsp:include> A=foo A=bar A=bar,foo
包括小程序 <jsp:plugin type="applet" code="DigitalClock.class" codebase="/bookstore2" jreversion="1.4" align="center" height="25" width="300" nspluginurl="http://java.sun.com/j2se/1.4.2/download.html" iepluginurl="http://java.sun.com/j2se/1.4.2/download.html" > <jsp:params> <jsp:param name="language" value="${pageContext.request.locale.language}" /> <jsp:param name="country" value="${pageContext.request.locale.country}" /> <jsp:param name="bgcolor" value="FFFFFF" /> <jsp:param name="fgcolor" value="CC0066" /></jsp:params> <jsp:fallback><p>Unable to start plugin.</p></jsp:fallback> </jsp:plugin>
设置JSP页面组的属性 • isELIgnoreed • deploytool,页面指令,标签文件指令 • pageEncoding(不一致导致错误) • deploytool,页面指令 • 定义隐式包含 • deploytool • preludes and codas