v 基本概念
Ø Jsp是一种用来开发含有动态内容网页的技术。
动态内容:可以根据任意变量改变网页自身的内容。
Ø Jsp页面包含标准的标记语言元素,入HTML标签,也包含特殊的Jsp元素。这些元素使
得服务器可以把动态内容插入到网页中。
当用户请求一个Jsp页面时,服务器先执行Jsp元素,并把结果同网页的静态部分向结
合,然后把动态合成的页面送回到浏览器。
浏览器 服务器
<html> <html>
<body> <body>
动态内容 Jsp元素
</body> </body>
</html> </html>
Ø Jsp允许将特殊的元素嵌入HTML页面中,这些元素看起来和HTML元素类似,但它们实际上是组件化的Java程序。
ØJsp页面在有服务器进行处理前通常会得到编译。一次编译后,随后的请求会直接调用编译后的结果代码。
Ø 对于web应用程序中的页面,如果路径是以斜线开始的,容器会将其解释为环境相关的路径(从应用程序安装目录根部开始的文件路径)
Øweb application的目的是利用你当前拥有的任何一种设备(pc、pda),取得所需要的所有信息和服务,要做到这一点,就必须详细的规定客户端和服务器直接的通信协议,这正是HTTP的目的。
HTTP所定义的通信模型是所有web application设计的基础。
ØHTTP 请求/应答模型:一个客户端为了得到服务器上的一种资源而向服务器发出一个请求,服务器则返回一个与所请求相对应的应答。
i) HTTP是一种无状态的协议,即服务器发送应答后,不会保留客户端的任何信息,因此已经无法分辨来自同一个客户端的多个请求肯相同(session、cookie的出现)。
ii) Web application无法提供即时反馈,客户端和服务器的每一次交换都需要一次请求/应答。(JavaScript的出现)
iii) HTTP中不包含任何服务器端调用客户端特有函数的方法,也没有信息告诉服务器一个请求是如何产生的。
Ø 用户单击网页上的一个链接,提交一个表单、或在浏览器的地址栏中输入一个Web地址,
用户就相服务器发送了一个请求。
为了知道和哪个服务器进行通信,需要用HTTP URL来指定。如:
http://www.google.com:8080/index.html
表明请求需要HTTP协议,www.google.com是服务器名称、8080是web服务器等待从
每个特定的TCP/IP端口进入的请求(标准端口80不需要在URL中指定),index.html
确定了客户端所请求的资源。
Ø URI不必对应服务器上的某个静态文件,它可以标识一个可执行程序,数据库中的一条记录等,事实上没有办法知道/index.html直观URI所对应的是一个文件还是什么东西,它只是一个名称,这就是为什么使用通称“资源”的原因。经过配置,web服务器可以把名称和资源对应起来。
Ø 对应浏览器而言,请求的处理方式无关紧要,它所关心的只是要得到一个应答。
Ø 请求参数可以用两种方式来发送
i) 以请求字符串的形式发送(get,查询字符串以’?’号开始,’&’号分隔名称/值对组成,这些名称/值对必须经过URL编码,编码方式为16进制的ASCII码,即非字母是数字的特殊符合都要经过编码,以免和URI中的其他组成部分混淆)。
对于get方法,浏览器可以硬编码URL作为书签保存,应答将被保存在浏览器客户端,这样再次发送一次geg请求的话,不会造成任何的破坏。而post方法则不容易做到这点。
ii) 作为请求消息主体的一部分发送(post)
● Jsp页面分析
i) 页面中任何不是JSP元素的东西都叫做模板文本,模板文本可以是任何文本:HTML、XML等,模板文本一般直接传送到浏览器。
ii) 在处理一个JSP页面请求时,模板文本将和JSP元素产生的动态内容组合起来,组合的结果将作为应答发送个浏览器。
iii) 服务器执行JSP时首先转换为servlet,所有的模板文本被转换为println()语句,所有的JSP元素都被实现为相应的Java代码,然后容器再编译servlet.
Ø JSP有3中类型的元素
i) 指令元素:指定关于页面本身的一些信息,这些信息在各个页面请求间保持不变。如<%@ page…%><%@ include…%> <%@ taglib…%>,指令元素只在翻译阶段执行。
ii) 行为元素:在浏览器请求JSP页面时,根据它所需要的信息来执行某些动作。包括标准行为元素(<jsp:usebean>),自定义行为元素和JSP标准标记库(JSTL),
行为元素是在运行时执行的动态行为。所有标准行为元素都是有规范定义的,因此不需要用taglib指令声明标准行为。
当web应用程序启动时,容器会自动扫描整个WEB-INF目录结构,查找带有.tld扩展名的文件(这是TLD文件必须的扩展名),以及在它们的META-INF目录中含有扩展名.tld的文件。换句话说,就是容器会查找所有TLD文件。tag引用的URL不必是现有的网页,它只是一个标示符。容器并不会试图通过Internet来访问它。
<%taglib prefix=”ora” uri=”orataglib”%> <taglib>
… … <uri>orataglib</uri>
<ora:motd category=”thoughts”/> <tag>
<name>motd</name>
<tag-class>
Com.ora.tags.MotdTag
</tag-class>
</taglib>
对于行为指令,容器对待属性值与对待bean属性值一样,都会同样做类型转换。
iii) 脚本元素:添加到页面的小段代码(一般为Java代码),现已不提倡使用。
Ø web application中MVC分为:商业逻辑(模型)、外观呈现(视图)和请求处理(控制)。
ØJSP元素和属性名是区分大小写的。
Ø 用户在表单文本框输入的值、单选按钮、复选框选择后,这些值会作为请求中的HTTP
请求参数发送出去。
Ø MIME类型,HTML->text/html; XML->text/xml;PDA: ->Text/vnd.wap.wml。
Content-type作为应答首部发送给浏览器,因此浏览器知道如何解释和显示该页面。
v JavaBeans
Ø bean:遵循某些编码约定的Java类,作为组件被使用。
i) 应该始终为bean类使用包名称,从而可以容易地以可移植的方式使用JSP页面中的bean。
ii) Bean类必须使用无参数的构造函数,这样允许工具以只知道类名的方式创建bean.
iii) Bean的属性是通过getter和setter方法访问的。
iv) Bean类应该实现java.io.Serializable或java.io.Externalizable,以允许工具保存和恢复bean的状态。
v) Bean属性名区分大小写,而且总是以小写字母开头。
vi) Bean的属性可以是任何Java类型,容器可以在文本字符串和其他Java类型之间自动转换。
当使用<jsp:setProperty>行为时,容器会将文本值自动转换为具体的Java类型。
当使用<jsp:getProerty>或<c:out>时,容器会自动将Java类型转换为String类型。
Ø 例:
<jsp:useBean id=”cartoon”
Class=”com.ora.jsp.CartoonBean”/>
<img src=”images/<jsp:getProperty name=”cartoon” property=”fileName”/>”>
Ø <jsp:setProperty name=”cartoon” property=”fileName” value=”aaa.gif”/>
该行为可以根据请求参数值来设置bean的属性。
<jsp:setProperty name=”userInfo” property=”*”/>
它将把所有bean的属性都自动设为对于参数的值,
Ø<jsp:setProperty name=”userInfo” property=”username” param=”someOtherParam”/>
这里可以利用param属性将bean的值设为任何请求参数的值。
Ø 以上<img>不是合法的HTML语法,但却是合法的JSP语法。不被认为是JSP元素的任
何东西都被看作是模板文本,模板不会取解释模板文本的含义,因此它不会将其视为无
效的HTML。但这并不是说可以使用行为元素设置另一个JSP行为元素属性的值,只
有容器不把HTML元素看作是一种元素时,才使用它来设置HTML元素的属性。
Ø 当JSP页面得到处理时,会用bean的属性值代替行为元素,因此发送给浏览器的结果是:
<img src=”images/dilbert237.gif”/>
Ø <jsp:useBean>行为会创建由class属性指定的bean类的一个实例,并将其与id属性指定的名称关联起来,该名称在网页中必须时唯一的。
Ø <jsp:getProperty name=”cartoon” property=”fileName”/>
该行为将取得bean的当前属性值,并把该值插入大应答的主体中。
v JSTL
库 URI 前缀
Core http://java.sun.com/jstl/core c
XML processing http://java.sun.com/jstl/xml x
I18N formation http://java.sun.com/jstl/fmt fmt
Database access http://java.sun.com/jstl/sql sql
Ø JSTL定义了简单的表达式语言(EL),用于将行为属性设为在运行时计算出来的动态值。
EL表达式以“${”符开始,以”}”符结尾
Ø 表达式语言操作符:
操作符 执行的操作
. 访问bean的属性或Map条目
[] 访问数组或List元素
() 将子表达式分组以改变操作优先级
+-*/ 数学运算
Empty 对空的变量值(null)或空的String、数组、map、list进行测试
EL语言的empty操作符避免了被迫出来null值和空字符串(“”)之间的差异。Empty
还可以为空的数组、java.urit.List或java.util.Map求值,也就是说它可以用来测试多数常见类型的空的集合。
Ø 隐含的EL变量
变量名 描述
pageScope 所有页面作用域变量的集合(java.util.Map)
requestScope 所有请求作用域变量的集合(java.util.Map)
SessionScope 所有会话作用域变量的集合(java.util.Map)
applicationScope 所有应用程序作用域变量的集合(java.util.Map)
param 所有请求参数的集合,每个参数是单个的String(java.util.Map)
paramvalues
header
headerValues
cookie
initParam 所有应用程序初始化请求参数的集合,每个参数是单个的String
(java.util.Map)
pageContext javax.servlet.jsp.PageContext类的一个实例,提供了对各种请求数据的访
问。
例:<c:out value=”${param.userName}”/>
Ø<c:out>: 把指定为value属性的表达式的结果添加到应答中。
Ø JSTL表达式语言(EL)也支持对bean属性的访问。
<jsp:useBean id=”cartoon”
Class=”com.ora.jsp.CartoonBean”/>
<img src=”images/<c:out value=${cartoon.fileName}>”>
Ø <c:out>
属性名:escapeXml 如果URL编码则true,如果不URL编码则false,默认为true,(可选)
Default:可选,如果值属性为空时使用(可选)
<c:out>在输出时会自动地作URL编码转换
Ø <c:forEach>
属性名: itmes:反复迭代的集合,如果为Null,则不会执行迭代,如果没有指定,则必须指
定开始和结束属性。,(可选)
Var: 迭代时当前元素值,(可选)
varStatus:保存LoopTagStatus对象变量(可选)
begin:第一个索引,该索引从0开始(可选)
end: 最后一个索引,该索引从0开始(可选)
step:每次迭代的索引增量(可选)
例:<c:forEach begin=”1” end=”6”>
… …
</c:forEach>
<c:if>
属性名 描述
Test 判断表达式(必须)
Var 保存boolean结果的变量名称(可选)
Scope 变量作用域,默认为page作用域(可选)
Ø <c:when>
属性名 描述
Test 判断表达式(必须)
<c:choose>会从一组相关的互斥选项中选择一个
例:
<c:choose>
<c:when test=”${param.gender == ‘f’}”>
… …
</c:wher>
<c:otherwise>
… …
</c:otherwise>
</c:choose>
Ø <c:set>
属性名 描述
Value 要设置的值,(必须)
Var 保存值的变量的名称(可选),如果没有指定,就必须使用target和property属性。
Scope var指定的变量的作用域,默认为page作用域
Target 带有property指定的属性的Map或JavaBeans对象(可选)
Property 设置target指定的对象的属性名(可选)