JSP是一種動態網頁技術標準,它是在靜態網頁HTML代碼中加入Java程序片段(Scriptlet)和JSP標籤(tag),構成JSP網頁文件,其擴展名爲“.jsp”。
一、JSP語法
JSP頁面是將JSP代碼放在“<%”與“%>”的標籤中,然後嵌入到HTML代碼中而形成。在“<%”與“%>”標籤中定義JSP元素的的行爲。
1》JSP變量、方法的聲明
語法格式:<%! 聲明變量、方法和類 %>
2》顯示JSP表達式的值
語法格式:<%=表達式%>
3》JSP代碼塊
語法格式:<% 符合java語法的代碼塊 %>
4》JSP註釋
在JSP程序中,爲了增加JSP程序的可讀性,給出了註釋元素。
語法格式1:<%-- 要添加的文本註釋 --%>
語法格式2:<!--要添加的文本註釋-->
語法格式3:<%//要添加的文本註釋%> 或<%/*要添加的文本註釋*/%>
二、JSP指令元素
JSP指令標記被服務器解釋並被執行。
JSP 指令的語法格式: <%@ 指令名稱 屬性1="屬性值1" 屬性2="屬性值2" … 屬性n="屬性值n"%>
1》page指令
Page指令用來定義JSP頁面中的全局屬性,它描述了與頁面相關的一些信息
屬性 |
說明 |
設置值示例 |
language |
指定用到的腳本語言,默認是Java |
<%@page language="java"%> |
import |
用於導入java包或java類 |
<%@page import="Java.util.Date"%> |
pageEncoding |
指定頁面所用編碼,默認與contentType值相同 |
UTF-8 |
session |
指定該頁面是否參與到HTTP會話中 |
true 或 false |
errorPage |
設置當頁面出錯後要跳轉到的頁面 |
/error/jsp-error.jsp |
contentType |
設計響應jsp頁面的MIME類型和字符編碼 |
text/html;charset=gbk |
isErrorPage |
設置是否是一個錯誤處理頁面 |
true 或 false |
isELIgnord |
設置是否忽略正則表達式 |
true 或 false |
2》include指令
include指令稱爲文件加載指令,可以將其他的文件插入JSP網頁,被插入的文件必須保證插入後形成的新文件符合JSP頁面的語法規則;
include指令語法格式: <%@ include file="filename"%> 【 include指令只有一個file屬性,filename指被包含的文件的名稱(相對路徑),被插入的文件必須與當前JSP頁面在同一Web服務目錄下】
三、JSP動作元素
JSP動作元素是用來控制JSP引擎的行爲,JSP標準動作元素均以“jsp”爲前綴。
1》 <jsp:include>動作
語法格式:<jsp:include page="文件的名字"/>
功能:
當前JSP頁面動態包含一個文件,即將當前JSP頁面、被包含的文件各自獨立編譯爲字節碼文件。
當執行到該動作標籤處,才加載執行被包含文件的字節碼。
2》 <jsp:forward>
用於停止當前頁面的執行,轉向另一個頁面。
語法格式: <jsp:forward page="文件的名字"/>
四、JSP內置對象
在JSP中爲了便於數據信息的保存、傳遞、獲取等操作,專門設置了9個內置對象。
對象名稱 |
所 屬 類 型 |
有效範圍 |
說明 |
application |
javax.servlet.ServletContext |
application |
應用程序上下文,JSP頁面以及在同一應用程序中的任何Web組件共享信息 |
config |
javax.servlet.ServletConfig |
page |
允許將初始化數據傳遞給JSP頁面 |
exception |
java.lang.Throwable |
page |
該對象含有隻能由指定的JSP“錯誤處理頁面”訪問的異常數據 |
out |
javax.servlet.jsp.JspWriter |
page |
提供對輸出流的訪問 |
page |
javax.servlet.jsp.HttpJspPage |
page |
代表JSP頁面對應的Servlet類實例 |
pageContext |
javax.servlet.jsp.PageContext |
page |
JSP頁面本身的上下文 |
request |
javax.servlet.http.HttpServletRequest |
request |
提供對請求數據的訪問,同時還提供用於加入特定請求數據的上下文 |
response |
javax.servlet.http.HttpServletResponse |
page |
該對象用來向客戶端輸入數據 |
session |
javax.servlet.http.HttpSession |
session |
用來保存在服務器與一個客戶端之間需要保存的數據,當客戶端關閉網站的所有網頁時,session變量會自動消失 |
1》request對象的常用方法
request對象的各種方法主要用來處理客戶端瀏覽器提交的請求信息,以便做出相應的處理。
方法 |
說明 |
setAttribute(String name, Object obj) |
設置request中的屬性及其屬性值 |
getAttribute(String name) |
返回name指定的屬性值,若不存在指定的屬性,就返回null。 |
removeAttribute(String name) |
刪除請求中的一個屬性 |
getParameter(String name) |
獲得客戶端傳送給服務器端的參數值 |
getParameterNames() |
獲得客戶端傳送給服務器端的所有參數名字(Enumeration類的實例) |
getParameterValues(String name) |
獲得指定參數的所有值 |
getCookies() |
返回客戶端的所有Cookie對象,結果是一個Cookie數組 |
getCharacterEncoding() |
返回請求中的字符編碼方式 |
getRequestURI() |
獲取發出請求字符串的客戶端地址 |
getRemoteAddr() |
獲取客戶端IP地址 |
getRemoteHost() |
獲取客戶端名字 |
getSession([Boolean create]) |
返回和請求相關的session。參數若爲true,若沒有session,新建session |
getServerName() |
用於獲取服務器的名字 |
getServletPath() |
用於獲取客戶端所請求的腳本文件的文件路徑。 |
getServerPort() |
用於獲取服務器的端口號 |
2》response 對象的常用方法
response對象提供了頁面重定向(sendRedirect)方法、設置狀態行(setStatus)方法和設置文本類型(setContentType)方法等
方法 |
說明 |
SendRedirect(String url) |
使用指定的重定向位置url向客戶端發送重定向響應 |
setContentType(String type) |
爲響應設置內容類型,其參數值可以爲text/html,text/plain,application/x_msexcel或application/msword |
setContentLength(int len) |
爲響應設置內容長度 |
setLocale(java.util.Locale loc) |
爲響應設置地區信息 |
三、session對象主要方法
session對象其主要作用是存儲、獲取用戶會話信息
方法 |
說明 |
Object getAttribute(String attriname) |
獲取指定屬性的屬性值,若屬性不存在,返回null |
void setAttribute(String name,Object value) |
設定指定名字的屬性值,並且存儲在session中 |
void removeAttribute(String attriname) |
刪除指定的屬性(包含屬性名、屬性值) |
Enumeration getAttributeNames() |
返回session對象中存儲的每一個屬性對象 |
long getCreationTime() |
返回session對象被創建時間,單位爲毫秒 |
long getLastAccessedTime() |
返回session最後發送請求的時間,單位爲毫秒 |
String getId() |
返回Session對象在服務器端的編號 |
long setMaxInactiveInterval() |
返回session對象的生存時間,單位爲秒 |
boolean isNew() |
判斷目前session是否爲新的Session |
void invalidate() |
銷燬session對象,使得與其綁定的對象都無效 |
四、使用樣例
設計一個網上答題及其自動評測系統。
本案例設計一個簡單的網上答題與評測,該程序包括兩部分,
首先是試題頁面的設計及其解答的提交,
其次是,當提交解答後,系統自動評閱並給出評閱結果。
該案例的設計,需要設計兩個JSP頁面:
一個是提交信息頁面,
另一個是獲取提交信息並進行處理顯示結果頁面。
其設計關鍵是如下兩點:
(1)對於互斥的單選框、只允許的單選的列表框,只傳遞一個參數。
(2)對於複選框、可多選列表框,需傳遞多個參數,通過數組保存並獲取參數值。
代碼:
(1)提交信息頁面程序:ch02_5_input.jsp,《代碼》。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>簡單的網上試題自動測評——試題</title>
</head>
<body>
<form action="ch02_5.jsp" method="post">
一、 2+3=?<br>
<input type="radio" name="r1" value="2" checked="checked">2
<input type="radio" name="r1" value="3">3
<input type="radio" name="r1" value="4">4
<input type="radio" name="r1" value="5">5<br>
二、下列哪些是偶數?<br>
<input type="checkbox" name="c1" value="2">2
<input type="checkbox" name="c1" value="3">3
<input type="checkbox" name="c1" value="4">4
<input type="checkbox" name="c1" value="5">5<br>
三、下列哪些是動態網頁?<br>
<select size="4" name="list1" multiple="multiple">
<option value="asp">ASP</option>
<option value="php">PHP</option>
<option value="htm">HTML</option>
<option value="jsp">JSP</option>
<option value="xyz" selected="selected">xyz</option>
</select><br>
四、下列組件哪個是服務器端的?<br>
<select size="1" name="list5">
<option value="jsp">JSP</option>
<option value="servlet">SERVLET</option>
<option value="java">JAVA</option>
<option value="jdbc">JDBC</option>
</select><br>
五、在服務器端用來接受用戶請求的對象是:
<input type="text" size="20" name="text1"><br>
<div align="left">
<input type="submit" value="提交" name="button1">
<input type="reset" value="重置" name="button2">
</div>
</form>
</body>
</html>
(2)獲取提交信息並進行處理頁面:ch02_5_show.jsp,《代碼》
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>簡單的網上試題自動測評——測評</title>
</head>
<body>
<% String s1 = request.getParameter("r1");
if (s1 != null) {
out.println("一、解答爲:2+3=" + s1 + " ");
if (s1.equals("5")) out.println("正確!" + "<br>");
else out.println("錯誤!" + "<br>");
}else out.println("一、沒有解答!");
out.println("---------------------------<br>");
String[] s21 = request.getParameterValues("c1");
if (s21 != null) {
out.println("二、解答爲:偶數有:");
for (int i = 0; i < s21.length; ++i) {out.println(s21[i] + " ");}
if (s21.length == 2 && s21[0].equals("2") && s21[1].equals("4")){
out.println("正確!" + "<br>");
}else{
out.println("錯誤!" + "<br>");
}
}else{
out.println("二、沒有解答!");
}
out.println("---------------------------<br>");
String[] s31 = request.getParameterValues("list1");
if (s31 != null) {
out.println("三、解答爲:動態網頁有:");
for (int i = 0; i < s31.length; ++i) {out.println(s31[i] + " ");}
if (s31.length == 3 && s31[0].equals("asp") && s31[1].equals("php")
&& s31[2].equals("jsp")){
out.println("正確!" + "<br>");
}else{
out.println("錯誤!" + "<br>");
}
} else out.println("三、沒有解答!");
out.println("---------------------------<br>");
String s4 = request.getParameter("list5");
if (s4 != null) {
out.println("四、解答爲:服務器端的組件是有:");
out.println(s4 + " ");
if (s4 != null && s4.equals("servlet")) out.println("正確!" + "<br>");
else out.println("錯誤!" + "<br>");
} else out.println("四、沒有解答!");
out.println("---------------------------<br>");
String s5 = request.getParameter("text1");
if (s5 != null) {
out.println("五、解答爲: ");
out.println(s5 + " ");
if (s5 != null && s5.equals("request"))
out.println("正確!" + "<br>");
else out.println("錯誤!" + "<br>");
} else out.println("五、沒有解答!");
out.println("---------------------------<br>");
%>
</body>
</html>