JSP詳解
時(shí)間:2023-05-30 21:03:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-30 21:03:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
JSP詳解:【43】
JSP 簡(jiǎn)介
什么是Java Server Pages?
JSP全稱(chēng)Java Server Pages,是一種動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)。它使用JSP標(biāo)簽在HTML網(wǎng)頁(yè)中插入Java代碼。標(biāo)簽通常以<%開(kāi)頭以%>結(jié)束。 它是一種Java servlet,主要用于實(shí)現(xiàn)Java web應(yīng)用程序的用戶(hù)界面部分。
特點(diǎn):
- 本質(zhì)上還是 Servlet
- 跨平臺(tái),一次編寫(xiě)處處運(yùn)行
- 組件跨平臺(tái)
- 健壯性和安全性
Jsp 的訪問(wèn)原理:瀏覽器發(fā)起請(qǐng)求,請(qǐng)求 JSP,請(qǐng)求被 Tomcat 服務(wù)器接收,執(zhí)行JspServlet 將請(qǐng)求的 JSP 文件轉(zhuǎn)義成為對(duì)應(yīng)的 java 文件(也是Servlet),然后執(zhí)行轉(zhuǎn)義好的 java 文件。
詳解在另一篇文章
page指令
作用:設(shè)置jsp轉(zhuǎn)譯的時(shí)候的一些配置信息。
<%@page language="java"%><%-- 聲明轉(zhuǎn)譯的語(yǔ)言 --%><%@page import="java.util.*,java.lang.*"%><%-- 聲明轉(zhuǎn)譯時(shí)導(dǎo)入的java包文件--%><%@page pageEncoding="utf-8"%><%-- 設(shè)置jsp的數(shù)據(jù)保存的編碼格式--%><%@page contentType="text/html; charset=utf-8"%><%-- 設(shè)置數(shù)據(jù)的響應(yīng)編碼格式--%><%@page session="false"%><%-- 設(shè)置session的狀態(tài),默認(rèn)為true,也就轉(zhuǎn)譯的servlet文件中默認(rèn)session是開(kāi)啟的,使用false關(guān)閉--%><%@page isErrorPage="true"%><%-- 默認(rèn)為false ture表示開(kāi)啟exception異常對(duì)象的使用--%><%@page errorPage="error.jsp"%><%-- 設(shè)置當(dāng)jsp運(yùn)行出現(xiàn)異常錯(cuò)誤時(shí)跳轉(zhuǎn)指定的頁(yè)面--%>
下表列出了page指令的相關(guān)屬性
jsp的局部代碼塊和全局代碼塊和java腳本
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%-- 局部代碼塊 聲明方式:<% java代碼 %> 特點(diǎn):使用局部代碼塊聲明的java代碼會(huì)被原樣轉(zhuǎn)譯到_jspService方法中。也就是局部代碼。--%><% int a=123; System.out.println(a); test();%><%-- 全局代碼塊 聲明方式:<%! 聲明全局java代碼%> 特點(diǎn):全局代碼塊中聲明的java代碼,在被轉(zhuǎn)譯時(shí),會(huì)轉(zhuǎn)譯成jsp對(duì)應(yīng)的java文件的全局的代碼。 作用:聲明方法和全局變量等 注意:使用全局代碼塊聲明方法,使用局部代碼塊調(diào)用方法。 --%><%! int b=456; public void test(){ System.out.print("全局代碼塊聲明"); }%><%-- java腳本段、表達(dá)式 聲明方式:<%=變量名或者方法名()%> 作用:將java代碼的運(yùn)算結(jié)果數(shù)據(jù)或者其他數(shù)據(jù)響應(yīng)給瀏覽器 注意:在該表達(dá)式中不能使用分號(hào)結(jié)尾 --%><i><%=a%></i><b>jsp代碼塊學(xué)習(xí)</b>今天天氣真好,適合學(xué)習(xí)
jsp注釋
- HTML注釋:會(huì)被轉(zhuǎn)譯也會(huì)被響應(yīng)給瀏覽器,但是瀏覽器不會(huì)執(zhí)行。
- CSS注釋:會(huì)被轉(zhuǎn)譯也會(huì)被響應(yīng)給瀏覽器,但是瀏覽器不會(huì)執(zhí)行。
- js注釋:會(huì)被轉(zhuǎn)譯也會(huì)被響應(yīng)給瀏覽器,但是瀏覽器不會(huì)執(zhí)行。
- java注釋:會(huì)被轉(zhuǎn)譯,但不會(huì)執(zhí)行
- jsp注釋:注釋內(nèi)容不會(huì)被轉(zhuǎn)譯,也不會(huì)被執(zhí)行 格式:<%-- 注釋內(nèi)容 --%>
<html> <head> <style type="text/css"> /* 我是css注釋 */ </style> <script type="text/javascript"> //我是js注釋 </script> </head> <% //int a=3;java注釋 int b=456; %> <body> <!--我是HTML注釋 --> <!-- <i>hhh</i> --> <b>HTML注釋</b> </body> </html>
靜態(tài)引入和動(dòng)態(tài)引入
問(wèn)題:發(fā)現(xiàn),不同的jsp頁(yè)面會(huì)使用相同的資源。如果將資源在每個(gè)jsp頁(yè)面都單獨(dú)聲明則會(huì)造成代碼的冗余量過(guò)高,不易于代碼的維護(hù)和升級(jí)。
解決:使用靜態(tài)引入和動(dòng)態(tài)引入的方式
靜態(tài)引入:<%@include file="要引入的資源的相對(duì)路徑"%>
特點(diǎn):被引入的jsp文件和原有jsp文件被轉(zhuǎn)譯成一個(gè)java文件使用。
注意:靜態(tài)引入的相關(guān)jsp文件中不能聲明同名變量。
動(dòng)態(tài)引入:<jsp:include page="static.jsp"></jsp:include>
特點(diǎn):被引入的文件會(huì)被單獨(dú)轉(zhuǎn)譯,原有jsp文件會(huì)調(diào)用被引入的jsp文件。
注意:動(dòng)態(tài)引入的相關(guān)jsp文件中可以聲明同名變量。
作用:實(shí)現(xiàn)了不同jsp之間的資源共享。
轉(zhuǎn)發(fā):forward標(biāo)簽
問(wèn)題:不同的jsp在處理請(qǐng)求時(shí),有可能會(huì)將當(dāng)前的請(qǐng)求轉(zhuǎn)發(fā)給另外的jsp進(jìn)行處理。
解決:使用forward動(dòng)作指令
使用:<jsp:forward page="要轉(zhuǎn)發(fā)的jsp的相對(duì)路徑"></jsp:forward>
特點(diǎn):從當(dāng)前jsp跳轉(zhuǎn)另外一個(gè)jsp頁(yè)面。
注意: forward標(biāo)簽中除了<jsp:param value="" name=""/>子標(biāo)簽以外不能出現(xiàn)其他內(nèi)容,否則會(huì)報(bào)錯(cuò)。
<html> <head> </head> <body> <h3>forward轉(zhuǎn)發(fā)標(biāo)簽學(xué)習(xí)</h3> <hr /> <% int a=1; if(a>2){ %> <b>歡迎訪問(wèn)本網(wǎng)站</b> <% }else{ %> <!--轉(zhuǎn)發(fā)其他jsp頁(yè)面 --> <jsp:forward page="common.jsp"> <jsp:param value="zhangsan" name="uname"/> </jsp:forward> <%} %> </body></html>
九種隱含對(duì)象
JSP頁(yè)面中不須做任何聲明就可以直接使用的對(duì)象,JSP中共9種隱含對(duì)象,分別是:
pageContext:頁(yè)面上下文對(duì)象,此對(duì)象封存了另外8個(gè)對(duì)象。(
作用域:當(dāng)前jsp頁(yè)面)
注意:一個(gè)jsp頁(yè)面一個(gè)pageContext對(duì)象。pageContext對(duì)象每次請(qǐng)求都會(huì)重新創(chuàng)建。
request:封存了請(qǐng)求相關(guān)數(shù)據(jù),由服務(wù)器創(chuàng)建
session: 解決了同一個(gè)用戶(hù)不同請(qǐng)求之間的數(shù)據(jù)共享問(wèn)題
application:ServletContext對(duì)象,解決了不同用戶(hù)之間的數(shù)據(jù)共享問(wèn)題
out:響應(yīng)數(shù)據(jù)的對(duì)象,交于response對(duì)象,out對(duì)象底層使用了緩沖區(qū)。out對(duì)象的效率高于response
response:響應(yīng)對(duì)象,設(shè)置編碼格式
page:代表當(dāng)前被執(zhí)行的jsp轉(zhuǎn)譯的java文件的對(duì)象
config:ServletConfig對(duì)象,使用此對(duì)象完成資源的初始化。
exception:jsp頁(yè)面的異常對(duì)象,封存了異常信息。
注意:對(duì)象的名字必須是轉(zhuǎn)譯好的java文件中聲明的對(duì)象名。四大作用域:
作用域是指變量使用的有效范圍。這個(gè)周期可以是當(dāng)前頁(yè)面的執(zhí)行時(shí)間,或是一次請(qǐng)求從創(chuàng)建到消亡的這段時(shí)間。
pageContext:當(dāng)前頁(yè)面作用域 pageContext相當(dāng)于Java中的this,它代表著當(dāng)前頁(yè)面作用域。在這個(gè)作用域中存放的屬性值,只能在當(dāng)前頁(yè)面中取出。
request: 從請(qǐng)求創(chuàng)建到請(qǐng)求消亡這段時(shí)間 瀏覽器從發(fā)起請(qǐng)求開(kāi)始,到服務(wù)器處理完成,返回響應(yīng)的這段時(shí)間。request作用域可以跨越多個(gè)頁(yè)面 。另外,還可以使用<jsp:forward>和<jsp:include>兩個(gè)方法轉(zhuǎn)向或包含另一個(gè)頁(yè)面, 這個(gè)時(shí)候request對(duì)象中保存的信息對(duì)另一個(gè)頁(yè)面也是有效的
session: 一段客戶(hù)端和服務(wù)器持續(xù)連接的時(shí)間 當(dāng)客戶(hù)端瀏覽器第一次向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器會(huì)為這個(gè)客戶(hù)端分配一定的內(nèi)存空間,這個(gè)客戶(hù)端能在其中存取數(shù)據(jù),任何客戶(hù)端都不能操作其他客戶(hù)端的內(nèi)存空間中的數(shù)據(jù),這塊內(nèi)存空間就稱(chēng)為session,它也是JSP的九大內(nèi)置對(duì)象之一。存放于session中的對(duì)象,將屬于session作用域,或者叫會(huì)話作用域
application:服務(wù)器開(kāi)始到服務(wù)器關(guān)閉為止 當(dāng)服務(wù)器開(kāi)啟時(shí),會(huì)創(chuàng)建一個(gè)公共內(nèi)存區(qū)域,任何客戶(hù)端都可以在這個(gè)公共內(nèi)存區(qū)域存取值,這個(gè)公共內(nèi)存區(qū)域,就稱(chēng)為application,它也是JSP的九大內(nèi)置對(duì)象之一
簡(jiǎn)述jsp與servlet的職責(zé)
Servlet用于處理業(yè)務(wù)邏輯,通過(guò)轉(zhuǎn)發(fā)或者重定向跳轉(zhuǎn)到j(luò)sp,Jsp用于展現(xiàn)頁(yè)面給用戶(hù),其中數(shù)據(jù)的流轉(zhuǎn)時(shí)如果使用轉(zhuǎn)發(fā)則使用request和session,如果使用重定向時(shí)則使用session(不同數(shù)據(jù)之間的數(shù)據(jù)共享),而不會(huì)使用ServletContext因?yàn)樗糜诓煌脩?hù)之間的數(shù)據(jù)共享
Servlet中轉(zhuǎn)發(fā)與重定向的相對(duì)路徑和絕對(duì)路徑
1、Servlet重定向jsp:resp.sendRedirect("jsp的相對(duì)路徑/servlet的別名");
2、Servlet請(qǐng)求轉(zhuǎn)發(fā)jsp:
req.getRequestDispatcher("jsp的相對(duì)路徑/servlet的別名").forward(req, resp);
注意:以上兩種寫(xiě)法其實(shí)都是相對(duì)路徑,相對(duì)路徑指的是從當(dāng)前請(qǐng)求路徑查找jsp所經(jīng)過(guò)的路 徑。
請(qǐng)求轉(zhuǎn)發(fā)和重定向的絕對(duì)路徑寫(xiě)法總結(jié):- 服務(wù)器根目錄 服務(wù)器的webapps目錄路徑 localhost:8080/
- 項(xiàng)目根目錄 服務(wù)器的webapps目錄下項(xiàng)目路徑 localhost:8080/jsp/
1、重定向:在重定向中的路徑中第一個(gè)/表示服務(wù)器根目錄。
示例: resp.sendRedirect("/虛擬項(xiàng)目名/資源路徑");//重定向jsp頁(yè)面
2、請(qǐng)求轉(zhuǎn)發(fā):在請(qǐng)求轉(zhuǎn)發(fā)中第一個(gè)/表示項(xiàng)目根目錄
示例: req.getRequestDispatcher("/資源路徑").forward(req, resp);//請(qǐng)求轉(zhuǎn)發(fā)到j(luò)sp頁(yè)面
為什么請(qǐng)求轉(zhuǎn)發(fā)和重定向的路徑最好寫(xiě)成絕對(duì)路徑
如果寫(xiě)相對(duì)路徑,當(dāng)前servlet別名配的不是一個(gè)目錄,不會(huì)有問(wèn)題,但是是目錄的話則會(huì)出現(xiàn)問(wèn)題,而且當(dāng)servlet的路徑一旦發(fā)生更改,那么請(qǐng)求轉(zhuǎn)發(fā)和重定向都會(huì)發(fā)生問(wèn)題,所以建議寫(xiě)絕對(duì)路徑,絕對(duì)路徑直接從服務(wù)器根目錄或者從項(xiàng)目根目錄直接找資源,與servlet的路徑?jīng)]關(guān)系,不會(huì)出現(xiàn)資源找不到的情況。
Jsp中的絕對(duì)路徑和bathpath方式
問(wèn)題:在jsp頁(yè)面中進(jìn)行資源之間的跳轉(zhuǎn)時(shí),如果書(shū)寫(xiě)的是相對(duì)路徑這樣會(huì)造成如果當(dāng)前文件的路徑發(fā)生變更,從當(dāng)前路徑查找資源的相對(duì)路徑都要重新進(jìn)行書(shū)寫(xiě)。
解決:將相對(duì)路徑編程絕對(duì)路徑
使用: 在jsp中路徑中的第一個(gè)/表示服務(wù)器根目錄。
<a href="/虛擬項(xiàng)目名/資源路徑">訪問(wèn)關(guān)鍵字</a>
注意:在Myeclipse中創(chuàng)建的jsp頁(yè)面會(huì)自動(dòng)生成路徑處理代碼basePath
而basePath的值為當(dāng)前項(xiàng)目根目錄,并且在head標(biāo)簽中使用了<base href="<%=basePath%>">相當(dāng)于將當(dāng)前頁(yè)面的資源全部默認(rèn)定位為從項(xiàng)目根目錄開(kāi)始查找,我們就不需要寫(xiě)第一個(gè)/了
注意:basePath方式和添加/(斜杠)方式只能二選一。
如果配置了以下代碼,使用時(shí)則不能添加加/
String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";<base href="<%=basePath%>">