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第一個應用:
運行工程,右鍵點擊工程名稱 ”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 </jsp:scriptlet>
寫的任何文本,HTML標簽或JSP元素一定在腳本之外。以下是簡單第一個JSP的例子:
<html> <head><title>Hello World - By gitbook.net</title></head> <body> Hello World!<br/> <% out.println("Your IP address is " + request.getRemoteAddr()); %> </body> </html>
現在我們來創建一個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:declaration>
下麵是簡單的例子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:expression>
這裡創建一個新的工程:jsp-base,並在index.jsp文件中寫入以下代碼,下麵是簡單的例子JSP表達式:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP表達式 - by gitbook.net</title> </head> <body> <p> 今天是:<%=(new java.util.Date()).toLocaleString()%> </p> </body> </html>
打開瀏覽器,輸入網址: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"%> <html> <head><title>注釋 - 示例</title></head> <body> <h2>A Test of Comments</h2> <%-- This comment will not be visible in the page source --%> </body> </html>
http://localhost:8080/jsp-base/comment.jsp
-
還有少數特殊的結構可以使用一些情況,插入注釋或字符,將被特殊處理。這裡有一個整理彙總:
語法 目的 <%-- comment --%> JSP注釋,它將被JSP引擎忽略 <!-- comment --> 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; %> <html> <head><title>IF...ELSE 示例</title></head> <body> <% if (day == 1 | day == 7) { %> <p> Today is weekend</p> <% } else { %> <p> Today is not weekend</p> <% } %> </body> </html>
在瀏覽器中打開網址:http://localhost:8080/jsp-base/if-else.jsp, 產生結果如下:
現在來看以下 switch...case 塊,編寫通過使用out.println()和內小腳本有一點不同,把下麵代碼保存到 switch-case.jsp文件中,代碼詳細如下:
<%! int day = 3; %> <html> <head><title>SWITCH...CASE 示例</title></head> <body> <% 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."); } %> </body> </html>
在瀏覽器中打開網址: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; %> <html> <head><title>FOR 循環示例</title></head> <body> <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %> <font color="green" size="<%= fontSize %>"> JSP Tutorial </font><br /> <%}%> </body> </html>
在瀏覽器中打開網址:http://localhost:8080/jsp-base/loop-for.jsp, 產生結果如下:
上麵的示例可以使用 while 循環編寫,把下麵代碼保存到 loop-while.jsp 文件中,代碼詳細如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%! int fontSize; %> <html> <head><title>WHILE循環示例</title></head> <body> <h2>While循環示例:</h2> <%while ( fontSize <= 5){ %> <font color="green" size="<%= fontSize %>"> JSP Tutorial </font><br /> <%fontSize++;%> <%}%> </body> </html>
在瀏覽器中打開網址: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 對象範圍
<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" />
<html>
<body>
<h2>JSP對象範圍示例一:</h2>
<b>Page Scope</b> ::<c:out value="${Pag}" /><br>
<b>Request Scope</b> ::<c:out value="${Req}" /><br>
<b>Session Scope</b> ::<c:out value="${Ses}" /><br>
<b>Application Scope</b>::<c:out value="${App}" /><br>
<a href="scope2.jsp">下一頁Session,Application範圍</a>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<b>Page Scope</b> ::<c:out value="${Pag}" /><br>
<b>Request Scope</b> ::<c:out value="${Req}" /><br>
<b>Session Scope</b> ::<c:out value="${Ses}" /><br>
<b>Application Scope</b>::<c:out value="${App}" /><br>
</body>
</html>
上麵的代碼運行結果如下:
Request Scope ::
Session Scope ::Session Value
Application Scope ::Application Value
在JSP頁麵中創建方法
學習在一個JSP頁麵裡麵創建方法
<%!
public int mul(int a, int b){
return a * b;
}
%>
兩個數相乘的結果是:<%= mul(2, 2) %>
以上代碼保存,並執行結果如下:
在JSP頁麵中使用數組
如何在JSP頁麵中使用數組?
<%
String[] arr={"apple","orange","cherry"};
%>
<%
int j;
out.println("<p>數組中所有元素是:</p>");
for(j=0;j<arr.length;j++){
out.println(arr[j]);
}
%>
在JSP中使用Java Bean
如何在JSP中使用Java Bean?
嵌入一個Java bean到JSP網頁,有三個基本動作或標簽:<jsp:useBean>, <jsp:setProperty>, <jsp:getProperty>
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
這個標簽是用來獲取引用Bean實例屬性並將其存儲到隱式out對象。Beans的規則:
- 包應該是java bean的第一行
- Bean應該有一個空的構造
- 所有的bean中的變量應該設置有“get”,“set”方法。
- 屬性名應以大寫字母開頭在使用“set”,“get”方法時。
- 例如變量“名稱”的get,set方法就是getName(), setName(String)
- 設置方法應該返回像一個空(void)值: "return void()"
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" %>
<%@ page import="pack.Counter" %>
</body>
<jsp:useBean id="counter" scope="page" class="pack.Counter" />
<jsp:setProperty name="counter" property="count" value="4" />
Get Value: <jsp:getProperty name="counter" property="count" /><BR>
<jsp:setProperty name="counter" property="name" value="gitbook.net" />
Get Name: <jsp:getProperty name="counter" property="name" /><BR>
另外,在上述示例正在包含的是Counter.java,已為“counter”,“name”屬性定義對象的set/get方法。使用 use-bean.jsp頁麵使用<jsp:useBean>動作包含第一個bean,使用<jsp;setProperty>設置屬性 "counter" 的值為 "4" ,以及設置 "name" 的值為 "gitbook.net". 並使用 <jsp:getProperty> 來獲取它們的值。
JSP Session
在 JSP中如何處理 Session 數據?
解釋說明
- JSP中每當發起一個請求,服務器產生一個存儲在客戶機的唯一會話ID。
- Cookies存儲信息在客戶端瀏覽器
- URL重寫會話信息附加到URL的末尾
- 隱藏的表單域將SessionID嵌入到GET和POST命令。
<html>
<head><title>Session示例</title></head>
<body>
<h2>Session示例:</h2>
<form method = "post" action="session2.jsp">
<font>Username<input type = "text" name = "name"></font>
</font><br><br>
<input type = "submit" name = "submit" value = "提交" >
</form>
</body>
</html>
創建另一個頁麵 session2.jsp,代碼如下:
<html>
<%
String name = request.getParameter("name");
if((name!=null))
{
session.setAttribute("username",name);
}
%>
<a href="session3.jsp">繼續,跳轉到session3.jsp</a>
創建另一個頁麵 session3.jsp,代碼如下:
<html>
<head><title>Session示例3</title></head>
<body>
<font>歡迎您,</font> <%= session.getAttribute("username") %>
</body>
</html>
在第一個示例中的 "session1.jsp" 是用來提供一個表單以獲得用戶名。 當提交表單時它轉到第二個文件session2.jsp,它調用表單的“action”屬性。一個Session的屬性使用 "session.setAttribute"設置在這裡. 在第三個文件 "session3.jsp" 相同的值使用"session.getAttribute" 來顯示出來。
JSP Cookies信息處理
在JSP中如何處理 Cookies ?
解釋說明
<html>
<body>
<form method = "post" action="cookie2.jsp">
<font>Username<input type = "text" name = "name"></font>
</font><br>
<input type = "submit" name = "submit" value = "submit" >
</form>
</body>
</html>
<%@ page language="java" import="java.util.*"%>
<%
String name=request.getParameter("name");
Cookie cookie = new Cookie ("name",name);
response.addCookie(cookie);
cookie.setMaxAge(50 * 50); //Time is in Minutes
%>
<a href="cookie3.jsp">Continue</a>
示例代碼: cookie3.jsp
<p>顯示Cookie的值:</p>
<%
Cookie[] cookies = request.getCookies();
for (int i=0; i<cookies.length; i++){
if(cookies[i].getName().equals("name"))
out.println("Hello"+cookies[i].getValue());
}
%>
在第一個例子“cookie1.jsp”中,使用表單得到用戶名。當表單提交進入第二頁“cookie2.jsp”其中Cookie使用“cookie.setMaxAge”函數設置過期時間。在第三個頁麵“cookie3.jsp”中,cookie使用函數“request.getCookies()”,並使用循環是得到了字段“username”的值並顯示。在瀏覽器中輸入網址:http://localhost:8080/jsp-base/cookie1.jsp ,測試輸出結果如下:
刪除Cookies
示例代碼: cookie4.jsp
Cookie cookie = new Cookie( "name", "" );
cookie.setMaxAge( 0 );
%>
另外,在上述例子中,我們已經創建的cookie的新實例並使用一個“null”值並將cookie的age設定為“0”。 這將刪除cookie。
在JSP中使用包
如何在JSP中使用包? 這裡給出一個示例...
解釋說明
pack-demo.jsp
JSP中使用包 - 示例
Counter.java
package mypack; public class Display { public String echoVar(String var) { return var; } }在上麵的例子中,我們使用包“mypack”中的類“Counter”。在這個例子中,我們在包創建一個類“Counter”,並實例化一個實例使用“echovar”方法中顯示輸入的文本。在瀏覽器中輸入網址:http://localhost:8080/jsp-base/pack-demo.jsp ,測試輸出結果如下: