JSP快速入門
JSP(JavaServer Pages )是什麼?
JavaServer Pages(JSP)是一種支持動態內容開發的網頁技術它可以幫助開發人員通過利用特殊的JSP標籤,其中大部分以<%開始並以%>作爲結束標誌插入Java代碼到HTML頁面。
JavaServer Pages組件是一個Java servlet的類型,旨在滿足Java Web應用程序用戶界面的一個角色。Web開發人員編寫JSP爲文本文件,結合HTML或XHTML代碼,XML元素,並嵌入JSP動作和命令。
使用JSP可以通過網頁的形式,從數據庫或其他來源的記錄收集來自用戶的輸入,並動態地創建Web頁面。
JSP標籤可用於各種目的,如從數據庫中檢索信息或登記的用戶偏好,訪問JavaBeans組件,頁面之間傳遞控制和共享請求,網頁等之間的信息。
爲什麼使用JSP?
JavaServer頁面往往服務於同一目的,使用通用網關接口(CGI)執行的方案。但相比CGI,JSP提供了幾個優點。
性能更好,因爲JSP允許嵌入動態元素在HTML頁面中,而不是隻有一個單獨的CGI文件。
JSP在請求處理之前總是經過了編譯,它不同於 CGI/Perl 服務器,需要服務器在加載時都要解釋,並在每次請求頁面時才處理目標腳本。
JavaServer Pages是建立在Java Servlet的API之上,所以就像Servlet,JSP也可以訪問強大的企業 Java API 的所有功能,包括JDBC,JNDI,EJB,JAXP等。
JSP頁面可以結合使用servlet處理業務邏輯,通過Java servlet模板引擎所支持的模型。
最後,JSP是J2EE,企業級應用的完整平臺的一個組成部分。這意味着JSP可以開發最簡單應用程序,或作爲最複雜的應用程序一部分。
安裝JSP開發環境
這個步驟包括下載Java軟件開發工具包(SDK)和安裝,並適當設置PATH環境變量。
可以從Oracle的Java網站下載SDK: Java SE 下載
另外,如果使用集成開發環境(IDE),如:Borland公司的JBuilder,Eclipse,IntelliJ IDEA,或Sun ONE Studio,編譯並運行一個簡單的程序,以確認IDE知道系統上在哪裏安裝了 Java 。
在本教程中,我們使用的是:MyEclise 8.5 試用版本,爲了與本教程同步以減少出現代碼或其它的意外的錯誤,建議在使用 MyEclipse 8.5 以同步本教程。
安裝MyEclipse開發環境
安裝MyEclipse開發環境比較簡單,可以從網上搜索下載一個MyEclipse 8.5,然後安裝在一個自己喜歡的位置,在教程中安裝的位置是:D:\Program Files\MyEclipse 8.5,雙擊「myeclipse.exe」(或桌面的圖標),啓動,啓動完成後畫面如下:
第二步,啓動 MyEclipse 中的Tomcat:
成功啓動後,Tomcat 默認的Web應用程序將可以通過:http://localhost:8080/ 訪問。如果一切正常,那麼它應該顯示以下結果:
這裏包括,Tomcat網站有關配置和運行Tomcat文檔信息,更多的信息可訪問:http://tomcat.apache.org
JSP第一個應用:
第一步,點擊右上角中的 「File"->"New"->"Web Project" 創建一個工程爲:「HelloWord",如下:
第二步:點擊「Finish",然後完成工程創建,整個工程結構如下圖所示:
運行工程,右鍵點擊工程名稱 」HelloWord",選擇「Run As」->「MyEclipse Server Application" 或在瀏覽器中輸入:http://localhost:8080/HelloWord/ 運行結果如下圖所示:
到這裏,JSP的開發運行環境已經建立起來了。接下來可以進一步開發學習JSP的其它知識。
JSP處理:
下面的步驟是用來說明Web服務器是如何使用JSP創建網頁:
對於一個正常的頁面,瀏覽器發送一個HTTP請求到萬維網服務器。
網站服務器識別HTTP請求是一個JSP頁面,並將其轉發給JSP引擎。這是通過使用URL或JSP頁面,而這個頁面使用 .jsp 後綴,而不是 .html 後綴。
JSP引擎從磁盤加載JSP頁面,並將其轉換成servlet的內容。這種轉換是很簡單的,所有的模板文本被轉換給println()語句,所有JSP元素被轉換爲實現該頁面相應動態行爲的Java代碼。
JSP引擎編譯成servlet的一個可執行類並轉發原始請求到servlet引擎。
一部分Web服務器調用servlet引擎加載Servlet類並執行它。在執行期間,Servlet產生HTML的格式輸出,其servlet引擎傳遞到web服務器響應HTTP請求。
Web服務器響應HTTP轉發靜態的HTML內容到瀏覽器。
最後的 web 瀏覽器處理HTTP響應動態生成的HTML頁面完全就像一個靜態頁面內容。
下面的圖顯示所有上述的步驟:
腳本
scriptlet可以包含任意數量的JAVA語言的語句,變量或方法聲明,或者是在頁面的腳本語言有效表達式。
以下是Scriptlet中的語法:
<% code fragment %>
可以編寫XML代碼相當於上述語法如下:
jsp:scriptlet
code fragment
寫的任何文本,HTML標籤或JSP元素一定在腳本之外。以下是簡單第一個JSP的例子:
<% out.println("Your IP address is " + request.getRemoteAddr()); %>
現在我們來創建一個JSP文件頁面,這個文件名稱爲:hello.jsp,讓我們保存上面的代碼到hello.jsp 中,整個完整的代碼如下:
啓動Tomcat,在瀏覽器地址欄中輸入:http://localhost:8080/HelloWord/hello.jsp,這將產生以下結果:
JSP 聲明
聲明一個或多個變量,或者方法可以在Java代碼後面的JSP文件中使用。 在JSP文件中使用變量或方法它們之前,必須先聲明它們。
以下是JSP聲明的語法:
<%! declaration; [ declaration; ]+ ... %>
可以使用XML編寫相當於上述語法如下:
jsp:declaration
code fragment
下面是簡單的例子JSP聲明:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
JSP表達式
JSP表達式元素包含計算,轉換爲字符串,並插入出現在JSP文件的腳本語言表達式。
因爲一個表達式的值被轉換爲字符串,可以在文本一行內使用表達式,不管它是否被標記使用在HTML,JSP文件中。
表達元素可以包含任何Java語言規範有效的表達式,但是不能使用一個分號來結束表達式。
下面是JSP表達式的語法:
<%= expression %>
可以使用XML編寫相當於上述語法如下:
jsp:expression
expression
這裏創建一個新的工程:jsp-base,並在index.jsp文件中寫入以下代碼,下面是簡單的例子JSP表達式:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
今天是:<%=(new java.util.Date()).toLocaleString()%>
打開瀏覽器,輸入網址:http://localhost:8080/jsp-base/index.jsp,產生以下結果:
JSP註釋
JSP註釋標記的文字或語句都會被JSP容器忽略。當想要隱藏或「註釋掉」JSP頁面的一部分,JSP註釋是很有用的。
以下是JSP註釋語法:
<%-- This is JSP comment --%>
創建一個comment.jsp 並編寫入下面的代碼,以測試JSP註釋:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
A Test of Comments
<%-- This comment will not be visible in the page source \--%>http://localhost:8080/jsp-base/comment.jsp
還有少數特殊的結構可以使用一些情況,插入註釋或字符,將被特殊處理。這裏有一個整理彙總:
語法
目的
<%-- comment --%>
JSP註釋,它將被JSP引擎忽略
HTML註釋,它將被瀏覽器忽略
<\%
表示靜態<%的字面量
%\>
表示靜態%>的字面量
\'
在使用單引號在屬性中的單引號
\"
雙引號在屬性使用雙引號
JSP 指令
JSP指令影響的servlet類的整體結構。它通常有以下形式:
<%@ directive attribute="value" %>
有三種類型的指令標記:
指令
描述
<%@ page ... %>
定義頁面依賴屬性,例如腳本語言,錯誤頁面和緩衝的要求
<%@ include ... %>
包括在轉換階段的文件
<%@ taglib ... %>
聲明瞭一個標籤庫,包含自定義動作,用在頁面中
JSP 動作
JSP動作使用XML語法結構來控制Servlet引擎的行爲。可以動態地插入文件,重用JavaBeans組件,用戶轉發到另一個頁面,或爲Java插件生成HTML。
只有一個用於動作元素的語法,因爲它符合XML標準:
<jsp:action_name attribute="value" />
動作元素基本上都是預先定義函數並有以下可用的JSP操作:
語法
目的
jsp:include
包括頁面被一次請求的文件
jsp:include
包括頁面被一次請求的文件
jsp:useBean
查找或實例化一個JavaBean
jsp:setProperty
設置一個JavaBean的屬性
jsp:getProperty
插入一個JavaBean的屬性到輸出
jsp:forward
轉發請求到一個新的頁面
jsp:plugin
生成特定瀏覽器的代碼,使對象或嵌入標籤Java插件
jsp:element
定義XML元素動態
jsp:attribute
定義動態定義XML元素的屬性
jsp:body
定義動態定義的XML元素主體
jsp:text
用於編寫模板文本在JSP頁面和文檔
我們將在單獨的章節解釋JSP動作 JSP動作
JSP 隱式對象:
JSP支持九種自動定義的變量,這也被稱爲隱式對象。這些變量是:
對象
描述
request
這是與請求相關聯的HttpServletRequest對象
response
這是用於響應客戶端相關聯的HttpServletResponse對象
out
這是用於將輸出發送給客戶端的PrintWriter對象
session
這是與請求相關聯的HttpSession對象
application
這是應用程序上下文關聯的ServletContext對象
config
這是與頁面關聯的ServletConfig對象
pageContext
這封裝採用類似更高的性能JspWriters服務器特定的功能
page
這是一個簡單的代名詞,是用來調用由轉換servlet類中定義的方法
Exception
Exception對象允許例外的數據由JSP指定訪問
我們將在單獨一章介紹JSP隱式對象 JSP隱式對象
控制流語句
JSP提供了Java的全部功能可以嵌入在Web應用程序。可以使用Java的所有API和構建塊在JSP編程,包括決策語句,循環等。
決策聲明
在if ... else塊開頭時就像一個普通的Scriptlet,但 Scriptlet 每一行是封閉的,包括scriptlet標記之間的HTML文本。創建一個JSP文件爲:if-else.jsp,並寫入以下代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%! int day = 3; %>IF...ELSE 示例 <% if (day \== 1 | day \== 7) { %>Today is weekend
<% } else { %>Today is not weekend
<% } %>在瀏覽器中打開網址:http://localhost:8080/jsp-base/if-else.jsp, 產生結果如下:
現在來看以下 switch...case 塊,編寫通過使用out.println()和內小腳本有一點不同,把下面代碼保存到 switch-case.jsp文件中,代碼詳細如下:
<%! int day = 3; %>
SWITCH...CASE 示例 <% switch(day) { case 0: out.println("It\\'s Sunday."); break; case 1: out.println("It\\'s Monday."); break; case 2: out.println("It\\'s Tuesday."); break; case 3: out.println("It\\'s Wednesday."); break; case 4: out.println("It\\'s Thursday."); break; case 5: out.println("It\\'s Friday."); break; default: out.println("It's Saturday."); } %>在瀏覽器中打開網址:http://localhost:8080/jsp-base/switch-case.jsp, 產生結果如下:
循環語句
還可以使用在Java中三種基本循環類型塊:for, while,and do.while 塊在JSP編程中。
讓我們來看看下面的for循環示例,把下面代碼保存到 loop-for.jsp 文件中,代碼詳細如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%! int fontSize; %>FOR 循環示例 <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %> JSP Tutorial
<%}%>在瀏覽器中打開網址:http://localhost:8080/jsp-base/loop-for.jsp, 產生結果如下:
上面的示例可以使用 while 循環編寫,把下面代碼保存到 loop-while.jsp 文件中,代碼詳細如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%! int fontSize; %>
WHILE循環示例 While循環示例:
<%while ( fontSize <= 5){ %> JSP Tutorial
<%fontSize++;%> <%}%>在瀏覽器中打開網址:http://localhost:8080/jsp-base/loop-while.jsp, 產生結果如下:
JSP 運算符
JSP支持所有支持Java的邏輯和算術運算符。下表給出了所有的運算符,具有最高優先級將排在表的頂部, 運算級別最低的放在底部。
在一個表達式中,具有更高的優先級運算符將首先計算評估。
分類
操作符
關聯
後綴
() [] . (點運算符)
左->右
一元
++ - - ! ~
右->左
乘法
* / %
左->右
加法
+ -
左->右
位移
>> >>> <<
左->右
關係
> >= < <=
左->右
相等
== !=
左->右
位與/AND
&
左->右
位XOR
^
左->右
位OR
|
左->右
邏輯AND
&&
左->右
邏輯OR
||
左->右
關係
?:
右->左
賦值
= += -= *= /= %= >>= <<= &= ^= |=
右->左
逗號
,
左->右
JSP 字面量
JSP表達式語言定義了以下字面量:
Boolean: true 或 false
Integer: 與Java中的一樣
Float: 與Java中的一樣
String: 單引號和雙引號; " 轉義爲 \"。' 轉義爲 \', 以及 \ 轉義爲 \\
Null: null
JSP對象範圍
定義爲一個 JSP 對象範圍
說明
JSP對象所使用的可用性通常是由該對象的範圍限定。
Page 範圍:
使用此JSP對象可以在其中創建的頁面內使用。
Request 範圍:
使用該JSP對象可以在請求服務任何地方使用。
Session 範圍:
使用該JSP的對象可用於在屬於同一個會話頁面。
Application 範圍:
使用該JSP的對象可以在整個應用程序頁面中使用。
將下面的代碼編寫到 scope1.jsp 文件,代碼內容如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="Pag" value="Page Value" scope="page" />
<c:set var="Req" value="Request Value" scope="request" />
<c:set var="Ses" value="Session Value" scope="session" />
<c:set var="App" value="Application Value" scope="application" />
JSP對象範圍示例一:
Page Scope ::Request Scope ::
Session Scope ::
Application Scope::
下一頁Session,Application範圍
在瀏覽器中打開網址: http://localhost:8080/jsp-base/scope1.jsp, 產生結果如下:
將下面的代碼編寫到 scope2.jsp 文件,代碼內容如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Page Scope ::Request Scope ::
Session Scope ::
Application Scope::
上面的代碼運行結果如下:
Page Scope ::
Request Scope ::
Session Scope ::Session Value
Application Scope ::Application Value
在上面的例子「scope1.jsp」中,變量在四個作用域設置的值都被顯示出來。當點擊一個鏈接,並跳轉到下一個頁面「scope2.jsp」只顯示會話和應用範圍的變量值,因爲第二頁沒有頁面,請求作用域。
在JSP頁面中創建方法
學習在一個JSP頁面裏面創建方法
解釋
方法即是可以在一個JSP頁面被用於執行特定操作的一個代碼段。
創建一個方法示例:
<%!
public int mul(int a, int b){
return a * b;
}
%>
兩個數相乘的結果是:<%= mul(2, 2) %>
以上代碼保存,並執行結果如下:
兩個數相乘的結果是:4
另外,在上述例子中使用的方法是:mul,將返回一個整數值作爲輸出。 它需要兩個整數「a」,「b」作爲參數,以產生兩個數字的乘積作爲輸出。
在JSP頁面中使用數組
如何在JSP頁面中使用數組?
解釋說明
由於JSP不是一個完整的編程語言不具有數組的聲明,但使用Java中的數據結構在JSP中使用是完全沒有問題的。
把下面的代碼保存到 array.jsp 文件中,啓動 Tomcat 容器,並在瀏覽器中找開網址測試顯示結果。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String[] arr={"apple","orange","cherry"};
%>
<%
int j;
out.println("
數組中所有元素是:
");for(j=0;j<arr.length;j++){
out.println(arr[j]);
}
%>
把上面的代碼保存到文件:arr_demo.jsp,並在瀏覽器中打開網址: http://localhost:8080/jsp-base/array.jsp,得到以下結果:
在這個例子中,已經聲明瞭一個字符串數組「arr」。使用for循環數組的每一個元素並顯示出來。
在JSP中使用Java Bean
如何在JSP中使用Java Bean?
Java bean只不過是一個實現java.io.Serializable接口,並且使用set/get方法來投射類的屬性。因爲它們是一個Java bean類的實例並可重複使用,在JSP頁面中提供了靈活性,。
嵌入一個Java bean到JSP網頁,有三個基本動作或標籤:jsp:useBean, jsp:setProperty, jsp:getProperty
jsp:useBean
這個標籤是用來給bean指定「id」和「scope」屬性相關聯。
jsp:setProperty
這個標籤被用於設置一個beans屬性的值,主要使用「name」屬性已經定義了相同的範圍對象。其他屬性是 "property", "param", "value"
jsp:getProperty
這個標籤是用來獲取引用Bean實例屬性並將其存儲到隱式out對象。
Beans的規則:
- 包應該是java bean的第一行
- Bean應該有一個空的構造
- 所有的bean中的變量應該設置有「get」,「set」方法。
- 屬性名應以大寫字母開頭在使用「set」,「get」方法時。
- 例如變量「名稱」的get,set方法就是getName(), setName(String)
- 設置方法應該返回像一個空(void)值: "return void()"
創建一個包,名稱是:pack,打開工程,在 jsp-base 工程下,右鍵 "src" -> "new" -> "Package",然後出現對話框,寫入包名:pack,如下所示:
現在在 pack 包創建一個類,類的名稱是:Counter,對應文件是:src/pack/Counter.java,文件的詳細代碼如下圖所示:
package pack;
public class Counter
{
int count = 0;
String name;
public Counter() { }
public int getCount()
{
return this.count;
}
public void setCount(int count){
this.count = count;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name=name;
}
}
創建一個文件:use-bean.jsp,其代碼內容如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page language="java" %>
<%@ page import="pack.Counter" %>