JSP页面标签

一、JSP 指令

JSP 指令(directive)影响由 JSP 页面生成的 servlet 的整体结构。下面的模板给出指令的两种可能形式。属性值两边的双引号可以替换为单引号,但引号标记不能完全省略。如果要在属性值中使用引号,则要在它们之前添加反斜杠,' 使用 \'," 使用 \"

<% directive attribute="value" %>
<% directive attribute1="value1"
attribute2="value2"
......
attribute3="value3" %>

在 JSP 中,主要有3种类型的指令:page,include 和 taglib。page 指令允许通过类的导入、servlet 超类的定制、内容类型的设置、以及诸如此类的事物来控制 servlet 的结构。page 指令可以放在文档中的任何地方。第二个指令,include 允许在 JSP 文件转换到 servlet 时,将一个文件插入到 JSP 页面中。include 指令应该放 置在文档中希望插入文件的地方。第三个指令,taglib,定义自 定义的标记标签。

二、JSP page 指令

page 指令可以定义下面这些大小写敏感的属性(大致按照使用的频率列出):import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。

2.1 import 属性

使用 page 指令的 import 属性指定 JSP 页面转换成的 servlet 应该输入的包。在 JSP 中,包是绝对必需的。原因是,如果没有使用包,系统则认为所引用的类与当前类在同一个包中。例如,假定一个 JSP 页面包含下面的 scriptlet:

<% Test t=new Test(); %>

在此,如果 Test 在某个输入包中,则没有歧义。但是,如果 Test 不在包中,或者页面没有明确地导入 Test 所属的包,那么系统将会认为 Test 就在这个自动生成的 servlet 所在的包中。但问题是自动生成的 servlet 所在的包是未知的!服务器在创建 servlet 时,常常会根据 JSP 页面所在的目录来决定它的包。别的服务器可能使用其他不同的方式。因此,不能指望不使用包的类能够正常工作。对于 bean 也同样如此,因为 bean 不过是遵循某些简单命名约定和结构约定的类。

 默认情况下,servlet 导入 java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*,也许还包括一些服务器特有的包。编写 JSP 代码时,绝不要依靠任何自动导入的服务器特有类。这样做会使得代码不可移植。

使用 import 属性时,可以采用下面两种形式:

<%@ page import="package.class" %>
<%@ page import="package.class1, ..., package.classN" %>

例如,下面的指令表示 java.util 包和 cn.foololdfat 包中的所有类在使用时无需给出明确的包标识符:

<%@ page import="java.uti1.*, cn.foololdfat.*" %>

 import 是 page 的属性中惟一允许在同一文档中多次出现的属性。尽管 page 指令可以出现在文档中的任何地方,但一般不是将 import 语句放在文档顶部附近,就是放在相应的包首次使用之前。

2.2 contentType 和 pageEncoding 属性

 contentType 属性设置 Content-Type 响应报头,标明即将发送到客户程序的文档的 MIME 类型。有关MIME 类型的更多信息,参见Java Web 开发 (5) HTTP 响应报头

使用 contentType 属性时,可以采用下面两种形式:

<%@ page contentType="MIME-TYPE" %>
<%@ page contentType="MIME-Type; charset=Character-Set" %>

例如,指令

<%@ page contentType="application/vnd.ms-excel" %>

和下面的 scriptlet 所起到的作用基木相同

<% responce.setContentType("application/vnd.ms-excel"); %>

两种形式的第一点不同是,response.setContentType 使用明确的 Java 代码(这是一些开发人员力图避免使用的方式),而 page 指令只用到 JSP 语法。第二点不同是,指令被特殊处理,它们不是在出现的位置直接成为 _jspService 代码。这意味着 response.setContentType 能够有条件地调用,而 page 指令不能。条件性地设置内容的类型主要用在同一内容能够以多种不同的形式进行显示的情况下。

 不同于常规 servlet (默认的 MIME 类型为 text/plain),JSP 页面的默认 MIME 类型是 text/html (默认字符集为 ISO-8859-1)。因此,如果 JSP 页曲以 Latin 字符集输出 HTML则根本无需使用 contentType,如果希望同时更改内容的类型和字符集,可以使用下面的语句:

<%@ page contentType="someMimeType; charset=someCharacterSet" %>

但是,如果只想更改字符集,使用 pageEncoding 属性更为简单。例如,中文 JSP 页面可以使用下面的语句:

<%@ page pageEncoding="GBK" %>

可考虑将Java Web 开发 (5) HTTP 响应报头中生成 Excel 表格的例子用 JSP 实现,以体会 contentType 的作用。

2.3 session 属性

session 属性控制页面是否参与 HTTP 会话。使用这个属性时,可以采用下面两种形式:

<%@ page session="true" %> <%--Default--%>
<%@ page session="false" %>

