1 JSP基礎
1.1 JSP簡介
JSP全稱是Java Server Page,它和Servlet一樣,也是sun公司推出的一套開發(fā)動態(tài)web資源的技術(shù),稱為JSP/Servlet規(guī)范。JSP的本質(zhì)其實就是一個Servlet。
1.2 JSP和HTML以及Servlet的適用場景
類別 | 適用場景 |
---|
HTML | 只能開發(fā)靜態(tài)資源,不能包含java代碼,無法添加動態(tài)數(shù)據(jù)。 |
Servlet | 寫java代碼,可以輸出頁面內(nèi)容,但是很不方便,開發(fā)效率極低。 |
JSP | 它包括了HTML的展示技術(shù),同時具備Servlet輸出動態(tài)資源的能力。但是不適合作為控制器來用。 |
1.3 JSP簡單入門
創(chuàng)建JavaWeb工程
在index.jsp中填寫內(nèi)容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP的入門</title>
</head>
<body>
這是第一個JSP頁面
</body>
</html>
部署項目
沿用會話管理工程的部署方式即可。
測試運行
1.4 JSP說明
寫在之前: 明確JSP就是一個Servlet。是一個特殊的Servlet。
JSP的原理:
? 客戶端提交請求
? ——Tomcat服務器解析請求地址
? ——找到JSP頁面
? ——Tomcat將JSP頁面翻譯成Servlet的java文件
? ——將翻譯好的.java文件編譯成.class文件
? ——返回到客戶瀏覽器上。
1)執(zhí)行過程分析圖
2)JSP的.java文件內(nèi)容分析(看不懂跳過,反jsp本質(zhì)就是servlet)
當我們打開index.jsp翻譯的java文件看到的就是public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
類的聲明,然后我們在Tomcat的源碼中找到類的聲明,如下圖:
這張圖一出場,就表明我們寫的JSP它本質(zhì)就是一個HttpServlet了。
同時,我們在index_jsp.java文件中找到了輸出頁面的代碼,并且在瀏覽器端查看源文件,看到的內(nèi)容是一樣的。這也就是說明,我們的瀏覽器上的內(nèi)容,在通過jsp展示時,本質(zhì)都是用out.write()輸出出來的。
講到這里,我們應該清楚的認識到,JSP它是一個特殊的Servlet,主要是用于展示動態(tài)數(shù)據(jù)。它展示的方式是用流把數(shù)據(jù)輸出出來,而我們在使用JSP時,涉及HTML的部分,都與HTML的用法一致,這部分稱為jsp中的模板元素,在開發(fā)過程中,先寫好這些模板元素,因為它們決定了頁面的外觀。
2 JSP應用
2.1 JSP語法
1)Java代碼塊
在jsp中,可以使用java腳本代碼。形式為:<% 此處寫java代碼 %>
但是,在實際開發(fā)中,極少使用此種形式編寫java代碼。同時需要注意的是:
<%
在里面寫java程序腳本需要注意:這里面的內(nèi)容由tomcat負責翻譯,翻譯之后是service方法的成員變量
%>
示例:
<!--Java代碼塊-->
<% out.println("這是Java代碼塊");%>
<hr/>
2)JSP表達式
在jsp中,可以使用特定表達式語法,形式為:<%=表達式%>
jsp在翻譯完后是out.print(表達式內(nèi)容);
所以:<%out.print("當前時間);%>
和<%="當前時間"%>
是一樣的。
在實際開發(fā)中,這種表達式語法用的也很少使用。
示例:
<!--JSP表達式-->
<%="這是JSP表達式"%><br/>
就相當于<br/>
<%out.println("這是沒有JSP表達式輸出的");%>
3)JSP聲明
在JSP中也可以聲明一些變量,方法,靜態(tài)方法,形式為:<%! 聲明的內(nèi)容 %>
使用JSP聲明需要注意:
<%!
需要注意的是: 寫在里面的內(nèi)容將會被tomcat翻譯成全局的屬性或者類方法。
%>
示例:
<!--JSP聲明-->
<%! String str = "聲明語法格式";%>
<%=str%>
4)JSP注釋
在使用JSP時,它有自己的注釋,形式為:<%–注釋–%>
需要注意的是:
? 在Jsp中可以使用html的注釋,但是只能注釋html元素,不能注釋java程序片段和表達式。同時,被html注釋部分會參與翻譯,并且會在瀏覽器上顯示
? jsp的注釋不僅可以注釋java程序片段,也可以注釋html元素,并且被jsp注釋的部分不會參與翻譯成.java文件,也不會在瀏覽器上顯示。
示例:
<%--JSP注釋--%>
<!--HTML注釋-->
5)語法的示例
JSP語法完整示例代碼
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP語法</title>
</head>
<body>
<!--Java代碼塊-->
<% out.println("這是Java代碼塊");%>
<hr/>
<!--JSP表達式-->
<%="這是JSP表達式"%><br/>
就相當于<br/>
<%out.println("這是沒有JSP表達式輸出的");%>
<hr/>
<!--JSP聲明-->
<%! String str = "聲明語法格式";%>
<%=str%>
<hr/>
<%--JSP注釋--%>
<!--HTML注釋-->
</body>
</html>
JSP語法運行結(jié)果
2.2 JSP指令
1)page指令
-
language: 告知引擎,腳本使用的是java,默認是java,支持java。不寫也行。
-
extends:告知引擎,JSP對應的Servlet的父類是哪個,不需要寫,也不需要改。
-
import:告知引擎,導入哪些包(類)。
注意:
引擎會自動導入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*
?導入的形式: (用Eclipse:Alt+/ 自動導入)
?<%@page import=”java.util.Date,java.util.UUID”%>
或者:
?<%@page import=”java.util.Date”%>
?<%@page import=”java.util.UUID”%>
-
session:告知引擎是否產(chǎn)生HttpSession對象,即是否在代碼中調(diào)用request.getSession()。默認是true。
-
buffer:JspWriter用于輸出JSP內(nèi)容到頁面上。告知引擎,設定他的緩存大小。默認8kb。
-
errorPage:告知引擎,當前頁面出現(xiàn)異常后,應該轉(zhuǎn)發(fā)到哪個頁面上(路徑寫法:/代表當前應用)
小貼士:當在errorpage上使用了isErrorPage=true之后,ie8有時候不能正常顯示
? 配置全局錯誤頁面:web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
?當使用了全局錯誤頁面,就無須再寫errorPage來實現(xiàn)轉(zhuǎn)到錯誤頁面,而是由服務器負責跳轉(zhuǎn)到錯誤頁面。
-
isErrorPage:告知引擎,是否抓住異常。如果該屬性為true,頁面中就可以使用exception對象,打印異常的詳細信息。默認值是false。
-
contentType:告知引擎,響應正文的MIME類型。contentType="text/html;charset=UTF-8"
?相當于response.setContentType("text/html;charset=UTF-8");
-
pageEncoding:告知引擎,翻譯jsp時(從磁盤上讀取jsp文件)所用的碼表。pageEncoding="UTF-8"相當于告知引擎用UTF-8讀取JSP
-
isELIgnored:告知引擎,是否忽略EL表達式,默認值是false,不忽略。
2)include指令
語法格式:<%@include file="" %>
該指令是包含外部頁面。
屬性:file,以/開頭,就代表當前應用。
使用示例
在編譯成的java servlet文件中是這樣的,也就是說,include.jsp 后續(xù) 代碼可以直接使用 included.jsp 中的 str變量。
3)taglib指令
語法格式:<%taglib uri="" prefix=""%>
作用:該指令用于引入外部標簽庫。html標簽和jsp標簽不用引入。
屬性:
-
uri
:外部標簽的URI地址。
-
prefix
:使用標簽時的前綴。
2.3 JSP細節(jié)
1)九大隱式對象
什么是隱式對象呢?它指的是在jsp中,可以不聲明就直接使用的對象。
它只存在于jsp中,因為java類中的變量必須要先聲明再使用。
其實jsp中的隱式對象也并非是未聲明,只是它是在翻譯成.java文件時聲明的。所以我們在jsp中可以直接使用。
也就是說下面的對象在jsp中可以直接使用。
隱式對象名稱 | 類型 | 備注 |
---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | Page指令可以控制開關(guān) |
application | javax.servlet.ServletContext | |
page | Java.lang.Object | 當前jsp對應的servlet引用實例 |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | page指令有開關(guān) |
out | javax.servlet.jsp.JspWriter | 字符輸出流,相當于printwriter |
pageContext | javax.servlet.jsp.PageContext | 很重要(下面單獨介紹) |
2)PageContext對象
簡介
它是JSP獨有的對象,Servlet中沒有這個對象。本身也是一個域(作用范圍)對象,但是它可以操作其他3個域?qū)ο笾械膶傩?。而且還可以獲取其他8個隱式對象。
生命周期
它是一個局部變量,所以它的生命周期隨著JSP的創(chuàng)建而誕生,隨著JSP的結(jié)束而消失。每個JSP頁面都有一個獨立的PageContext。
常用方法
在上圖中,同學們發(fā)現(xiàn)沒有頁面域操作的方法,其實是定義在了PageContext的父類JspContext中,如下圖所示:
3)四大域?qū)ο?/h4>
域?qū)ο竺Q | 范圍 | 級別 | 備注 |
---|
PageContext | 頁面范圍 | 最小,只能在當前頁面用 | 因范圍太小,開發(fā)中用的很少 |
ServletRequest | 請求范圍 | 一次請求或當期請求轉(zhuǎn)發(fā)用 | 當請求轉(zhuǎn)發(fā)之后,再次轉(zhuǎn)發(fā)時請求域丟失 |
HttpSession | 會話范圍 | 多次請求數(shù)據(jù)共享時使用 | 多次請求共享數(shù)據(jù),但不同的客戶端不能共享 |
ServletContext | 應用范圍 | 最大,整個應用都可以使用 | 盡量少用,如果對數(shù)據(jù)有修改需要做同步處理 |
4)四大域?qū)ο笞饔梅秶?/h4>
pageContext
作用范圍:當前jsp頁面;
作用:獲取九大內(nèi)置對象;
常用方法:getAttribute()、setAttribute()、removeAttribute()、findAttribute()
httpServletRequest
作用范圍:一次請求范圍內(nèi),轉(zhuǎn)發(fā)有效重定向失效;
作用:將servlet中的數(shù)據(jù)通過request對象帶到jsp頁面;
httpSession
作用范圍:存活時間內(nèi)(默認30分鐘),一次會話內(nèi)有效,轉(zhuǎn)發(fā)和重定向都有效;
servletContext
作用范圍:整個web應用;
在jsp的九大內(nèi)置對象中,servletContext
對應application
;
2.4 JSP最佳實戰(zhàn)效果——MVC模型
-
M:model ,通常用于封裝數(shù)據(jù),封裝的是數(shù)據(jù)模型。
-
V:view ,通常用于展示數(shù)據(jù)。動態(tài)展示用jsp頁面,靜態(tài)數(shù)據(jù)展示用html。
-
C:controller ,通常用于處理請求和響應。一般指的是Servlet。
Servlet:擅長處理業(yè)務邏輯,不擅長輸出顯示界面。在web開發(fā)中多用于控制程序邏輯(流程)。所以我們稱之為:控制器。
JSP:擅長顯示界面,不擅長處理程序邏輯。在web開發(fā)中多用于展示動態(tài)界面。所以我們稱之為:視圖。
例如: