更新時間:2016年08月13日18時23分 來源:傳智播客JAVA培訓學院 瀏覽次數(shù):
在JSP的組成中,我們了解到,JSP文件中包括Java腳本,并且Java腳本有三種。今天我們就一一來詳細了解這三種腳本的使用,如下所示:
首先,我們來看一個jsp文件,如例1-1所示:
例1-1 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+
request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
This is my JSP page. <br>
</body>
</html>
現(xiàn)在對index.jsp頁面中的代碼進行分析,如下所示:
(1)jsp指令:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>就是jsp指令,也是一種特殊的標簽,后面我們會單獨講解jsp標簽。
(2)Java代碼片段:
<%
String path = request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
以上代碼便是Java代碼片段,其中第一條Java代碼:request.getContextPath()是獲得應用名稱;第二條Java代碼:basePath變量的值是由協(xié)議名+服務(wù)器名稱+端口號+項目名稱組成,即:http://localhost:8080/項目名/。
<base href="<%=basePath%>">該標簽中使用了<%=basePath%>,它表示向瀏覽器端輸出表達式內(nèi)容,如圖1-1所示是index.jsp頁面在瀏覽器端的源代碼:
圖1-1 index.jsp在瀏覽器端的源代碼
由圖1-1可知,<%= basePath%>在瀏覽器端顯示的值為:http://localhost:8080/Example15,其他腳本內(nèi)容都不存在。
<base>標簽的作用就是,當本頁面超鏈接或表單的訪問路徑是使用相對路徑時,如<a href=”AServlet”/>,會在該路徑前添加basePath的值,例如<a href=”AServlet”>,就相當于<a href=”http://localhost:8080/Example/AServlet”/>。
下面通過一個案例,來學習在jsp文件中,使用三種腳本的效果,如下所示:
(1)新建一個web應用,Example15,對該應用的index.jsp文件進行編輯,主要代碼如例1-2所示:
例1-2 Example15/index.jsp
<body>
This is my JSP page. <br>
<%
int a = 10;
%>
<%
out.print(a++);
%>
</body>
(2)將Example15發(fā)布到Tomcat服務(wù)器,然后啟動服務(wù)器,在瀏覽器端地址欄上輸入:http://localhost:8080/Example15,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,out.print(a++)確實是先向瀏覽器端輸出a的值,然后再給a加1。
(3)對index.jsp做如下修改,使用Java腳本在瀏覽器端輸出a的值,如例1-3所示:
<body>
This is my JSP page. <br>
... ... 此處省略例1-2中紅色標注的代碼
<br>
使用Java腳本輸出a的值:<%=a%>
</body>
(4)重新啟動服務(wù)器,在瀏覽器端訪問index.jsp頁面,顯示結(jié)果如圖1-3所示:
圖1-3 瀏覽器顯示結(jié)果
(5)再次對index.jsp進行修改,在jsp頁面中聲明成員變量a,如例1-4所示:
<body>
This is my JSP page. <br>
... ... 此處省略例1-2中紅色標注的代碼
<br>
<%!
int a = 100;
public void fun1() {
System.out.println(a);
}
%>
<%
out.print(a++);
fun1();
%>
</body>
例1-4中,使用<%! %>聲明了一個成員變量a,與例1-2中的局部變量a同名,并且定義了一個方法fun(),該方法在控制臺打印a的值,控制臺打印的a是成員變量而不是局部變量?,F(xiàn)在再向瀏覽器端輸出,觀察有什么變化。
(6)重啟服務(wù)器,在瀏覽器端訪問index.jsp頁面,顯示結(jié)果如圖1-4所示:
圖1-4 瀏覽器顯示結(jié)果
(7)控制臺打印結(jié)果,如圖1-5所示:
圖1-5 控制臺打印結(jié)果
成員變量a的值是100,局部變量的值是10,瀏覽器無論訪問多少次,輸出的局部變量a的值都是11,控制臺打印的是成員變量,無論瀏覽器訪問多少次,控制臺打印的值都是100。如果將例1-4中,out.print(a++)改為out.print(this.a++),再次訪問index.jsp頁面,瀏覽器顯示結(jié)果與控制臺打印結(jié)果分別如圖1-6、1-7所示:
圖1-6 瀏覽器顯示結(jié)果
圖1-7 控制臺打印結(jié)果
out.print(this.a++)中this.a表示的是成員變量而不是局部變量,先在瀏覽器端輸出成員變量a的值,然后再給a加1,由于fun()方法是在a加1后被調(diào)用,所以控制臺上打印的a的值為101。出現(xiàn)這種效果的原因是:jsp本身就是一個Servlet,而Servlet是單例的,每次請求都會去調(diào)用service()方法,而局部變量a就是定義在service()方法中,因此每次訪問,a都是從10開始,在瀏覽器端輸出的都是11。而成員變量a在第一次訪問時是100,然后加1,以后每次訪問都是在上一次訪問的結(jié)果上再加1。因此,第二次再訪問的時候,控制臺會打印102。以上涉及到j(luò)sp原理,后面我們會詳細講解。
(8)下面,通過腳本實現(xiàn)循環(huán)輸出。在Example15應用的WebRoot目錄下新建一個jsps目錄,并在該目錄下創(chuàng)建一個test.jsp,主要代碼如例1-5所示:
例1-5 test.jsp
<body>
<table border="1" align="center" width="60%">
<tr>
<td>姓名</td>
<td>年齡</td>
</tr>
<%
for(int i = 0; i < 10; i++) {
%>
<tr>
<td>張三</td>
<td>29</td>
</tr>
<%
}
%>
</table></body>
例1-5中,使用for循環(huán),將循環(huán)體中的信息循環(huán)十次,即表格的一行將會輸出十次,也就是十行。以后我們會使用類似的方式將數(shù)據(jù)顯示在頁面中。注意,for循環(huán)的“}”不能漏寫了,否則效果顯示不出來。
(9)重新啟動服務(wù)器,在瀏覽器端訪問http://localhost:8080/Example15/jsps/test.jsp,瀏覽器顯示結(jié)果如圖1-7所示:
圖1-7 瀏覽器顯示結(jié)果
本文版權(quán)歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://xamj520.com/javaee