教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之JSP中的腳本

更新時(shí)間:2016年08月13日18時(shí)23分 來源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

1.JSP文件分析

JSP的組成中,我們了解到,JSP文件中包括Java腳本,并且Java腳本有三種。今天我們就一一來詳細(xì)了解這三種腳本的使用,如下所示:
首先,我們來看一個(gè)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)在對(duì)index.jsp頁(yè)面中的代碼進(jìn)行分析,如下所示:
(1)jsp指令:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>就是jsp指令,也是一種特殊的標(biāo)簽,后面我們會(huì)單獨(dú)講解jsp標(biāo)簽。
(2)Java代碼片段:
<%
String path = request.getContextPath();
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
以上代碼便是Java代碼片段,其中第一條Java代碼:request.getContextPath()是獲得應(yīng)用名稱;第二條Java代碼:basePath變量的值是由協(xié)議名+服務(wù)器名稱+端口號(hào)+項(xiàng)目名稱組成,即:http://localhost:8080/項(xiàng)目名/。
<base href="<%=basePath%>">該標(biāo)簽中使用了<%=basePath%>,它表示向?yàn)g覽器端輸出表達(dá)式內(nèi)容,如圖1-1所示是index.jsp頁(yè)面在瀏覽器端的源代碼:

圖1-1 index.jsp在瀏覽器端的源代碼
由圖1-1可知,<%= basePath%>在瀏覽器端顯示的值為:http://localhost:8080/Example15,其他腳本內(nèi)容都不存在。
<base>標(biāo)簽的作用就是,當(dāng)本頁(yè)面超鏈接或表單的訪問路徑是使用相對(duì)路徑時(shí),如<a href=”AServlet”/>,會(huì)在該路徑前添加basePath的值,例如<a href=”AServlet”>,就相當(dāng)于<a href=”http://localhost:8080/Example/AServlet”/>。

2.JSP腳本練習(xí)

下面通過一個(gè)案例,來學(xué)習(xí)在jsp文件中,使用三種腳本的效果,如下所示:
(1)新建一個(gè)web應(yīng)用,Example15,對(duì)該應(yīng)用的index.jsp文件進(jìn)行編輯,主要代碼如例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ù)器,然后啟動(dòng)服務(wù)器,在瀏覽器端地址欄上輸入:http://localhost:8080/Example15,瀏覽器顯示結(jié)果如圖1-2所示:

圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,out.print(a++)確實(shí)是先向?yàn)g覽器端輸出a的值,然后再給a加1。
(3)對(duì)index.jsp做如下修改,使用Java腳本在瀏覽器端輸出a的值,如例1-3所示:
  <body>
    This is my JSP page. <br>
     ... ... 此處省略例1-2中紅色標(biāo)注的代碼
     <br>
     使用Java腳本輸出a的值:<%=a%>
  </body>
(4)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問index.jsp頁(yè)面,顯示結(jié)果如圖1-3所示:

圖1-3 瀏覽器顯示結(jié)果
(5)再次對(duì)index.jsp進(jìn)行修改,在jsp頁(yè)面中聲明成員變量a,如例1-4所示:
  <body>
    This is my JSP page. <br>
     ... ... 此處省略例1-2中紅色標(biāo)注的代碼
<br>
      <%!
    int a = 100;
    public void fun1() {
        System.out.println(a);
    }
       %>
    <%
    out.print(a++);
    fun1();
    %>
  </body>
例1-4中,使用<%! %>聲明了一個(gè)成員變量a,與例1-2中的局部變量a同名,并且定義了一個(gè)方法fun(),該方法在控制臺(tái)打印a的值,控制臺(tái)打印的a是成員變量而不是局部變量?,F(xiàn)在再向?yàn)g覽器端輸出,觀察有什么變化。
(6)重啟服務(wù)器,在瀏覽器端訪問index.jsp頁(yè)面,顯示結(jié)果如圖1-4所示:

圖1-4 瀏覽器顯示結(jié)果
(7)控制臺(tái)打印結(jié)果,如圖1-5所示:

圖1-5 控制臺(tái)打印結(jié)果
成員變量a的值是100,局部變量的值是10,瀏覽器無論訪問多少次,輸出的局部變量a的值都是11,控制臺(tái)打印的是成員變量,無論瀏覽器訪問多少次,控制臺(tái)打印的值都是100。如果將例1-4中,out.print(a++)改為out.print(this.a++),再次訪問index.jsp頁(yè)面,瀏覽器顯示結(jié)果與控制臺(tái)打印結(jié)果分別如圖1-6、1-7所示:

圖1-6 瀏覽器顯示結(jié)果

圖1-7 控制臺(tái)打印結(jié)果
out.print(this.a++)中this.a表示的是成員變量而不是局部變量,先在瀏覽器端輸出成員變量a的值,然后再給a加1,由于fun()方法是在a加1后被調(diào)用,所以控制臺(tái)上打印的a的值為101。出現(xiàn)這種效果的原因是:jsp本身就是一個(gè)Servlet,而Servlet是單例的,每次請(qǐng)求都會(huì)去調(diào)用service()方法,而局部變量a就是定義在service()方法中,因此每次訪問,a都是從10開始,在瀏覽器端輸出的都是11。而成員變量a在第一次訪問時(shí)是100,然后加1,以后每次訪問都是在上一次訪問的結(jié)果上再加1。因此,第二次再訪問的時(shí)候,控制臺(tái)會(huì)打印102。以上涉及到j(luò)sp原理,后面我們會(huì)詳細(xì)講解。
(8)下面,通過腳本實(shí)現(xiàn)循環(huán)輸出。在Example15應(yīng)用的WebRoot目錄下新建一個(gè)jsps目錄,并在該目錄下創(chuàng)建一個(gè)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)十次,即表格的一行將會(huì)輸出十次,也就是十行。以后我們會(huì)使用類似的方式將數(shù)據(jù)顯示在頁(yè)面中。注意,for循環(huán)的“}”不能漏寫了,否則效果顯示不出來。
(9)重新啟動(dòng)服務(wù)器,在瀏覽器端訪問http://localhost:8080/Example15/jsps/test.jsp,瀏覽器顯示結(jié)果如圖1-7所示:

圖1-7 瀏覽器顯示結(jié)果
 

本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee

0 分享到:
和我們?cè)诰€交談!