true 值(默认)表示,如果存在已有会话,则预定义变量 session (类型为HttpSession)应该绑定到现有的会话;否则,创建新的会话并将其绑定到 session。false 值表示不自动创建会话,在 JSP 页面转换成 servlet 时,对变量 session 的访问会导致错误。

对于高流量的网站,使用 session="false" 可以节省大量的服务器内存。但要注意,session="false" 并不禁用会话跟踪,它只是阻止 JSP 页面为那些尚不拥有会话的用户创建新的会话。由于会话是针对用户,不是针对贞面,所以,关闭某个页面的会话跟踪没有任何益处,除非有可能在同一客户会话中访问到的相关页面都关闭会话跟踪。

2.4 isELIgnored 属性

isELIgnored 属性控制的是:忽略(true)JSP 2.0 表达式语言(EL),还是进行正常的求值(false)。这是 JSP 2.0 新引入的属性;在只支持 JSP 1.2 及早期版本的服务器中,使用这项属性是不合法的。这个属性的默认值依赖于 Web 应用所使用的 web.xml 的版本。如果 web.xml 指定 servlet 2.3(对应JSP 1.2)或更早版本,默认值为 true(但变更默认值依旧是合法的,JSP 2.0 兼容的服务器中都允许使用这项属性,不管 web.xml 的版本如何)。如果 web.xml 指定 servlet 2.4(对应 JSP 2.0)或之后的版本,那么默认值为false。使用这个属性时,可以采用下面两种形式:

<%@ page isELIgnored="false" %>
<%@ page isELIgnored="true" %>

2.5 buffer 和 autoFlush 属性

buffer 属性指定 out 变量(类型为 JspWriter )使用的缓冲区的大小。使用这个属性时,可以采用下面两种形式:

<%@ page buffer="sizekb" %>
<%@ page buffer="none" %>

服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。例如,<%@ page buffer="32kb" %> 表示应该对文档的内容进行缓存,除非累积至少为32KB、页面完成或明确地对输出执行清空(例如使用 response. flushBuffer),否则不将文档发送给客户。

默认的缓冲区大小与服务器相关,但至少8KB。如果要将缓冲功能关闭,应该十分小心:这样做要求设置报头或状态代码的 JSP 元素都要出现在文件的顶部,位于任何 HTML 内容之前。另一方面,有时输出内容的每一行都需要较长的生成时间,此时禁用缓冲或使用小缓冲区会更有效率;这样,用户能够在每一行生成之后立即看到它们,而不是等待更长的时间看到成组的行。

 autoFlush 属性控制当缓冲区充满之后,是应该自动清空输出缓冲区(默认),还是在缓冲区溢出后抛出一个异常(autoFlush="false")。使用这个属性时,可以采用下面两种形式:

<%@ page autoFlush="true" %> <%--Default--%>
<%@ page autoFlush="false" %>

在 buffer="none" 时,false 值是不合法的。如果客户程序是常规的 Web 浏览器,那么 autoFlush="false" 的使用极为罕见。但是,如果客户程序是定制应用程序,可能希望确保应用程序要么接收到完整的消息,要么根本没有消息。false 值还可以用来捕获产生过多数据的数据库查询,但是,一般说来,将这些逻辑放在数据访问代码中(而非表示代码)要更好一些。

2.6 info 属性

info 属性定义一个可以在 servlet 中通过 getServletInfo 方法获取的字符串,使用 info 属性时,采用下面的形式:

<%@ page info="Some Message" %>

2.7 errorPage 和 isErrorPage 属性

errorPage 属性用来指定一个 JSP 页面,由该页面来处理当前页面中抛出但未被捕获的任何异常(即类型为 Throwable 的对象)。它的应用方式如下:

<%@ page errorPaqe="Relative URL" %>

指定的错误页面可以通过 exception 变量访问抛出的异常。

isErrorPage 属性表示当前页是否可以作为其他 JSP 页面的错误页面。使用 isErrorPage 属性时,可以采用下面两种形式:

<%@ page isErrorPage="true" %>
<%@ page isErrorPage="false" %> <%--Default--%>

2.8 isThreadSafe 属性

 isThreadSafe 属性控制由 JSP 页面生成的 servlet 是允许并行访问(默认),还是同一时间不允许多个请求访问单个 servlet 实例(isThreadSafe="false")。使用 isThreadSafe 属性时,可以采用下面两种形式:

<%@ page isThreadSafe="true" %> <%--Default--%>
<%@page isThreadSafe="false" %>

遗憾的是,阻止并发访问的标准机制是实现 SingleThreadModel接口。尽管在早期推荐使用 SingleThreadModel 和 isThreadSafe="false",但最近的经验表明 SingleThreadModel 的设计很差,使得它基本土毫无用处。因而,应该避免使用 isThreadSafe,采用显式的同步措施取而代之。

2.9 extends 属性

extends 属性指定 JSP 页面所生成的 servlet 的超类(superclass )。它采用下面的形式:

