JSP基本结构
JSP页面就是带有JSP元素的常规Web页面,由模板文本和JSP元素组成。在一个JSP页面中,所有非JSP元素的内容称为模板文本。模板文本可以是任何文本,如HTML、XML,甚至可以是纯文字。JSP并不依赖于HTML,它可以采用任何一种标记语言。模本文本直接传给浏览器。在处理一个JSP页面请求时,模板文本和JSP元素所生成的内容会合并,合并后的结果将作为响应内容发送给浏览器。
JSP有三种类型的元素:脚本元素(scripting element)、指令元素(directive element)、动作元素(action element)。
脚本元素
JSP脚本
脚本代码(scriptlet),就是JSP中的代码部分,在这个部分中几乎可以使用任何Java语法。
<% JSP 脚本 %>
<% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %>
上午好!
<% } else { %>
下午好!
<% > %>
在使用脚本元素时需要注意:如果加入了过多的Java代码,将会遇到与将HTML嵌入Servlet中同样的问题,不容易维护。
JSP表达式
JSP中的表达式可以被看作一种简单的输出形式,需要注意的是,表达式一定要有一个可以输出的值。
<% = 表达式 %>
<% = (new java.util.Date()).toLocaleString()) %> //这个函数貌似已经过期
JSP声明
JSP中的声明用于声明一个或多个变量和方法,并不输出任何的文本到输出流。在声明元素中的变量和方法将在JSP页面初始化时进行初始化。
放在<%! %>中的变量在编译时将作为类的属性而存在,而放在脚本中的变量将在类的方法内部被声明。
在Servlet的多个请求线程共享一个Servlet对象的机制下,Servlet的成员变量必须注意同步问题。
<%! JSP声明 %>
<%! int i = 0; %>
<%! public String f(int i) {
if (i < 1) {
return "...";
else
return "......";
}
%>
JSP注释
<%-- JSP注释 --%>
指令元素
JSP指令用来向JSP容器提供编译信息。指令并不向客户端产生任何输出,所有的指令都只在当前页面生效。
page指令
page指令描述了页面相关的信息,一般位于JSP页面的开头部分。在一个JSP页面中,page指令可以出现多次,但是在每个page指令中,每一种属性却只能出现一次,重复的属性设置将覆盖先前设置。
<% page 属性列表 %>
属性名 | 说明 |
language | 设定JSP页面使用的脚本语言,默认且目前只能使用Java |
import | 指定导入的Java包或类名列表,中间用逗号隔开 |
isThreadSafe | 指定JSP容器执行JSP程序的模式。默认值true,代表JSP容器会以多线程方式运行JSP页面;另一种false,JSP容器会以单线程方式运行页面 |
contentType | 指定MIME类型和JSP页面响应时的编码方式 |
pageEncoding | 指定JSP文件本身的编码方式 |
session | 指定JSP页面是否使用session对象,默认为true |
errorPage | 设定JSP页面发生异常时重新指向的页面URL,指向的页面文件要把isErrorPage设成true |
isErrorPage | 指定此页面是否为处理异常错误的网页,默认为false |
isELIgnored | 指定JSP页面是否忽略EL表达式,默认为false |
buffer | 指定输出流是否需要缓存,默认值是buffer="8kb",与autoFlush一起使用,确定是否自动刷新输出缓冲,如果设成true,则当输出缓冲区满的时候,刷新缓冲区而不是抛出异常 |
autoFlush | 如果页面缓冲区满时要自动刷新输出,设置为true,否则抛出异常 |
import属性
如同Java代码里的功能一样,可以简化代码
<% @page import = "java.util.*, com.util.DBUtil" %>
contentType属性
指定JSP输出内容的MIME类型和字符编码方式,默认值为:contentType=“text/html; charset=ISO-8859-1”(不支持中文)。改变MIME类型,可以实现一些特殊功能。例如,可以将输出内容指定为Word、Excel类型的文件,将二进制流生成图像。
<% @page contentType = "application/vnd.ms-excel; charset=utf-8" %>
include指令
include指令是在页面翻译期间引入另一个文件,被包含的文件可以是JSP、HTML或文本文件。可以多次使用。
此过程发生在将JSP翻译成Servlet时,当前JSP和被包含的文件会融合到一起形成一个Servlet,然后进行编译运行。此过程也成为“静态包含”。
<% @include file="header.jsp" %>
taglib指令
taglib用于指定JSP页面所使用的标签库,通过该指令可以在JSP页面中使用标签库的标签。之后细讲
<% @taglib uri = "标签库URI" prefix = "标签前缀" %>
动作元素
JSP中可以使用XML语法格式的一些特殊标记来控制行为,称为JSP标准动作。
<jsp:include>
在页面运行时引入一个静态或动态的页面,也称为动态包含。当容器把JSP页面翻译成Java文件时,并不会把JSP页面中动作指令include指定的文件与原JSP合并成新界面,而是告诉Java解释器,这个文件在运行时才被处理。如果是普通文本文件,就将文件的内容发送到客户端,由客户端负责显示,如果包含的文件是JSP文件,JSP容器就执行这个文件,将结果发送到客户端。(有点像发了个request请求)
<jsp:include page = "show.jsp" flush = "true">
<jsp:param name = "username" value = "123" />
<jsp:param name = "password" value = "123" />
</jsp:include>
flush表示设定是否自动刷新缓冲区,默认为false,可省略;在页面包含大量数据时,为缩短客户端延迟,可将一部分内容先行输出。
include指令和include动作做如下对比:
共同点:指令和动作的作用都是实现包含文件代码的复用
区别:对包含文件的处理方式和处理时间不同
include指令元素是在翻译阶段引入所包含的文件,被处理的文件在逻辑和语法上依赖于当前JSP页面,其优点是页面的执行速度快。
include动作元素是在JSP页面运行时才引入包含文件所产生的应答文本,被包含的文件在逻辑和语法上独立于当前JSP页面,优点是可以使用param子元素更加灵活地处理所需要的文件,缺点是执行速度要慢一些。
<jsp:forward>
用于引导客户端的请求到另一个页面或者另一个Servlet。可以包含一个或几个<jsp:param>子动作,用于向所转向的目标资源传递参数。<jsp:forward>功能和Servlet的RequestDispatcher对象的forward方法者和被调用者共享同一个request对象。
<jsp:forward page = "relativeURL"/>
或
<jsp:forward page = "relativeURL">
<jsp:param name = "username" value = "123"/>
...
</jsp:forward>
<jsp:useBean>
使用这个动作,JSP可以动态使用JavaBean组件来扩充JSP的功能,由于JavaBean在使用上简单明了,使得JSP开发动态网页有质的飞跃。
<jsp:useBean id="name" class="className" scope="page|request|session|application"/>
或
<jsp:useBean id="name" type="typeName" scope="page|request|session|application"/>
id指定该JavaBean实例的变量名,通过id可以访问这个实例
class指定JavaBean的类名,容器根据class指定的类调用其构造方法来创建这个类的实例
scope指定JavaBean的作用范围,可以使用上述参数,默认值为page
type指定JavaBean对象的类型,通常在查找已存在的JavaBean时使用,这时使用typeName将不会产生新的对象
<jsp:setProperty>
向JavaBean的属性赋值
<jsp:setProperty name="beanName" property="propertyName" value="propertyvalue"/>
或
<jsp:setProperty name="beanName" property="propertyName" param="propertyvalue"/>
name指定JavaBean对象名,与useBean动作中的id对应
property指定JavaBean中需要赋值的属性名
value指定要为属性设置的值
param指定请求中的参数名(如表单传值或URL传值),并将该参数的值赋给property所指定的属性
<jsp:getProperty>
从一个JavaBean中得到某个属性的值,不管原先这个属性是什么类型的,都将被转换成一个String类型的值
<jsp:getProperty name="beanName" property="propertyName"/>
第一次博客记笔记,有点紧张