熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

jsp Servlet中腳本元素、指令和預定義變量解析

2013-11-15 12:04:20  來源: JSP教程 

   JSP腳本元素

   JSP腳本元素用來插入Java代碼這些Java代碼將出現在由當前JSP頁面生成的Servlet中腳本元素有三種格式

表達式格式<%= expression %>計算表達式並輸出其結果
Scriptlet格式<% code %>把代碼插入到Servlet的service方法
聲明格式<%! code %>把聲明加入到Servlet類(在任何方法之外)
下面我們詳細說明它們的用法

JSP表達式

JSP表達式用來把Java數據直接插入到輸出其語法如下
<%= Java Expression %>

計算Java表達式得到的結果被轉換成字符串然後插入到頁面計算在運行時進行(頁面被請求時)因此可以訪問和請求有關的全部信息例如下面的代碼顯示頁面被請求的日期/時間
Current time: <%= new javautilDate() %>

為簡化這些表達式JSP預定義了一組可以直接使用的對象變量後面我們將詳細介紹這些隱含聲明的對象但對於JSP表達式來說最重要的幾個對象及其類型如下

requestHttpServletRequest;
responseHttpServletResponse;
session和request關聯的HttpSession
outPrintWriter(帶緩沖的版本JspWriter)用來把輸出發送到客戶端
下面是一個例子
Your hostname: <%= requestgetRemoteHost() %>

最後如果使用XML的話JSP表達式也可以寫成下面這種形式
 

<jsp:expression>
Java Expression
</jsp:expression>

  

請記住XML元素和HTML不一樣XML是大小寫敏感的因此務必使用小寫有關XML語法的說明請參見《XML教程 》

JSP Scriptlet

如果你要完成的任務比插入簡單的表達式更加復雜可以使用JSP ScriptletJSP Scriptlet允許你把任意的Java代碼插入ServletJSP Scriptlet語法如下
 

<% Java Code %>

  

和JSP表達式一樣Scriptlet也可以訪問所有預定義的變量例如如果你要向結果頁面輸出內容可以使用out變量
 

<%
String queryData = requestgetQueryString();
outprintln("Attached GET data: " + queryData);
%>
 

  
注意Scriptlet中的代碼將被照搬到Servlet內而Scriptlet前面和後面的靜態HTML(模板文本)將被轉換成println語句這就意味著Scriptlet內的Java語句並非一定要是完整的沒有關閉的塊將影響Scriptlet外的靜態HTML例如下面的JSP片斷混合了模板文本和Scriptlet
 

<% if (Mathrandom() < ) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>
 

  
上述JSP代碼將被轉換成如下Servlet代碼
 

if (Mathrandom() < ) {
outprintln("Have a <B>nice</B> day!");
} else {
outprintln("Have a <B>lousy</B> day!");
}

  

如果要在Scriptlet內部使用字符“%>”必須寫成“%\>”另外請注意<% code %>的XML等價表達是
<jsp:scriptlet>
Code
</jsp:scriptlet>

JSP聲明

JSP聲明用來定義插入Servlet類的方法和成員變量其語法如下
 

<%! Java Code %>
 

  
由於聲明不會有任何輸出因此它們往往和JSP表達式或Scriptlet結合在一起使用例如下面的JSP代碼片斷輸出自從服務器啟動(或Servlet類被改動並重新裝載以來)當前頁面被請求的次數
 

<%! private int accessCount = ; %>
 

  自從服務器啟動以來頁面訪問次數為
 

<%= ++accessCount %>
 

  
和Scriptlet一樣如果要使用字符串“%>”必須使用“%\>”代替最後<%! code %>的XML等價表達方式為
 

<jsp:declaration>
Code
</jsp:declaration>
 

  
  JSP指令

JSP指令影響Servlet類的整體結構它的語法一般如下
 

<%@ directive attribute="value" %>
 

  
另外也可以把同一指令的多個屬性結合起來例如
 

<%@ directive attribute="value"
attribute="value"

attributeN="valueN" %>
 

  
JSP指令分為兩種類型第一是page指令用來完成下面這類任務導入指定的類自定義Servlet的超類等等第二是include指令用來在JSP文件轉換成Servlet時引入其他文件JSP規范也提到了taglib指令其目的是讓JSP開發者能夠自己定義標記但JSP 不支持該指令有希望它將成為JSP 的主要改進之一

page指令

page指令的作用是定義下面一個或多個屬性這些屬性大小寫敏感

import="packageclass"或者import="packageclasspackageclassN"

用於指定導入哪些包例如<%@ page import="javautil*" %>import是唯一允許出現一次以上的屬性

contentType="MIMEType" 或contentType="MIMEType; charset=CharacterSet"

該屬性指定輸出的MIME類型默認是text/html例如下面這個指令
<%@ page contentType="text/plain" %>
和下面的Scriptlet效果相同
<% responsesetContentType("text/plain"); %>

isThreadSafe="true|false"

默認值true表明Servlet按照標准的方式處理即假定開發者已經同步對實例變量的訪問由單個Servlet實例同時地處理多個請求如果取值false表明Servlet應該實現SingleThreadModel請求或者是逐個進入或者多個並行的請求分別由不同的Servlet實例處理

session="true|false"

默認值true表明預定義變量session(類型為HttpSession)應該綁定到已有的會話如果不存在已有的會話則新建一個並綁定session變量如果取值false表明不會用到會話試圖訪問變量session將導致JSP轉換成Servlet時出錯