<%@ page extends="package.class" %>

这个属性一般为开发人员或提供商保留,由他们对页面的运作方式做出根本性的改变(如添加个性化特性)。一般人应该避免使用这个属性,除非引用由服务器提供商专为这种目的提供的类。

2.10 language 属性

从某种角度讲,language 属性的作用是指定页面使用的脚本语言,如下所示:

<%@ page language="java" %>

就现在来说,由于 Java 既是默认选择,也是惟一合法的选择,所以没必要再去关心这个属性。

三、JSP include指令

3.1  include属性

include指令:在翻译阶段(将JSP页面转换成servlet的阶段),JSP的include指令会读入指定的页面中的内容,并将这些内容和原来的页面融合在一起。
   <%@ include file=”header.html”%>
 引入的页面可以只包含静态内容(例如HTML),也可以是一个普通的JSP页面。主页面和引入的页面融和在一起(引入的页面只是最为普通的文本进行融合,并不对动态内容求值),融合后的完整页面再被整体的转换为一个servlet。
 这意味着主页和被引入的页面共享所有的页面作用域数据。因此,如果主页面中声明了一个变量,而在某个被引入的页面中也声明了一个同名的变量,那么在翻译阶段将会造成一个错误,因为组合后的页面无法进行编译。
 include指令的一个常见用法是引入应用程序的所有页面都需要的公共声明。
 JSP规范建议在使用include指令引入JSP页面时,最好使用不同的文件扩展名,因为它们一般都不是完整而合法的页面,如:可以使用这些替代的文件扩展名:.jspf或 .jsf。
 被引用页面改变后,容器可能不会马上产生反应。

3.2  include属性

<jsp:include page=”navigation.jsp”/>
 这个指令是在请求处理阶段而不是在翻译阶段执行的。该行为并不是要引入指定页面的实际内容,它将引入执行该引入页面后所产生的应答,这意味着你可以指定任何能够产生文本应答的web资源。JSP容器将通过一个内部的函数调用来调用指定的资源。因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象,以及所有的请求参数。但是要注意,它不能访问任何页面作用域属性,或是在主页面中声明的脚步变量。
 <c:import>行为和<jsp:include>相同,另外它还可以从外部资源引入数据,比如不同的web应用程序,或者一个FTPfuwq。
  所以应该使用<c:import>来代替<jsp:include>的使用。
  被引用页面改变后,新版本会立即投入使用。

二、JSP标签

<jsp:forward>
重定向一个HTML文件,JSP文件,或者是一个程序段.
JSP 语法
<jsp:forward page={"relativeURL" | "<%= expression %>"} />
or
<jsp:forward page={"relativeURL" | "<%= expression %>"} >
       <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />
</jsp:forward>

例子
<jsp:forward page="/servlet/login" />
<jsp:forward page="/servlet/login">
<jsp:param name="username" value="jsmith" />
</jsp:forward>
描述
<jsp:forward>标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象.<jsp:forward>标签以下的代码,将不能执行.

你能够向目标文件传送参数和值,在这个例子中我们传递的参数名为username,值为scott,如果你使用了<jsp:param>标签的话,目标文件必须是一个动态的文件,能够处理参数.

如果你使用了非缓冲输出的话,那么使用<jsp:forward>时就要小心。如果在你使用<jsp:forward>之前,jsp文件已经有了数据,那么文件执行就会出错.

属性

page="{relativeURL | <%= expression %>}"
这里是一个表达式或是一个字符串用于说明你将要定向的文件或URL.这个文件可以是JSP,程序段,或者其它能够处理request对象的文件(如asp,cgi,php).

<jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" />+
向一个动态文件发送一个或多个参数,这个文件一定是动态文件.

如果你想传递多个参数,你可以在一个JSP文件中使用多个<jsp:param>。name指定参数名,value指定参数值.
 

注意

<jsp:forward>标签从一个JSP文件向另一个文件传递一个包含用户请求的request对象。<jsp:forward>标签以后的代码,将不能执行

<jsp:forward>例子(peixun2.9.jsp

<%@ page contentType="text/html;charset=gb2312" %>

<html>

       <head>

              <title>test</title>

       </head>

       <body>

              <jsp:forward page="forwardTo.jsp">

                     <jsp:param name="userName" value="Jason.D"/>

              </jsp:forward>

       </body>

</html>

forwardTo.jsp

<%@ page contentType="text/html;charset=gb2312" %>

<!--forwardTo.jsp-->

<%

       String useName=request.getParameter("userName");

       String outStr= "Welcome! ";

       outStr+=useName;

       out.println(outStr);

%>

 

逸语:

        该语句实现页面跳转,并可携带相关参数,浏览器地址栏数据不改变,不会显示参数信息(rewriting好像会显示),要实现选择性跳转需要借助expression语句进行控制,具体优劣有待研究. 






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值