Java匹馬行天下之JavaWeb核心技術——JSP
JSP動態網頁技術
一、JavaWeb簡介
一、什麼是JavaWeb?
- JavaWeb是用Java技術來解決相關web網際網路領域的技術總稱。
- 需要在特定的web伺服器上執行,分為web伺服器和web客戶端兩部分
- 跨平臺,能夠在多個平臺下部署和執行
二、靜態網頁和動態網頁
- 靜態網頁:網頁中的內容是固定的,不會更新。
- 所用技術為html、css;
- 動態網頁:網頁中的內容通過程式動態顯示的,自動更新。
- 所用技術為html、css、資料庫、至少一門高階語言(Java、C#,PHP),JavaScript,XML等,主流的動態網頁尾本技術(jsp/Asp.net/php)
三、Tomcat伺服器目錄介紹
WEB-INF是Java的Web應用的安全目錄。所謂安全就是客戶端無法訪問,只有服務端可以訪問的目錄。
web.xml檔案是專案的部署檔案
classes資料夾,用於放置*.class檔案
lib資料夾,用於存放需要的jar包
如圖:
四、修改Tomcat伺服器預設埠
在Tomcat的安裝目錄下,找到conf-->server.xml檔案
找到Connector標籤
修改port屬性的值即可,埠修改完成後要記得儲存,並且重啟Tomcat伺服器。
二、JSP基礎學習
一、JSP簡介
JSP全名為Java Server Pages,其根本是一個簡化的Servlet設計,他實現了再Java當中使用HTML標籤。JSP是一種動態網頁技術標準也是JavaEE的標準。JSP與Servlet一樣,是在伺服器端執行的。
JSP實際上就是Servlet。JSP這門技術的最大的特點在於:寫jsp就像在寫html,但它相比html而言,html只能為使用者提供靜態資料,而Jsp技術允許在頁面中巢狀java程式碼,為使用者提供動態資料。
二、JSP的作用
- Servlet:伺服器端的小應用程式。適合編寫Java邏輯程式碼,如果編寫網頁內容------->費時費力,太苦
缺點:不適合設定HTML響應體,需要大量的
response.getWriter().print("<html>");
優點:動態資源,可以程式設計。
- HTML:靜態內容
缺點:HTML是靜態頁面,不能包含動態資訊;
優點:不用為輸出html標籤而發愁。
- jsp(java server pages):適合編寫輸出動態內容,但不適合編寫Java邏輯
優點:在原有HTML的基礎上新增java指令碼,構成jsp頁面。
三、JSP和Servlet的分工
- JSP
作為請求發起頁面,例如顯示錶單、超連結。
作為請求結束頁面,例如顯示資料。
- Servlet
作為請求中處理資料的環節
四、JSP的組成
jsp=html+java指令碼+jsp標籤(指令)
jsp中無需建立即可使用的物件一共有9個,稱為九大內建物件。
3種java指令碼:
- <%……%> java程式碼片段(常用),用於定義0-N條java語句,方法內寫什麼就可以在這裡寫什麼,不能宣告方法和類;
- <%=……%> java表示式,用於輸出(常用),用於輸出一條表示式(或變數)的結束,print()括號中引數可以放什麼,這裡就能放什麼;
- <%!……%> 宣告,用來建立類的成員變數和成員方法(基本不用),class A{ } 類體中可以放什麼,這裡就可以放什麼。
五、JSP的執行流程及原理
jsp其實是一種特殊的Servlet
- 當jsp頁面第一次被訪問時,伺服器會把jsp編譯成java檔案(這個java其實是一個Servlet類);
- 然後再把java編譯成.class;
- 然後建立該類物件;
- 最後呼叫它的service()方法;
- 第二次請求同一jsp時,直接呼叫service()方法。
- 在Tomcat的work目錄下可以找到jsp對應的.java原始碼。
1、IE瀏覽器在訪問JSP頁面時,Web伺服器是如何呼叫並執行一個jsp頁面的?(Servlet)
- 第一次:轉譯(翻譯) --> 編譯 --> 執行
- 第二次:執行
2、Web伺服器在執行jsp頁面時,是如何把Jsp頁面中的html排版標籤傳送到客戶端的?
- out.print("<......>"); 或者 out.write("<......>");
3、Jsp頁面中的java程式碼伺服器是如何執行的?
- 伺服器 --> .java檔案 --> .class檔案 --> 結果out回客戶端
4、Web伺服器在呼叫jsp時,會給jsp提供一些什麼java物件(內建物件)?
- HttpSession、ServletConfig、ServletContent、request、response、out等等。
六、JSP的基本語法
- Servlet:控制器。重點編寫java程式碼邏輯。(獲取表單資料、處理業務邏輯、分發轉向)
- JSP:程式碼顯示模板。重點在於顯示資料。(為什麼顯示資料不直接用.html檔案呢?因為.jsp檔案中可以插入java程式碼顯示回顯訊息,簡言之,jsp功能更強大)
1、JSP的模版元素:簡言之就是網頁的靜態內容
例如:html標籤和普通文字。
2、JSP的指令碼
- <%……%> java程式碼片段(常用),用於定義0-N條java語句,方法內寫什麼就可以在這裡寫什麼,不能宣告方法和類;
- <%=……%> java表示式,用於輸出(常用),用於輸出一條表示式(或變數)的結束,print()括號中引數可以放什麼,這裡就能放什麼;
<%= 2 + 3 %> 等價於out.print(2 + 3);
- <%!……%> 宣告,用來建立類的成員變數和成員方法(基本不用),class A{ } 類體中可以放什麼,這裡就可以放什麼。
3、註釋
JSP註釋:<%-- 被註釋的內容 --%> 特點:安全,省流量
網頁註釋:<!-- 網頁註釋 --> 特點:不安全,費流量
七、JSP的三個指令
JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分。
在JSP 2.0規範中共定義了三個指令:
- page指令(頁面級別)
- include指令(匯入其它頁面的資訊)
- taglib指令(標籤指令)
例如:
1、page
作用:page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面。
為了保持程式的可讀性和遵循良好的程式設計習慣,page指令最好是放在整個JSP頁面的起始位置。
屬性:
- import和java程式碼中的import是一樣的。
<%@ page import="java.util.Date, java.util.List" %>
或者:
<%@ page import="java.util.Date" %>
<%@ page import="java.util.List" %>
JSP會自動匯入(預設匯入)以下的包:
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
- session: 表示是否會自動建立session物件。其預設值是true。
- buffer: JSP中有javax.servlet.jsp.JspWriter輸出字元流。設定輸出資料的快取大小,預設大小是8kb。建議最好不要改大小。
- errorPage: 如果頁面中有錯誤,則跳轉到指定的資源。(即不讓頁面彈出404/500等錯誤)
errorPage="/uri"
如果寫"/"則代表當前應用的目錄下,絕對路徑。
如果不寫"/"則代表相對路徑。
- isErrorPage: 表示是否建立throwable物件。其預設值是false。作用:輸出頁面錯誤資訊:by zero
- contextType: contentType="text/html; charset=UTF-8" 告訴瀏覽器使用什麼編碼來解析文字。等同於 response.setContextType("text/html; charset=utf-8");
- pageEncoding: 告訴JSP引擎(伺服器)要轉譯(翻譯)的檔案使用的編碼。
例如:<%@ page pageEncoding="gbk" %>
- isELIgnored: 是否支援EL表示式。 預設是false,表示支援EL表示式。
例如:${1+1} 等價於out.print(1+1);
2、include
include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。
- 靜態包含:把其它資源包含到當前頁面中。
<%@ include file="/include/header.jsp" %>
- 動態包含:
<jsp:include page="/include/header.jsp"></jsp:include>
兩者的區別:轉譯(翻譯)的時間段不同
- 前者:在翻譯時就把兩個檔案合併
- 後者:不會合並檔案,當代碼執行到include時,才包含另一個檔案的內容。
使用原則:能用靜的就不用動的。原因之一是:可以省略一些程式碼的書寫。
3、taglib
JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。
Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。
Taglib指令的語法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首。
等價的XML語法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
作用:在JSP頁面中匯入JSTL標籤庫。替換jsp中的java程式碼片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> prefix:字首(相當於重新給uri起個名字)
示例:
<% if (5 > 3) { out.print(5); } %> <%-- 上下二種方式是等價的 --%> <c:if test="${5>3}"> aaa </c:if>
下面的這種方式很好用!後面慢慢體會。
八、JSP的動作
使用標籤的形式來表示一段java程式碼。
JSP行為標籤使用XML語法結構來控制servlet引擎。它能夠動態插入一個檔案,重用JavaBean元件,引導使用者去另一個頁面,為Java外掛產生相關的HTML等等。
行為標籤只有一種語法格式,它嚴格遵守XML標準:
<jsp:action_name attribute="value" />
行為標籤基本上是一些預先就定義好的函式,下表羅列出了一些可用的JSP行為標籤:
九、JSP的九個內建物件
指在JSP的<%=%> 和<% %>中可以直接使用的物件,伺服器給我們建立好的物件,直接拿過來用就行了。
例如:
<%=request.getParameter("name") %> <% Student stu = new Student(); stu.setName("tom"); out.print(stu.getName()); // request.getRequestDispatcher("/7.jsp").forward(request, response); %>
十、JSP客戶端請求
HttpServletRequest類
request物件是javax.servlet.http.HttpServletRequest類的例項。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的物件來代表這個請求。
request物件提供了一系列方法來獲取HTTP資訊頭,包括表單資料,cookies,HTTP方法等等。
接下來將會介紹一些在JSP程式設計中常用的獲取HTTP資訊頭的方法。詳細內容請見下表:
HTTP資訊頭示例
在這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP資訊頭。這個方法以列舉的形式返回當前HTTP請求的頭資訊。
獲取Enumeration物件後,用標準的方式來遍歷Enumeration物件,用hasMoreElements()方法來確定什麼時候停止,用nextElement()方法來獲得每個引數的名字
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h2>HTTP 頭部請求例項</h2> <table width="100%" border="1" align="center"> <tr bgcolor="#949494"> <th>Header Name</th><th>Header Value(s)</th> </tr> <% Enumeration headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String paramName = (String)headerNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\n"); String paramValue = request.getHeader(paramName); out.println("<td> " + paramValue + "</td></tr>\n"); } %> </table> </body> </html>
十一、JSP伺服器響應
HttpServletResponse類
response 物件是 javax.servlet.http.HttpServletResponse 類的一個例項。就像伺服器會建立request物件一樣,它也會建立一個客戶端響應。
response物件定義了處理建立HTTP資訊頭的介面。通過使用這個物件,開發者們可以新增新的cookie或時間戳,還有HTTP狀態碼等等。
下表列出了用來設定HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:
HTTP響應頭程式示例
接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鐘:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鳥教程(runoob.com)</title> </head> <body> <h2>自動重新整理例項</h2> <% // 設定每隔5秒自動重新整理 response.setIntHeader("Refresh", 5); // 獲取當前時間 Calendar calendar = new GregorianCalendar(); String am_pm; int hour = calendar.get(Calendar.HOUR); int minute = calendar.get(Calendar.MINUTE); int second = calendar.get(Calendar.SECOND); if(calendar.get(Calendar.AM_PM) == 0) am_pm = "AM"; else am_pm = "PM"; String CT = hour+":"+ minute +":"+ second +" "+ am_pm; out.println("當前時間: " + CT + "\n"); %> </body> </html>
此篇是我在學習過程中參考菜鳥教程以及筆記和別人部落格(黑澤君)完成
Java匹馬行天下依舊在更新中,歡迎大家關注,感覺可以的可以點選一下推薦,若如有誤,感謝指正,謝