JavaWeb – JSP:概述和語(yǔ)法,內(nèi)置對(duì)象,JavaBean 組件,MVC(javaweb中jsp)
jsp 的概述
概念
JSP 是 Java Server Pages 的簡(jiǎn)稱,跟 servlet 一樣可以動(dòng)態(tài)生成 html 響應(yīng), JSP 文件命名為 xxx.jsp。
與 Servlet 不同,JSP 文件以 HTML 標(biāo)記為主,然后內(nèi)嵌 Java 代碼段,用于處理動(dòng)態(tài)內(nèi)容。
示例
<%@ page import="java.util.Date" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <title>Hello Time</title> </head> <body> 現(xiàn)在的時(shí)間是:<%= new Date()%> </body></html>
JSP 與 Servlet 的關(guān)系
- JSP 在靜態(tài) HTML 內(nèi)容中嵌入 Java 代碼,Java 代碼被動(dòng)態(tài)執(zhí)行后生成 HTML 內(nèi)容;Servlet 在 Java 代碼中通過(guò) HttpServletResponse 對(duì)象動(dòng)態(tài)輸出 HTML 內(nèi)容。
- JSP 經(jīng)編譯后就變成了 Servlet。JSP 的本質(zhì)就是 Servlet,JVM 只能識(shí)別 Java 的類,不能識(shí)別 JSP 的代碼,Web 容器將 JSP 的代碼編譯成 JVM 能夠識(shí)別的 Java 類。
- JSP 更擅長(zhǎng)表現(xiàn)于頁(yè)面顯示,servlet 更擅長(zhǎng)于邏輯控制。
- Web 瀏覽器發(fā)送 HTTP 請(qǐng)求到服務(wù)端,被 Servlet 獲取并進(jìn)行處理(例如參數(shù)解析、請(qǐng)求轉(zhuǎn)發(fā));Servlet 調(diào)用核心業(yè)務(wù)邏輯獲得處理結(jié)果;Servlet 將邏輯處理結(jié)果交給 JSP,動(dòng)態(tài)輸出 HTML 內(nèi)容;動(dòng)態(tài)生成的 HTML 內(nèi)容返回到瀏覽器顯示。
JSP 的語(yǔ)法
JSP 語(yǔ)法結(jié)構(gòu)
聲明區(qū),程序代碼區(qū),表達(dá)式,注釋,指令和動(dòng)作,內(nèi)置對(duì)象
聲明區(qū)
基本語(yǔ)法:<%! %>
可以定義全局變量、方法、類。
<%! int i; public void setName(){ ... }%>
程序代碼區(qū)
基本語(yǔ)法:<% 程序代碼區(qū) %>
可以定義局部變量以及放入任何的Java程序代碼。
<% int j; for (int k=0; k<10; k ) { ... }%>
表達(dá)式
基本語(yǔ)法:<%= %>
可以輸出一個(gè)變量或一個(gè)具體內(nèi)容,但 = 后面必須是字符串變量或者可以被轉(zhuǎn)換成字符串的表達(dá)式。
不需要以 ; 結(jié)束,因?yàn)橹挥幸恍小?/p>
<%= "hello world" %><%= i 1 %>
注釋
注釋的內(nèi)容不會(huì)被執(zhí)行。
<!-- HTML 文件的注釋,瀏覽器可以查看到 --><%-- JSP 文件的注釋,瀏覽器看不到 --%><% // Java 語(yǔ)言中的單行注釋,瀏覽器看不到 /* Java 語(yǔ)言中的多行注釋, 瀏覽器看不到 */%>
指令和動(dòng)作
指令格式:<%@指令 屬性=“屬性值” %>
指令的屬性可以設(shè)定多個(gè)。
JSP常用指令有:page、taglib、include。
page 指令
用于導(dǎo)包和設(shè)置一些頁(yè)面屬性,常用屬性如下:
- import 導(dǎo)入相應(yīng)的包,惟一允許在同一文檔中多次出現(xiàn)的屬性
- contentType 設(shè)置 Content-Type 響應(yīng)報(bào)頭,標(biāo)明即將發(fā)送到瀏覽器的文檔類型
- pageEncoding 設(shè)置頁(yè)面的編碼
- language 指定頁(yè)面使用的語(yǔ)言
- session 控制頁(yè)面是否參與 HTTP 會(huì)話
- errorPage 處理當(dāng)前頁(yè)面中拋出但未被捕獲的任何異常
- isErrorPage 當(dāng)前頁(yè)是否可以作為其他頁(yè)面的錯(cuò)誤處理頁(yè)面
taglib 指令
用來(lái)擴(kuò)展 JSP 程序的標(biāo)簽元素,引入其他功能的標(biāo)簽庫(kù)文件。
<!-- prefix 屬性用于指定庫(kù)前綴 --><!-- uri 屬性用于指定庫(kù)的標(biāo)識(shí) --> <%@taglib uri="tagLibary" prefix="prefix" %><!-- 引入第三方的標(biāo)簽庫(kù) --><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
include 指令
用于引入另一個(gè) JSP 程序或 HTML 文件等。
JSP 引擎會(huì)在 JSP 文件的轉(zhuǎn)換時(shí)期先把 ?le 屬性設(shè)定的文件包含進(jìn)來(lái),然后開始執(zhí)行轉(zhuǎn)換及編譯的工作。
<%@include file="被包含的文件地址" %>
jsp:include
jsp:include 動(dòng)作用于引入另一個(gè) JSP 程序或 HTML 文件等。
執(zhí)行到 include 時(shí),被 include 的文件才會(huì)被編譯。
如果 include 的是 jsp 文件,那它暫時(shí)不會(huì)被轉(zhuǎn)換成 Servlet 文件。
<jsp:include page="URLSpec" flush="true"/><jsp:include page="URLSpec" flush="true"> <jsp:param name="key" value="value"/></jsp:include>
include 指令和 jsp:include 動(dòng)作的區(qū)別
include 指令是在 JSP 程序的轉(zhuǎn)換時(shí)期就將 ?le 屬性所指定的程序內(nèi)容嵌入再編譯執(zhí)行(靜態(tài)包含)。
jsp:include 動(dòng)作在轉(zhuǎn)換時(shí)期是不會(huì)被編譯的,只有在客戶端請(qǐng)求時(shí)期被執(zhí)行到才會(huì)被動(dòng)態(tài)的編譯載入(動(dòng)態(tài)包含,推薦)。
jsp:forward
jsp:forward 動(dòng)作用于在 JSP 中實(shí)現(xiàn)轉(zhuǎn)發(fā),將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)指定的 JSP 程序或者 Servlet 中處理。
<jsp:forward page="urlSpec" flush="true"/><jsp:forward page="urlSpec"> <!-- 用于指定參數(shù)和其對(duì)應(yīng)的值 --> <jsp:param name="key" value="value"/></jsp:forward>
JSP 內(nèi)置對(duì)象
基本概念
在 JSP 程序中有 9 個(gè)內(nèi)置對(duì)象由容器為用戶進(jìn)行實(shí)例化,程序員可以不用定義就直接使用這些變量。
在 JSP 轉(zhuǎn)換成 Servlet 后,會(huì)自動(dòng)追加這些變量的定義,使用內(nèi)置對(duì)象可以簡(jiǎn)化 JSP 的開發(fā)。
out 內(nèi)置對(duì)象
該對(duì)象類型是 JSPWriter。
該對(duì)象是一個(gè)緩沖的輸出流,用來(lái)給客戶端輸出信息。
- void println(String x) 向客戶端輸出各種類型數(shù)據(jù)
- void newLine() 輸出一個(gè)換行符
- void close() 關(guān)閉輸出流
- int getBufferSize() 返回緩沖區(qū)的大小
- int getRemaining() 返回緩沖區(qū)中未使用的字節(jié)數(shù)
- void flush() 輸出緩沖區(qū)里的數(shù)據(jù)
- void clearBuffer() 清除緩沖區(qū)里的數(shù)據(jù),同時(shí)把數(shù)據(jù)輸出到客戶端
- void clear() 清除緩沖區(qū)里的數(shù)據(jù),但不把數(shù)據(jù)輸出到客戶端
request 內(nèi)置對(duì)象
該對(duì)象封裝的是調(diào)用 JSP 頁(yè)面的請(qǐng)求信息,它是 HttpServletRequest 接口的一個(gè)實(shí)例。
該對(duì)象的屬性值只在一個(gè)請(qǐng)求中保存。
- String getMethod() 返回客戶端向服務(wù)器端傳送數(shù)據(jù)的方式
- String getParameter(String name) 返回客戶端向服務(wù)器端傳送的參數(shù)值
- String[] getParameterValues(String name) 獲得指定參數(shù)的所有值
- String getRequestURI() 獲得請(qǐng)求地址
- String getRemoteAddr() 返回發(fā)送請(qǐng)求的客戶端或最后一個(gè)代理的 IP 地址
- int getRemotePort() 返回發(fā)送請(qǐng)求的客戶端或最后一個(gè)代理的端口號(hào)
- String getServerName() 獲取服務(wù)器的名字
- int getServerPort() 獲取服務(wù)器端的端口
- void setAttribute(String name, Object o) 在此請(qǐng)求中存儲(chǔ)屬性。屬性在請(qǐng)求之間重置
- Object getAttribute(String name) 將指定屬性的值作為對(duì)象返回,若不存在則返回空值
response 內(nèi)置對(duì)象
該對(duì)象作用是響應(yīng)信息,用于給客戶端輸出相應(yīng)的處理結(jié)果,它是 HttpServletResponse 接口的一個(gè)實(shí)例。
該對(duì)象經(jīng)常用于設(shè)置 HTTP 標(biāo)題,添加 cookie、設(shè)置響應(yīng)內(nèi)容的類型和狀態(tài)、發(fā)送 HTTP 重定向和編碼 URL。
- void addCookie(Cookie cookie) 添加一個(gè) Cookie 對(duì)象,用于在客戶端保存特定的信息
- void addHeader(String name, String value) 添加 HTTP 頭信息,該 Header 信息將發(fā)送到客戶端
- boolean containsHeader(String name) 判斷指定名字的 HTTP 文件頭是否存在
- void sendRedirect(String location) 重定向 JSP 文件
- void setContentType(String type) 設(shè)置類型與編碼方式
session 內(nèi)置對(duì)象
該對(duì)象表示瀏覽器和服務(wù)器之間的一次會(huì)話;一次會(huì)話可以包含多次請(qǐng)求,在多次請(qǐng)求之間可以借助 session 對(duì)象存儲(chǔ)信息,它是 HttpSession 類型的一個(gè)實(shí)例。
該對(duì)象的屬性值在一次會(huì)話范圍中保存,保存在服務(wù)器端,只要不關(guān)閉瀏覽器,默認(rèn)半個(gè)小時(shí)內(nèi)都可以訪問(wèn)。
- void setAttribute(String name, Object value) 使用指定的名稱將對(duì)象綁定到此會(huì)話
- Object getAttribute(String name) 返回在此會(huì)話中用指定名稱綁定的對(duì)象,如果沒(méi)有對(duì)象在該名稱下綁定則返回空值
application 內(nèi)置對(duì)象
該對(duì)象代表全局上下文,是一個(gè) web 程序的全局變量,它是 ServletContext 類型的一個(gè)實(shí)例。
該對(duì)象在整個(gè)服務(wù)器上保存數(shù)據(jù),所有用戶共享。
- void setAttribute(String name, Object object) 將對(duì)象綁定到此 servlet 上下文中的給定屬性名
- Object getAttribute(String name) 返回給定名稱的 servlet 容器屬性,若沒(méi)有該名稱的屬性返回 null
pageContext 內(nèi)置對(duì)象
該對(duì)象表示 JSP 頁(yè)面上下文,是 PageContext 類型的對(duì)象,可以使用這個(gè)對(duì)象來(lái)管理其他的隱含對(duì)象。
該對(duì)象只在一個(gè)頁(yè)面中保存數(shù)據(jù)。
- void setAttribute(String name, Object value, int scope) 使用適當(dāng)?shù)淖饔糜蛟O(shè)置指定的名稱和值
- Object getAttribute(String name, int scope) 返回指定作用域中名稱關(guān)聯(lián)的對(duì)象,若找不到則返回 null
- ServletRequest getRequest() 獲取請(qǐng)求對(duì)象
- ServletResponse getResponse() 獲取響應(yīng)對(duì)象
- HttpSession getSession() 獲取會(huì)話對(duì)象
- ServletCon?g getServletCon?g() 獲取配置對(duì)象
- JspWriter getOut() 獲取輸出對(duì)象
- Object getPage() 獲取頁(yè)面對(duì)象
- Exception getException() 獲取異常對(duì)象
page 內(nèi)置對(duì)象
該對(duì)象的類型是 Object。
該對(duì)象是 JSP 頁(yè)面本身。
config 內(nèi)置對(duì)象
該對(duì)象的類型是 ServletCon?g。
該對(duì)象是 Servlet 配置對(duì)象。
exception 內(nèi)置對(duì)象
該對(duì)象是 Throwable 的實(shí)例,表示的是 JSP 的異常信息,作用是捕獲網(wǎng)頁(yè)異常。
如果要使用它,必須將跳轉(zhuǎn)的錯(cuò)誤頁(yè)面(如 error.jsp)的 page 指令的 isErrorPage 屬性設(shè)置成 true。
單個(gè)頁(yè)面的處理方式:
<%@page errorPage="error.jsp" %>
在 web.xml 中配置統(tǒng)一的異常處理頁(yè)面:
<error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location></error-page>
JavaBean 組件
基本概念
JavaBean 是使用 Java 語(yǔ)言開發(fā)的一個(gè)可重用的組件,在 JSP 開發(fā)中可以使用 JavaBean 減少重復(fù)代碼,使整個(gè) JSP 代碼的開發(fā)更加簡(jiǎn)潔。
JavaBean 本質(zhì)上就是 Java 類,通常要求如下:
- 屬性 – 全部私有化,通過(guò) get 和 set 方法進(jìn)行訪問(wèn)。
- 方法 – 必須是 public 關(guān)鍵字修飾。
- 構(gòu)造器 – 必須有無(wú)參構(gòu)造方法。
使用方式
使用 jsp:useBean 的方式創(chuàng)建 javaBean 實(shí)例;保存范圍有 page|request|sessin|application,默認(rèn)為 page 范圍。
<jsp:useBean id="對(duì)象名" scope="保存范圍" class="包名.類名" />
使用 jsp:setProperty 的方式設(shè)置 javaBean 的屬性值。
<jsp:setProperty name="對(duì)象名" property="屬性名" value="屬性值" param="參數(shù)名"/>
使用 jsp:getProperty 的方式獲取 javaBean 的屬性值。
<jsp:getProperty name="對(duì)象名" property="屬性名"/>
保存范圍
JavaBean 的保存范圍有 page、request、session 以及 application,默認(rèn)是 page 范圍。
刪除方式
<% 內(nèi)置對(duì)象.removeAttribute(“JavaBean 的名字”); %>
MVC 設(shè)計(jì)模式
基本概念
MVC 是模型(Model)和視圖(View)以及控制器(Controller)的簡(jiǎn)寫,是一種將數(shù)據(jù)、界面顯示和業(yè)務(wù)邏輯進(jìn)行分離的組織方式,這樣在改進(jìn)界面及用戶交互時(shí),不需要重新編寫業(yè)務(wù)邏輯,從而提高了代碼的可維護(hù)性。
M:主要用于封裝業(yè)務(wù)數(shù)據(jù)的 JavaBean(Bean) 和 業(yè)務(wù)邏輯的 JavaBean(Service) 及訪問(wèn)數(shù)據(jù)庫(kù)的 DAO 對(duì)象。
V:主要負(fù)責(zé)數(shù)據(jù)收集和數(shù)據(jù)展現(xiàn),通常由 JSP 文件完成。
C:主要負(fù)責(zé)流程控制和頁(yè)面跳轉(zhuǎn),通常由 Servlet 完成。
基本模型
- 瀏覽器發(fā)起請(qǐng)求;
- Servlet 接受處理請(qǐng)求,通過(guò) JavaBean 封裝業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯;
- Servlet 通過(guò) Dao 對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)把數(shù)據(jù)以 JavaBean 的形式發(fā)給 Servlet;
- Servlet 對(duì)數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯處理并將結(jié)果發(fā)給 JSP;
- JSP 動(dòng)態(tài)輸出 HTML 頁(yè)面到瀏覽器。
想了解更多,歡迎關(guān)注我的微信公眾號(hào):Renda_Zhang