三分鐘玩轉(zhuǎn)JSP
時間:2023-05-06 17:45:02 | 來源:網(wǎng)站運營
時間:2023-05-06 17:45:02 來源:網(wǎng)站運營
三分鐘玩轉(zhuǎn)JSP:
一,簡介
JSP:Java Server Page SUN 公司提供的 動態(tài)網(wǎng)頁編程技術(shù),是 Java Web 服務(wù)器端的 動態(tài)資源。它相比 html 而言,html 只能為用戶提供靜態(tài)數(shù)據(jù),而 Jsp 技術(shù)允許在頁面中嵌套 java 代碼,為用戶提供動態(tài)數(shù)據(jù)。相比 servlet 而言,servlet 很難對數(shù)據(jù)進行排版,而 jsp 除了可以用 java代碼產(chǎn)生動態(tài)數(shù) 據(jù)的同時,也很容易對數(shù)據(jù)進行排版。不管是 JSP 還是 Servlet,雖然都可以用于開發(fā)動態(tài) web 資源。但由于這 2門技術(shù)各自的特點,在長期的軟件實踐中,人們逐漸把 servlet 作為 web 應(yīng)用中的控制器組件來使用, 而把 JSP 技術(shù)作為數(shù)據(jù)顯示模板來使用。其實 Jsp 就是一個Servlet,當(dāng)我們第一次訪問 Jsp 的時候,Jsp 引擎都會將這個 Jsp 翻譯 成一個 Servlet,這個文件存放在 Tomcat 中的 work 目錄中。
二.基礎(chǔ)語法
1.注釋
在 JSP 中支持兩種注釋的語法操作,一種是顯示注釋,這種注釋是允許客戶端看見的; 另一種是隱式注釋,此種注釋是客戶端無法看見的
① 顯示注釋語法:從 HTML 風(fēng)格繼承而來
② 隱式注釋語法:從 JAVA 風(fēng)格繼承;JSP 自己的注釋
JSP 的三種注釋方式:
1) // 注釋,單行注釋 /* 多行注釋*/
2)<!-- HTML 風(fēng)格的注釋 -->
3)<%-- JSP 注釋 --%>
2. Scriptlet
在 JSP 中最重要的部分就是 Scriptlet( 腳本小程序), 所有嵌入在 HTML 代碼中的 Java 程序 都必須使用 Scriptlet 標(biāo)記出來,在 JSP 中一共有三種Scriptlet 代碼:
第一種:<% %>: java 腳本段,可以定義局部變量、編寫語句
第二種:<%! %>:聲明,可以定義全局(成員)變量、方法、類
第三種:<%= %>:表達式,數(shù)據(jù)一個變量或具體內(nèi)容
通過觀察解析為 java 文件的 jsp 代碼理解三種小腳本
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String str = "Hello JSP";
System.out.println(str);
response.getWriter().write(str);
%>
<%!String memberStr = "a member String";%>
<%=memberStr%>
<h1>This is a JSP page!!</h1>
</body>
</html>
3. JSP 的指令標(biāo)簽
JSP 的指令標(biāo)簽用來控制整個 jsp 的行為,就當(dāng)前 JSP 頁面的某些方面對JSP 轉(zhuǎn)換器作出指示。
1) page 指令
掌握使用 page 指令常用的屬性 contentType 和 pageEncoding,分別用來指定 MIME 類型 和編碼格式。import 屬性,用來引入其他包,和 java 中 import
語句作用相同。
MIME 類型
<%@ page contentType=”text/html;charset=UTF-8”%>
手誤<%@ page contentType=”test/html;charset=UTF-8”%>此時則變成下載文件字符編碼
contentType 主要的功能是用來設(shè)置 MIME(頁面響應(yīng)類型),而
charset=”UTF-8” 指定了編碼,利用 pageEncoding=”UTF-8”也能指定編碼,前者更常用。
在 JSP 中,如果 charset 存在,那么 JSP 的編碼由 charset 決定,而如果不存在才會由 pageEncoding 來決定,如果都不存在,則使用 ISO-8859-1 編碼。
導(dǎo)包
page 指令中存在 import 屬性,所以導(dǎo)包就可以正確使用了,在整個 page指令的屬性中, 只有 import 語句可以多次出現(xiàn),其他屬性都只能設(shè)置一次。能導(dǎo)包意味著可以直接在 jsp 中 鏈接數(shù)據(jù)庫。
<%@page import="java.util.*" import="java.io.*" %>
可以合為一句
<%@page import="java.util.* ,java.io.*" %>
2) include 靜態(tài)包含
<%@ include file=”要包含的文件路徑”%>相對路徑
<%@include file="include.jsp"%>
<%@include file="include.html"%>
靜態(tài)包含就是將內(nèi)容進行了直接的替換,就好比程序中定義的變量一樣是在 servlet 引擎轉(zhuǎn)譯時,就把此文件內(nèi)容包含了進去(兩個文件的源代碼整合到一起,全部放到_jspService 方法中),所以只生成了一個 servlet,所以兩個頁面不能有同名的變量。 運行效率高一點點。耦合性較高,不夠靈活。
3) taglib 導(dǎo)入標(biāo)簽庫
<%@taglib uri="
http://java.sun.com/jsp/jstl/core" prefix="c"%>
當(dāng)使用到第三方標(biāo)簽庫時需要通過 taglib 標(biāo)簽進行導(dǎo)入。
4. JSP 動作標(biāo)簽
動作標(biāo)簽,它們被編譯成執(zhí)行某個操作的 Java 代碼,例如訪問某個 Java 對象,或者調(diào)用某個方法。JSP 容器有自己支持的標(biāo)準動作。除標(biāo)準動作之外,還可以創(chuàng)建指定的標(biāo)簽, 用來執(zhí)行某些操作。這些 jsp 的動作標(biāo)簽,與 html 提供的標(biāo)簽有本質(zhì)的區(qū)別:
* 動作標(biāo)簽是由 tomcat(服務(wù)器)來解釋執(zhí)行!與 java 代碼一樣,都是在服務(wù)器端執(zhí)行
* html 由瀏覽器來執(zhí)行!
格式如下:
include 動態(tài)包含
include 動作用于動態(tài)地包含另一個資源,它可以包含另一個 JSP 頁面、一個 Servlet 或 者一個靜態(tài)的 HTML 頁面。使用包含操作,可以將一些重復(fù)的代碼包含進來繼續(xù)使用,從正常的頁面組成來看,有時可能分為幾個區(qū)域。而其中的一些區(qū)域可能是一直不需要改變的,
改變的就其中的一個具體內(nèi)容區(qū)域?,F(xiàn)在有兩種方法可以實現(xiàn)上述功能。
方法一:在每個 JSP 頁面(HTML)都包含工具欄、頭部信息、尾部信息、具體內(nèi)容
方法二:將工具欄、頭部信息、尾部信息都分成各個獨立的文件,以后使用的時候直接 導(dǎo)入進來很明顯,第二種方法比第一種更好,第一種會存在很多重復(fù)的代碼,并且修改很不方便,在 JSP 中如果要想實現(xiàn)包含的操作,有兩種做法: 靜態(tài)包含、 動態(tài)包含,靜態(tài)包含使用 include 指令即可,動態(tài)包含則需要使用 include 動作標(biāo)簽。
動態(tài)包含在代碼的編譯階段,包含和被包含部分是兩個獨立的部分,只有當(dāng)運行時,才會動態(tài)包含進來,好比方法的調(diào)用。
<jsp:include page="include.jsp"></jsp:include>
注意:動態(tài)包含,中間不要加任何內(nèi)容,包括空格,除非確認要使用參數(shù),否則報錯!
<jsp:include page="include.html"></jsp:include>
<%
String a = "hello.jsp";
%>
<jsp:include page="<%=a%>"></jsp:include>
使用動態(tài)包含還可以通過在頁面之間傳參。接收參數(shù)通過
request.getParameter(name)來完成
jsp:include page="hello.jsp" flush="true">
<jsp:param name="school" value="shsxt"/>
</jsp:include>
<%=request.getParameter("school")%>
注意:有些對象在 JSP 中能夠直接使用,可以通過觀察.java 代碼知道。目前我們只需要知道 request,response,session,application 可以直接使用即可。
三. 九大內(nèi)置對象
通過解析后的 jsp 文件查看即可
1.request 對象
request 對象是 javax.servlet.httpServletRequest 類型的對象。 該對象代表了客戶端的請求信息,主要用于接受通過 HTTP 協(xié)議傳送到服務(wù)器的數(shù)據(jù)。(包括頭信息. 系統(tǒng)信息. 請求方式以及請求參數(shù)等)。request 對象的作用域為一次請求。
2.response 對象
response 代表的是對客戶端的響應(yīng),主要是將 JSP 容器處理過的對象傳回到客戶端。response 對象也具有作用域,它只在 JSP 頁面內(nèi)有效。
3.session 對象
session 對象是由服務(wù)器自動創(chuàng)建的與用戶請求相關(guān)的對象。服務(wù)器為每個用戶都生成一個 session 對象,用于保存該用戶的信息,跟蹤用戶的操作狀態(tài)。session 對象內(nèi)部使用 Map 類來保存數(shù)據(jù),因此保存數(shù)據(jù)的格式為“Key/value”。 session 對象的 value 可以是復(fù)雜的對象類型,而不僅僅局限于字符串類型。
4.application 對象
application 對象可將信息保存在服務(wù)器中,直到服務(wù)器關(guān)閉,否則
application 對象中保存的信息會在整個應(yīng)用中都有效。
與 session 對象相比,application 對象生命周期更長,類似于系統(tǒng)的“全變量”。
5.out 對象
out 對象用于在 Web 瀏覽器內(nèi)輸出信息,并且管理應(yīng)用服務(wù)器上的輸出緩沖區(qū)。在使用 out 對象輸出數(shù)據(jù)時,可以對數(shù)據(jù)緩沖區(qū)進行操作,及時清除緩沖區(qū)中的殘余數(shù)據(jù),為其他的輸出讓出緩沖空間。待數(shù)據(jù)輸出完畢后,要及時關(guān)閉輸出流。
6.pageContext 對象
pageContext 對象的作用是取得任何范圍的參數(shù),通過它可以獲取 JSP頁面的 out. request. reponse. session. application 等對象。pageContext 對象的創(chuàng)建和初始化都是由容器來完成的,在 JSP 頁面中可以直接使用 pageContext 對象。
7.config 對象
config 對象的主要作用是取得服務(wù)器的配置信息。通過 pageConext 對象的 getServletConfig() 方法可以獲取一個 config 對象。當(dāng)一個 Servlet 初始化時,容器把某些信息通過 config 對象傳遞給這個Servlet。開發(fā)者可以在web.xml 文件中為應(yīng)用程序環(huán)境中的Servlet程序和JSP頁面提供初始化參數(shù)。
8.page 對象
page 對象代表 JSP 本身,只有在 JSP 頁面內(nèi)才是合法的。 page 隱含對象本質(zhì)上包含當(dāng)前 Servlet 接口引用的變量,類似于 Java 編程中的 this 指針。
9.exception 對象
exception 對象的作用是顯示異常信息,只有在包含 isErrorPage="true"的頁面中才可以被使用,在一般的 JSP 頁面中使用該對象將無法編譯 JSP 文件。excepation 對象和 Java 的所有對象一樣,都具有系統(tǒng)提供的繼承結(jié)構(gòu)。exception 對象幾乎定義了所有異常情況。如果在 JSP 頁面中出現(xiàn)沒有捕獲到的異常,就會生成 exception 對象,并把 exception 對象傳送到在 page 指令中設(shè)定的錯誤頁面中,然后在錯誤頁面中處理相應(yīng)的 exception 對象。
四、EL 表達式
1. EL 語法和使用
EL(Expression Language) 是為了使 JSP 寫起來更加簡單。表達式語言的靈感來自于 ECMAScript 和 XPath 表達式語言,它提供了在 JSP 中簡化表達式的方法,讓 Jsp 的代碼更 加簡化。
語法結(jié)構(gòu)非常簡單: ${expressio}EL 表達式一般操作的都是域?qū)ο笾械臄?shù)據(jù),操作不了局部變量。域?qū)ο蟮母拍钤?JSP 中一共有四個:pageContext, request, session, application;范圍依次是,本頁面,一次請求, 一次會話,整個應(yīng)用程序。而 EL 默認的查找方式為從小到大查找,找到即可。當(dāng)域?qū)ο笕?找完了還未找到則返回空字符串””。
當(dāng)需要指定從某個特定的域?qū)ο笾胁檎覕?shù)據(jù)時可以使用四個域?qū)ο髮?yīng)的空間對象,分別是:pageScope, requestScope, sessionScope, applicationScope。
2. EL 運算
使用 EL 表達式可以用來判斷集合中是否有元素 ${empty list}
1) List 遍歷
<%List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
${empty list}
<br /> ${list[1] }
<br />
2) 訪問 map
這里使用到了 el 的另一種取值方式[“”]
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
${empty map} ${map.aaa }
<br /> ${map["bbb"]}
<br /> ${map["ccc-a"]}
3) 做 做+ 、- 、* 、/( 也可以使用 div 來表示) 、% 、==
<%
String a = "aaa";
String b = "aaa";
%>
<%=a == b%>
${4 div 2 }
<br />
注意:String 也使用==比較
<%
request.setAttribute("a", 10);
request.setAttribute("b", 10);
%>
<h2>${a+b }</h2>
<h2>${a==b }</h2>
<%
request.setAttribute("a", "aaaa");
request.setAttribute("b", "aaaa");
%>
<h2>${a==b }</h2>