一、JSP簡介
JSP (Java Server Pages)是伺服器端的腳本語言,是一種在HTML頁面中加入Java語言而產生動態頁面的技術:加入了新的標籤(<%,%>,…)。
JSP是以Java和Servlet為基礎開發而成的動態網頁生成技術,它的底層實作是Java Servlet。
JSP頁面由HTML程式碼和嵌入其中的Java程式碼所組成。伺服器在頁面被客戶端所請求以後對這些Java程式碼進行處理,然後將產生的HTML頁面傳回給客戶端的瀏覽器。
二、JSP的執行過程客戶端請求JSP頁面->JSP Parser解析*.jsp編譯為*.java->javac指令編譯成*.class->執行class檔案->回應回傳結果給客戶端
JSP程式碼中包含JSP元素和Template data兩類。 Template data指的是JSP引擎不處理的部分,就是JSP引擎會把除在標記<%...%>以外的部分直接傳遞出去而不進行任何處理。
JSP在第一次或修改JSP檔後執行都會呼叫JSP Parser將*.jsp檔編譯成servlet程序,所以會比較慢。
三、JSP基本文法
1. 兩種註釋類型
(1)HTML註解可以在JSP程式碼中加入一段HTML格式的註釋,此註解發生到客戶端,但不在頁面上顯示,語法如下:
<!-- HTML格式的註釋,在客戶端查看原始程式碼時可見-->
<!-- 此註解由<%=programmer%>新增-->
如果programmer為hackiller,則在客戶端傳回的註解是<!-- 此註解由hackiller新增-->
(2)JSP註解寫在JSP程式碼中,但不傳送到客戶端。
<%-- JSP註釋,該註解會在JSP編譯時被忽略掉--%>
<%-- /*Scriptlet中的多行註解*/ --%>
<%-- /**Scriptlet中的多行註釋,可以用javadoc從java檔案中提取出來*/ --%>
<%-- JSP的單行註解--%>
2. 3個腳本元素
(1)宣告(Declaration)全域變數
<%! int i=0; String str="Hello World!"; %>
(2)表達式(Expression)
在JSP程式碼中,經常使用表達式來輸出變數的值,可以在任何地方
<%! int a=1; int b=2; String str="Hello World!"; %>
<%=a+b%> <%=str>
PS:不能用「;」號來當表達式的結束符號。但同樣的表達式在Scriptlet中必須以分號來結束。
(3)腳本段(Scriptlet)
腳本段用來包含一個有效地Java程式段
<% int b=3; %>局部變數
3. 3個指令元素
(1)page指令
<%@ page contentType="text/html;charset=utf-8"%>
定義JSP檔案的全域屬性,屬性包括:language、extends、import、session、buffer、autoflush、isThreadSafe、info、errorPage、isErrorPage、contentType(服務端對客戶端的輸出格式)
其位置可以在頁面的任何位置,但推薦放在頁首。
language:宣告腳本語言的種類,目前只能用"java"。
extends:標示JSP編譯時需要加入的Java Class的全名,它會限制JSP的編譯能力,慎用!
import:需要導入的java套件清單。
session:設定客戶是否需要HTTP Session。預設為true。
buffer:buffer的大小被out物件用來處理執行後的JSP對客戶瀏覽器的輸出。預設值為8Kb。
autoFlush:設定如果buffer溢出,是否要強制輸出,如果定義其為true(預設值),輸出正常;如果定義為false,會導致一個意外錯誤的發生。
isThreadSafe:設定JSP檔案是否能多執行緒使用。預設為true。
info:文字訊息。能夠使用Servlet.getServletInfo()方法取回。
errorPage:設定處理異常事件的JSP文件
sErrorPage:設定此頁是否為處理異常事件的頁面,如果設定為true,就能使用exception物件。
contentType:設定MIME類型和字元編碼集。 MIME類型預設為text/html,字元集預設為charset=ISO-8859-1。
可以在一個頁面中使用多個< %@page %>指令,但是除了import屬性,其他的屬性只能使用一次。
JSP預設引入的包,下面這些包在JSP編譯時已經導入了,所以在JSP檔中不需要再用page指令引入:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
(2)include指令
Html代碼
<%@ include file = "相對路徑" %>
使用include指令可以在JSP包含一個靜態的文件,同時解析這個文件中JSP語句。
如果路徑以「/」開頭,那麼此路徑主要是參考jsp應用的上下文關係路徑。
如果路徑以檔案名稱或檔案目錄開通,那麼此路徑就是正在使用的JSP檔案的目前路徑。
(3)taglib指令
Html代碼
<%@ taglib uri = "TagLibrary" prefix = "mypfx" %>
是用taglib指令定義一個標籤庫及其自訂的前綴。
uri:Uniform Resource Identifier根據標籤的前綴對自訂的標籤進行唯一的命名,可以是一個相對或絕對的路徑
prefix:自訂標籤的前綴。不要使用jsp、jspx、java、javax、servlet、sun、sunw作為前綴,這些已被Sun公司聲明保留。
4. 8個動作指令
(1)頁面跳轉:<jsp:forward>
<jsp:forward>標籤從一個jsp檔案向另一個檔案傳遞一個包含使用者請求的request物件。
共包含2個屬性
page屬性是一個表達式或是一個字串用於說明將要定向的檔案或URL。
<jsp:param>向一個動態檔案傳送一個或多個參數。如果使用了<jsp:param>標籤,目標檔案必須是動態的檔案(如Servlet或JSP等)
Html代碼
<jsp:forward page=test.jsp>
<jsp:param name="username" value="<%=user%>"/>
<jsp:param name="password" value="12345678"/>
</jsp:forward>
透過request.getParameter("username")取得使用者名稱
(2)包含頁面:<jsp:include>
<jsp:include>允許包含靜態和動態Web資源,這兩種包含的結果是不同的。
如果包含的僅是靜態文件,那麼這種包含只是把包含文件的內容加到JSP文件中去,類似於< %@include% >;
如果包含的是動態web資源,那麼這個被包含的檔案也會被JSP編譯器執行。
如果這個包含檔案是動態的,那麼還可以使用<jsp:param》傳遞參數和參數值。
(3)建立Bean:<jsp:useBean>
建立一個Bean實例並指定她的名字和作用範圍。
<jsp:useBean id="beanInstanceName" scope="page|request|session|application" class="package.className"/>
包含5個屬性。
id:在所定義的範圍中確認Bean的變量,程式中用id來使用此Bean實例。 id的值對大小寫敏感。
scope:Bean存在的範圍及id變數名的有效範圍。預設值為page。
class:使用new關鍵字及class建構子從一個class中實例一個bean。這個class不能是抽象的,必須有一個公用的,沒有參數的建構器。
type:如果這個Bean已經指定範圍中存在,使用type將會賦予這個Bean一個資料型別。如果使用type的同時沒有使用class或beanName,Bean將不會被實例化。
beanName:beanName可以是字串的package.class,也可以是jsp表達式,它的值會傳遞給Beans.instantiate方法。 type的值可以與beanName相同也可以是它的基類,或是它所實作的介面。
(4)設定Bean屬性:<jsp:setProperty>
<jsp:setProperty name="beanInstanceName" property="*"|property="propertyName" value="string|<%=expression%>"|param="parameterName"/>
name:表示已經在<jsp:useBean>中建立的Bean實例的名字,即id。
property:符合Bean中的屬性
param:指request物件中的參數名,將對應的值設定給Bean的屬性。
value:使用指定的值來設定Bean屬性。這個值可以是字串,也可以是表達式。如果是字串,那麼就會轉換成Bean屬性的型別(如"0.98"會轉換成double型0.98)。如果是表達式,則要求它的類型與Bean屬性的類型一致。
PS:在同一個<jsp:setProperty>中不能同時使用param屬性和value屬性
(5)取得Bean屬性:<jsp:getProperty>
取得已經存在的Bean物件中的屬性值,在頁面中顯示。
<jsp:getProperty name="beanInstanceName property="propertyName"/>
name:與存在的物件實例的名字相同。
property:物件中屬性名
(6)使用Applet插件:<jsp:plugin>
Html代碼
<jsp:plugin type="applet" code="MeidaPlay.class" codebase="../classes">
<jsp:parmas>
<jsp:param name="way" value="Hall"/>
</jsp:params>
<jsp:fallback>
<p>Unable to load applet!</p>
</fallback>
</jsp:plugin>
使用<jsp:plugin>插入一個applet或Bean,必要的話也要下載一個Java外掛程式來執行它。
(7)定義參數:<jsp:param>
可以在<jsp:include>、<jsp:forward>、<jsp:plugin>中使用。
(8)外掛程式錯誤提示:<jsp:fallback>
當<jsp:plugin>插件無法正常顯示時顯示提示訊息。
三、JSP內建對象
1. Request:請求物件該物件封裝了使用者提交的訊息,透過呼叫該物件對應方法可以獲取封裝的資訊。
當request物件取得客戶提交的漢字字元是,會出現亂碼,必須進行特殊處理。
常用方法:
getParameter(String parameterName):取得表單提交的資訊。
getProtocol():取得客戶使用的協定。
getServletPath():取得客戶提交資訊的頁面。
getMethod():取得客戶提交資訊的方式。
getHeader(String str):取得HTTP頭檔中的accept、accept-encoding和Host的值。
getRermoteHost():取得客戶的IP位址。
getServerName:取得伺服器名稱。
getServerPort:取得伺服器的連接埠號碼。
getParameterNames():取得客戶段提交的所有參數的名字。
2. Response:回應物件對客戶的請求做出動態的回應,向客戶端發生資料。
(1)動態回應contentType屬性用page指令靜態設定頁面的contentType屬性,動態設定這個屬性時使用response.setContextType("text/html;charset=utf-8");
(2)Response重定向
response.sendRedirect("index.jsp");
3. Session:會話對象
(1)什麼是Session物件?
Session物件在第一個JSP頁面被裝載時自動創建,完成會話期管理。
從一個客戶打開瀏覽器並連接到伺服器開始,到客戶關閉瀏覽器離開這個伺服器結束,稱為會話。
(2)Session物件的ID
當一個客戶首次訪問伺服器上的一個JSP頁面時,JSP引擎產生一個Session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發送到客戶端,存放在Cookie中,這樣Session對象,直到客戶關閉瀏覽器後伺服器端改該客戶的Session物件才取消,並且和客戶的會話對應關係消失。
(3)常用方法
public String getId():取得Session物件的編號。
public void setAttribute(String str,Object obj):將參數物件加入Session物件中。
public Object getAttribute():根據屬性名稱取得Session物件中的屬性。
public boolean isNew():判斷是否為新的客戶。
4. Application:應用程式對象
(1)什麼是Application物件?
在伺服器啟動後就產生了這個Application對象,當客戶在所造訪的網站的各個頁面之間瀏覽時,這個Appliaction對像都是同一個,所有的客戶共享這個內建的Application對象。
(2)常用方法
setAttribute(String key,Object obj):將參數物件加入到Application物件中。
getAttibute(String key):根據屬性名稱取得Application物件中的屬性
5. Out:輸出對象
out物件是一個輸出流,用來向客戶輸出資料。
out.print():輸出各種型別資料。
out.newLine():輸出一個換行符。
out.close():關閉流。
6. Config:配置物件一般我們使用Config物件來取得一些初始化配置訊息,常用的方法有getInitParameter和getInitParameterNames,以獲得Servlet初始化時的參數。
7.Page:頁面對象
page對象代表了正在運行的由JSP文件產生的類別對象,不建議一般讀者使用。
8.PageContext:頁面上下文對象
JSP引入的PageContext的類,透過它可以存取頁面的許多屬性。 pageContext變數儲存與目前頁面相關聯的PageContext物件的值。 PageContext類別擁有getRequest、getResponse、getOut、getSession等方法。
9.Exception:例外對象
exception物件代表了JSP檔案執行時所產生的例外對象,此物件不能在一般的JSP檔案中直接使用,而只能在使用了
< %@page isErrorPage="true"%>的JSP檔案中使用。這是因為JSP檔案執行時產生的錯誤物件被向外拋出,只能被使用了< %@pageisErrorPage="true"% >標記從而具有攔截錯誤物件功能的JSP所攔截。最常用的方法就是getMessage,用來取得錯誤訊息。
四、實例登陸頁面:index.jsp
Html代碼
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>系統登入</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="css/vbulletin.css" rel="stylesheet" type="text/css">
<style type="text/css">
.btn {
font-family: "Tahoma", "宋體";
font-size: 9pt;
color: #001E3C;
BORDER-BOTTOM: #6794BC 1px solid;
BORDER-LEFT: #8BB8E0 1px solid;
BORDER-RIGHT: #6794BC 1px solid;
BORDER-TOP: #8BB8E0 1px solid;
background-image: url(image/buttonbg.gif);
CURSOR: hand;
font-style: normal;
padding-left: 3px;
padding-right: 3px;
}
</style>
<script type="text/javascript">
function doLogin(){
var vform = document.loginform;
if(!loginform.username.value){
alert("請輸入使用者名稱!")
return;
}
if(!loginform.password.value){
alert("請輸入密碼!")
return;
}
vform.submit();
}
</script>
</head>
<body topmargin="0" leftmargin="0" >
<form action="receive.jsp" name="longinForm" method="post">
<table width="100%" height="100%">
<tr>
<td align="center" valign="middle">
<TABLE id="form1"
cellspacing="0" cellpadding="0" border="0" style="width: 500;">
<CAPTION style="display: none">
</CAPTION>
<TR>
<TD>
<TABLE width="100%" height="100%" cellspacing="0"
cellpadding="0" border="0" style="table-layout: fixed">
<TR>
<TD valign="top">
<FIELDSET id="form1_group0" style="width: 100%;">
<LEGEND>系統登入</LEGEND>
<DIV>
<DIV style="width: 100%; height: 100%">
<TABLE width="100%" cellspacing="0"
cellpadding="4" border="0" style="table-layout: fixed;">
<COLGROUP>
<COL width="100"></COL>
<COL width="50%"></COL>
<COL width="100"></COL>
<COL width="50%"></COL>
</COLGROUP>
<TR>
<TD align="right">
使用者名稱
</TD>
<TD class="InnerTableContentCell">
<input type="text" name="username"
style="width: 100%;">
</TD>
<TD align="right">
密碼
</TD>
<TD>
<input type="password" name="password"
style="width: 100%;" />
<input type="hidden" name="action2" value="0">
</TD>
</TR>
<TR>
<TD colSpan="4"
align="right">
<input type="button" name="login" value="登入" onclick="this.form.submit();" class="btn"/>
</TD>
</TR>
</TABLE>
</DIV>
</DIV>
</FIELDSET>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</td>
</tr>
</table>
</form>
</body>
</html>
接收資料頁面:receive.jsp
Html代碼
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" info="動作標籤"%>
<jsp:useBean id="userVo" class="exercise.vo.UserVo" scope="request">
<jsp:setProperty name="userVo" property="name" param="username"/>
<jsp:setProperty name="userVo" property="password" param="password"/>
</jsp:useBean>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
<link href="css/vbulletin.css" rel="stylesheet" type="text/css">
</head>
<body>
This is my JSP page. <br>
<hr>用<jsp:getProperty>取得表單中提交過來的值<br>
name:<jsp:getProperty property="name" name="userVo"/><br>
password:<jsp:getProperty property="password" name="userVo"/>
<br><br><hr>
<%
out.println("從vo物件直接取得:<br> name:"+userVo.getName()+
"<br>password:"+userVo.getPassword()+"<br>");
String serviceName = request.getServerName();//1.jsp內部的request對象
out.println("<br><hr>伺服器名稱: "+serviceName);
out.println("<br>MIME類型: "+response.getContentType());//2.jsp內部的response對象
session.setAttribute("sessionName","jsp內部的session物件");//3.jsp內部的session對象
out.println("<br>session物件: "+session.getAttribute("sessionName"));//4.jsp內部的out對象
pageContext.setAttribute("pageContext","上下文環境的參考");//5.jsp內部的pageContext對象
//6. application
//7. config ServletConfig的實例
//8. page java.lang.Object的實例
//9. exception 必須在page指令中isErrorPage=true的頁面使用 java.lang.Throwable的實例
String info = pageContext.getServletContext().getServerInfo();
out.println("取得page指令中的info屬性:"+info);
%>
</body>