buffer="size kb|none"

該屬性指定JspWrite out的緩存大小默認值和服務器有關但至少應該是 KB

autoflush="true|false"

默認值true表明如果緩存已滿則刷新它autoflush很少取false值false值表示如果緩存已滿則拋出異常如果buffer="none"autoflush不能取false值

extends="packageclass"

該屬性指出將要生成的Servlet使用哪個超類使用該屬性應當十分小心因為服務器可能已經在用自定義的超類

info="message"

該屬性定義一個可以通過getServletInfo方法提取的字符串

errorPage="url"

該屬性指定一個JSP頁面所有未被當前頁面捕獲的異常均由該頁面處理

isErrorPage="true|false"

該屬性指示當前頁面是否可以作為另一JSP頁面的錯誤處理頁面默認值false

language="java"

該屬性用來指示所使用的語言目前沒有必要關注這個屬性因為默認的Java是當前唯一可用的語言
定義指令的XML語法為
 

<jsp:directivedirectiveType attribute=value />
 

  
例如下面這個指令
 

<%@ page import="javautil*" %>
 

  
它的XML等價表達是
 

<jsp:directivepage import="javautil*" />
 

  
include指令

include指令用於JSP頁面轉換成Servlet時引入其他文件該指令語法如下
 

<%@ include file="relative url" %>

  

這裡所指定的URL是和發出引用指令的JSP頁面相對的URL然而與通常意義上的相對URL一樣你可以利用以“/”開始的URL告訴系統把URL視為從Web服務器根目錄開始包含文件的內容也是JSP代碼即包含文件可以包含靜態HTML腳本元素JSP指令和動作

例如許多網站的每個頁面都有一個小小的導航條由於HTML框架存在不少問題導航條往往用頁面頂端或左邊的一個表格制作同一份HTML代碼重復出現在整個網站的每個頁面上include指令是實現該功能的非常理想的方法使用include指令開發者不必再把導航HTML代碼拷貝到每個文件中從而可以更輕松地完成維護工作

由於include指令是在JSP轉換成Servlet的時候引入文件因此如果導航條改變了所有使用該導航條的JSP頁面都必須重新轉換成Servlet如果導航條改動不頻繁而且你希望包含操作具有盡可能好的效率使用include指令是最好的選擇然而如果導航條改動非常頻繁你可以使用jsp:include動作jsp:include動作在出現對JSP頁面請求的時候才會引用指定的文件請參見本文後面的具體說明

實例腳本元素和指令的應用

下面是一個使用JSP表達式Scriptlet聲明指令的簡單例子
 

<!DOCTYPE HTML PUBLIC "//WC//DTD HTML Transitional//EN">
<HTML>
<HEAD>
<TITLE>JavaServer Pages</TITLE>
</HEAD>

<BODY BGCOLOR="#FDFE" TEXT="#" LINK="#EE"
VLINK="#AB" ALINK="#FF">
<CENTER>
<TABLE BORDER= BGCOLOR="#EF">
<TR><TH CLASS="TITLE">
JSP應用實例</TABLE>
</CENTER>
<P>
下面是一些利用各種JSP功能生成的動態內容:
<UL>
<LI><B>表達式</B><BR>
你的主機名: <%= requestgetRemoteHost() %>
<LI><B>JSP Scriptlet</B><BR>
<% outprintln("查詢字符串: " +
requestgetQueryString()); %>
<LI><B>聲明(和表達式)</B><BR>
<%! private int accessCount = ; %>
服務器啟動以來訪問次數: <%= ++accessCount %>
<LI><B>指令(和表達式)</B><BR>
<%@ page import = "javautil*" %>
當前日期: <%= new Date() %>
</UL>
</BODY>
</HTML>
 

  
  JSP預定義變量

為了簡化JSP表達式和Scriptlet的代碼JSP提供了個預先定義的變量(或稱為隱含對象)這些變量是requestresponseoutsessionapplicationconfigpageContext和page

request

這是和請求關聯的HttpServletRequest通過它可以查看請求參數(調用getParameter)請求類型(GETPOSTHEAD等)以及請求的HTTP頭(CookieReferer等)嚴格說來如果請求所用的是HTTP之外的其他協議request可以是ServletRequest的子類(而不是HttpServletRequest)但在實踐中幾乎不會用到

  response

這是和應答關聯的HttpServletResponse注意由於輸出流(參見下面的out)是帶緩沖的因此如果已經向客戶端發送了輸出內容普通Servlet不允許再設置HTTP狀態代碼但在JSP中卻是合法的

out

這是用來向客戶端發送內容的PrintWriter然而為了讓response對象更為實用out是帶緩存功能的PrintWriter即JspWriterJSP允許通過page指令的buffer屬性調整緩存的大小甚至允許關閉緩存

out一般只在Scriptlet內使用這是因為JSP表達式是自動發送到輸出流的很少需要顯式地引用out

  session

這是和請求關聯的HttpSession對象前面我們已經介紹過會話的自動創建我們知道即使不存在session引用這個對象也是自動綁定的但有一個例外這就是如果你用page指令的session屬性關閉了會話此時對session變量的引用將導致JSP頁面轉換成Servlet時出錯

  application

這是一個ServletContext也可以通過getServletConfig()getContext()獲得

config

這是當前頁面的ServletConfig對象

pageContext

主要用來管理頁面的屬性

  page

它是this的同義詞當前用處不大它是為了Java不再是唯一的JSP編程語言而准備的占位符
 


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20215.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.