J2EE——第12章JavaSerer Pages技术
JavaServer Pages技术 主要特性 JSP页面 开发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>
JSP示例(3)
MVC体系结构 模型 系统的内部状态 可以改变状态的操作(事务逻辑) 视图 提供可交互的界面,向用户显示模型数据 控制器 响应客户的请求,根据客户的请求来操纵模型,并把模型的响应结果用视图显示个客户
Struts MVC示意图
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的实例不存在,则容器将 通过调用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>
创建静态内容和动态内容 在JSP页面中使用对象 隐含对象:page,request,session,application <%@ 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
表达式语言 EL表达式可用于 静态文本 可以接受表达式的任何标签属性 <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
示例(1)
示例(2)
示例(3)
函数 functions.tld: <%@ 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"/> 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="string constant"/> <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组件属性(示例) 检索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"/>
使用自定义标签 标签文件.tag和标签库描述符文件.tld 绝对URI <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 pageEncoding(不一致导致错误) 定义隐式包含 deploytool,页面指令,标签文件指令 pageEncoding(不一致导致错误) deploytool,页面指令 定义隐式包含 deploytool preludes and codas