Java-Jsp基础教程
介紹
學(xué)習(xí)JSP 基礎(chǔ)教程前 必須會(huì) java Servlet 或者SSM
什么是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é)束。
JSP是一種Java servlet,主要用于實(shí)現(xiàn)Java web應(yīng)用程序的用戶(hù)界面部分。網(wǎng)頁(yè)開(kāi)發(fā)者們通過(guò)結(jié)合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來(lái)編寫(xiě)JSP。
JSP通過(guò)網(wǎng)頁(yè)表單獲取用戶(hù)輸入數(shù)據(jù)、訪問(wèn)數(shù)據(jù)庫(kù)及其他數(shù)據(jù)源,然后動(dòng)態(tài)地創(chuàng)建網(wǎng)頁(yè)。
JSP標(biāo)簽有多種功能,比如訪問(wèn)數(shù)據(jù)庫(kù)、記錄用戶(hù)選擇信息、訪問(wèn)JavaBeans組件等,還可以在不同的網(wǎng)頁(yè)中傳遞控制信息和共享信息
為什么使用JSP?
JSP程序與CGI程序有著相似的功能,但和CGI程序相比,JSP程序有如下優(yōu)勢(shì):
- 性能更加優(yōu)越,因?yàn)镴SP可以直接在HTML網(wǎng)頁(yè)中動(dòng)態(tài)嵌入元素而不需要單獨(dú)引用CGI文件。
- 服務(wù)器調(diào)用的是已經(jīng)編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標(biāo)腳本。
- JSP基于Java Servlets API,因此,JSP擁有各種強(qiáng)大的企業(yè)級(jí)Java API,包括JDBC,JNDI,EJB,JAXP等等。
- JSP頁(yè)面可以與處理業(yè)務(wù)邏輯的servlets一起使用,這種模式被Java servlet 模板引擎所支持。
最后,JSP是Java EE不可或缺的一部分,是一個(gè)完整的企業(yè)級(jí)應(yīng)用平臺(tái)。這意味著JSP可以用最簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)最復(fù)雜的應(yīng)用。
JSP的優(yōu)勢(shì)
以下列出了使用JSP帶來(lái)的其他好處:
-
與ASP相比:JSP有兩大優(yōu)勢(shì)。首先,動(dòng)態(tài)部分用Java編寫(xiě),而不是VB或其他MS專(zhuān)用語(yǔ)言,所以更加強(qiáng)大與易用。第二點(diǎn)就是JSP易于移植到非MS平臺(tái)上。
-
與純 Servlets相比:JSP可以很方便的編寫(xiě)或者修改HTML網(wǎng)頁(yè)而不用去面對(duì)大量的println語(yǔ)句。
-
與SSI相比:SSI無(wú)法使用表單數(shù)據(jù)、無(wú)法進(jìn)行數(shù)據(jù)庫(kù)鏈接。
-
與JavaScript相比:雖然JavaScript可以在客戶(hù)端動(dòng)態(tài)生成HTML,但是很難與服務(wù)器交互,因此不能提供復(fù)雜的服務(wù),比如訪問(wèn)數(shù)據(jù)庫(kù)和圖像處理等等。
-
與靜態(tài)HTML相比:靜態(tài)HTML不包含動(dòng)態(tài)信息。
我們將會(huì)帶您一步一步地來(lái)搭建JSP運(yùn)行環(huán)境,這需要有一定的Java基礎(chǔ)。
JSP 開(kāi)發(fā)環(huán)境搭建
需要配置 java JDK
需要配置 Tomcat 來(lái)解析 JSP頁(yè)面到到游覽器
以上都配置過(guò)了 那么我們來(lái)使用IDEA可和Tomcat關(guān)聯(lián)
以上不會(huì)可以在我博客里找對(duì)應(yīng)的文章學(xué)
創(chuàng)建一個(gè)名字java_Web 的 Maven Web的項(xiàng)目
進(jìn)入java_Web項(xiàng)目->點(diǎn)擊Run—EDit Configurations…
2.點(diǎn)擊左側(cè)“+”號(hào),找到Tomcat Server—Local
然后 apply -> ok
點(diǎn)擊 綠色三角 運(yùn)行Tomcat
如果發(fā)現(xiàn) Tomcat 啟動(dòng)不了或者啟動(dòng)了 什么反應(yīng)都沒(méi)有 那么去 http://boke.huitoushian.cn/posts/55324.html 找為什么 基本上百分之95的問(wèn)題都能解決 剩下百分之5就是你自己作死 亂改 出現(xiàn)的未知問(wèn)題 這個(gè) 唯一辦法卸載Tomcat 從新安裝
JSP處理過(guò)程
以下步驟表明了Web服務(wù)器是如何使用JSP來(lái)創(chuàng)建網(wǎng)頁(yè)的:
- 就像其他普通的網(wǎng)頁(yè)一樣,您的瀏覽器發(fā)送一個(gè)HTTP請(qǐng)求給服務(wù)器。
- Web服務(wù)器識(shí)別出這是一個(gè)對(duì)JSP網(wǎng)頁(yè)的請(qǐng)求,并且將該請(qǐng)求傳遞給JSP引擎。通過(guò)使用URL或者.jsp文件來(lái)完成。
- JSP引擎從磁盤(pán)中載入JSP文件,然后將它們轉(zhuǎn)化為servlet。這種轉(zhuǎn)化只是簡(jiǎn)單地將所有模板文本改用println()語(yǔ)句,并且將所有的JSP元素轉(zhuǎn)化成Java代碼。
- JSP引擎將servlet編譯成可執(zhí)行類(lèi),并且將原始請(qǐng)求傳遞給servlet引擎。
- Web服務(wù)器的某組件將會(huì)調(diào)用servlet引擎,然后載入并執(zhí)行servlet類(lèi)。在執(zhí)行過(guò)程中,servlet產(chǎn)生HTML格式的輸出并將其內(nèi)嵌于HTTP response中上交給Web服務(wù)器。
- Web服務(wù)器以靜態(tài)HTML網(wǎng)頁(yè)的形式將HTTP response返回到您的瀏覽器中。
- 最終,Web瀏覽器處理HTTP response中動(dòng)態(tài)產(chǎn)生的HTML網(wǎng)頁(yè),就好像在處理靜態(tài)網(wǎng)頁(yè)一樣。
一般情況下,JSP引擎會(huì)檢查JSP文件對(duì)應(yīng)的servlet是否已經(jīng)存在,并且檢查JSP文件的修改日期是否早于servlet。如果JSP文件的修改日期早于對(duì)應(yīng)的servlet,那么容器就可以確定JSP文件沒(méi)有被修改過(guò)并且servlet有效。這使得整個(gè)流程與其他腳本語(yǔ)言(比如PHP)相比要高效快捷一些。
總的來(lái)說(shuō),JSP網(wǎng)頁(yè)就是用另一種方式來(lái)編寫(xiě)servlet而不用成為Java編程高手。除了解釋階段外,JSP網(wǎng)頁(yè)幾乎可以被當(dāng)成一個(gè)普通的servlet來(lái)對(duì)待。
JSP 生命周期
理解JSP底層功能的關(guān)鍵就是去理解它們所遵守的生命周期。
JSP生命周期就是從創(chuàng)建到銷(xiāo)毀的整個(gè)過(guò)程,類(lèi)似于servlet生命周期,區(qū)別在于JSP生命周期還包括將JSP文件編譯成servlet。
以下是JSP生命周期中所走過(guò)的幾個(gè)階段:
- 編譯階段:
servlet容器編譯servlet源文件,生成servlet類(lèi)
- 初始化階段:
加載與JSP對(duì)應(yīng)的servlet類(lèi),創(chuàng)建其實(shí)例,并調(diào)用它的初始化方法
- 執(zhí)行階段:
調(diào)用與JSP對(duì)應(yīng)的servlet實(shí)例的服務(wù)方法
- 銷(xiāo)毀階段:
調(diào)用與JSP對(duì)應(yīng)的servlet實(shí)例的銷(xiāo)毀方法,然后銷(xiāo)毀servlet實(shí)例
很明顯,JSP生命周期的四個(gè)主要階段和servlet生命周期非常相似
JSP編譯階段
當(dāng)瀏覽器請(qǐng)求JSP頁(yè)面時(shí),JSP引擎會(huì)首先去檢查是否需要編譯這個(gè)文件。如果這個(gè)文件沒(méi)有被編譯過(guò),或者在上次編譯后被更改過(guò),則編譯這個(gè)JSP文件。
編譯的過(guò)程包括三個(gè)步驟:
- 解析JSP文件。
- 將JSP文件轉(zhuǎn)為servlet。
- 編譯servlet。
JSP初始化階段
容器載入JSP文件后,它會(huì)在為請(qǐng)求提供任何服務(wù)前調(diào)用jspInit()方法。如果您需要執(zhí)行自定義的JSP初始化任務(wù),復(fù)寫(xiě)jspInit()方法就行了,就像下面這樣:
public void jspInit(){// 初始化代碼 }般來(lái)講程序只初始化一次,servlet也是如此。通常情況下您可以在jspInit()方法中初始化數(shù)據(jù)庫(kù)連接、打開(kāi)文件和創(chuàng)建查詢(xún)表。
JSP執(zhí)行階段
這一階段描述了JSP生命周期中一切與請(qǐng)求相關(guān)的交互行為,直到被銷(xiāo)毀。
當(dāng)JSP網(wǎng)頁(yè)完成初始化后,JSP引擎將會(huì)調(diào)用_jspService()方法。
_jspService()方法需要一個(gè)HttpServletRequest對(duì)象和一個(gè)HttpServletResponse對(duì)象作為它的參數(shù),就像下面這樣:
void _jspService(HttpServletRequest request,HttpServletResponse response) {// 服務(wù)端處理代碼 }_jspService()方法在每個(gè)request中被調(diào)用一次并且負(fù)責(zé)產(chǎn)生與之相對(duì)應(yīng)的response,并且它還負(fù)責(zé)產(chǎn)生所有7個(gè)HTTP方法的回應(yīng),比如GET、POST、DELETE等等。
JSP銷(xiāo)毀階段
JSP生命周期的銷(xiāo)毀階段描述了當(dāng)一個(gè)JSP網(wǎng)頁(yè)從容器中被移除時(shí)所發(fā)生的一切。
jspDestroy()方法在JSP中等價(jià)于servlet中的銷(xiāo)毀方法。當(dāng)您需要執(zhí)行任何清理工作時(shí)復(fù)寫(xiě)jspDestroy()方法,比如釋放數(shù)據(jù)庫(kù)連接或者關(guān)閉文件夾等等。
jspDestroy()方法的格式如下:
public void jspDestroy() {// 清理代碼 }案例
創(chuàng)建一個(gè)index.jsp 將下面的 代碼 復(fù)制到 jsp頁(yè)面中 然后運(yùn)行Tomcat
訪問(wèn)http://localhost:8081/java_Web/index.jsp 看看 控制臺(tái)打印效果 已經(jīng)頁(yè)面顯示的內(nèi)容
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <html> <head> <title>life.jsp</title> </head> <body><%! private int initVar=0;private int serviceVar=0;private int destroyVar=0; %><%!public void jspInit(){initVar++;System.out.println("jspInit(): JSP被初始化了"+initVar+"次");}public void jspDestroy(){destroyVar++;System.out.println("jspDestroy(): JSP被銷(xiāo)毀了"+destroyVar+"次");} %><%serviceVar++;System.out.println("_jspService(): JSP共響應(yīng)了"+serviceVar+"次請(qǐng)求");String content1="初始化次數(shù) : "+initVar;String content2="響應(yīng)客戶(hù)請(qǐng)求次數(shù) : "+serviceVar;String content3="銷(xiāo)毀次數(shù) : "+destroyVar; %> <h1>w3cschool教程 JSP 測(cè)試實(shí)例</h1> <p><%=content1 %></p> <p><%=content2 %></p> <p><%=content3 %></p></body> </html>頁(yè)面顯示
IDEA 控制臺(tái)
jspInit(): JSP被初始化了1次
_jspService(): JSP共響應(yīng)了1次請(qǐng)求
然后你在關(guān)閉Tomcat 試試
IDEA 控制臺(tái)
jspDestroy(): JSP被銷(xiāo)毀了1次
Disconnected from server
不要去糾結(jié) 到底 怎么使用 這些都不重要 因?yàn)榛静粫?huì)怎么使用這些 當(dāng)然你想使用就使用當(dāng)我沒(méi)說(shuō)
JSP 語(yǔ)法
一下只是講解 jsp 中的 語(yǔ)法 而詳細(xì)教程在 后面會(huì)慢慢道來(lái)
腳本程序
腳本程序 可以包含任意量的Java語(yǔ)句、變量、方法或表達(dá)式,只要它們?cè)谀_本中是正確的代碼。
就好比 java中的 public class className{ 內(nèi)容… }
腳本程序的語(yǔ)法格式:
<% 代碼片段 %>任何文本、HTML標(biāo)簽、JSP元素必須寫(xiě)在腳本程序的外面。
下面給出一個(gè)示例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head><title>hello</title> </head> <body>Hello World!<br/> <%out.println("你的 IP 地址 是 " + "<h1>" + request.getRemoteAddr() + "</h1>"); %></body> </html>out.println 和 out.print 就是內(nèi)容輸出到頁(yè)面中 會(huì)解析 HTML標(biāo)簽的 把他當(dāng)成java中的System.out,println()就行了
這里順帶解決一個(gè)常見(jiàn)的問(wèn)題 如果你將上面的代碼復(fù)制到IDEA 中發(fā)現(xiàn) 代碼都爆紅
出現(xiàn)這個(gè)原因是沒(méi)有導(dǎo)入 Tomcat 到項(xiàng)目里
解決辦法:
然后apply -> 0k 保存就行 稍等一下 你就發(fā)現(xiàn) 不報(bào)錯(cuò)了 能找到這些代碼了
然后我們運(yùn)行 Tomcat 訪問(wèn) http://localhost:8081/java_Web/index.jsp
遇到了request.getRemoteAddr()獲取的值為0:0:0:0:0:0:0:1,這是為什么呢,照道理講,應(yīng)該是127.0.0.1才對(duì),為什么這個(gè)獲取的值變成了ipv6了呢,而且我發(fā)現(xiàn)這種情況只有在服務(wù)器和客戶(hù)端都在同一臺(tái)電腦上才會(huì)出現(xiàn) 所以 不用管它 自己明白就行
JSP聲明
一個(gè)聲明語(yǔ)句可以聲明一個(gè)或多個(gè)變量、方法,供后面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法然后才能使用它們。
就好比 java中 類(lèi)里聲明成員變量
JSP聲明的語(yǔ)法格式:
<%! 變量 %>示例:
<%@ page import="javafx.scene.shape.Circle" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head><title>hello</title> </head> <body><%! int i = 1; %> <%! int a, b=2, c; %> <%! Circle cle = new Circle(2.0); %> <%out.println(i+"<br/>");out.println(a+"_"+b+"_"+c+"<br/>");out.println(cle); %> </body> </html>JSP表達(dá)式
一個(gè)JSP表達(dá)式中包含的腳本語(yǔ)言表達(dá)式,先被轉(zhuǎn)化成String,然后插入到表達(dá)式出現(xiàn)的地方。
由于表達(dá)式的值會(huì)被轉(zhuǎn)化成String,所以您可以在一個(gè)文本行中使用表達(dá)式而不用去管它是否是HTML標(biāo)簽。
表達(dá)式元素中可以包含任何符合Java語(yǔ)言規(guī)范的表達(dá)式,但是不能使用分號(hào)來(lái)結(jié)束表達(dá)式。
也就相當(dāng)于就一條java語(yǔ)句 但是必須有輸出內(nèi)容 就好比是java 中的 String a=123; 等號(hào)右邊必須有內(nèi)容
JSP表達(dá)式的語(yǔ)法格式:
<%= 表達(dá)式 %>示例:
將當(dāng)前時(shí)間戳 轉(zhuǎn)換為時(shí)間字符串
Today's date: <%= (new java.util.Date()).toLocaleString()%>頁(yè)面顯示
Today’s date: 2020-11-17 22:54:08
JSP注釋
JSP注釋主要有兩個(gè)作用:為代碼作注釋以及將某段代碼注釋掉。 該注釋在網(wǎng)頁(yè)中不會(huì)被顯示-
JSP注釋的語(yǔ)法格式:
<%-- 這里可以填寫(xiě) JSP 注釋 --%>不同情況下使用注釋的語(yǔ)法規(guī)則:
| <%-- 注釋 --%> | JSP注釋,注釋內(nèi)容不會(huì)被發(fā)送至瀏覽器甚至不會(huì)被編譯 |
| <!-- 注釋 --> | HTML注釋,通過(guò)瀏覽器查看網(wǎng)頁(yè)源代碼時(shí)可以看見(jiàn)注釋內(nèi)容 |
JSP指令
JSP指令用來(lái)設(shè)置整個(gè)JSP頁(yè)面相關(guān)的屬性,如網(wǎng)頁(yè)的編碼方式和腳本語(yǔ)言。
JSP指令語(yǔ)法格式:
<%@ directive attribute="value" %>指令可以有很多個(gè)屬性,它們以鍵值對(duì)的形式存在,并用逗號(hào)隔開(kāi)。
JSP中的三種指令標(biāo)簽:
| <%@ page … %> | 定義網(wǎng)頁(yè)依賴(lài)屬性,比如腳本語(yǔ)言、error頁(yè)面、緩存需求等等 |
| <%@ include … %> | 包含其他文件 |
| <%@ taglib … %> | 引入標(biāo)簽庫(kù)的定義 |
<%@ page %>指令
Page指令為容器提供當(dāng)前頁(yè)面的使用說(shuō)明。一個(gè)JSP頁(yè)面可以包含多個(gè)page指令。
Page指令的語(yǔ)法格式:
<%@ page attribute="value" %>屬性
下表列出與Page指令相關(guān)的屬性:
| buffer | 指定out對(duì)象使用緩沖區(qū)的大小 |
| autoFlush | 控制out對(duì)象的 緩存區(qū) |
| contentType | 指定當(dāng)前JSP頁(yè)面的MIME類(lèi)型和字符編碼 |
| errorPage | 指定當(dāng)JSP頁(yè)面發(fā)生異常時(shí)需要轉(zhuǎn)向的錯(cuò)誤處理頁(yè)面 |
| isErrorPage | 指定當(dāng)前頁(yè)面是否可以作為另一個(gè)JSP頁(yè)面的錯(cuò)誤處理頁(yè)面 |
| extends | 指定servlet從哪一個(gè)類(lèi)繼承 |
| import | 導(dǎo)入要使用的Java類(lèi) |
| info | 定義JSP頁(yè)面的描述信息 |
| isThreadSafe | 指定對(duì)JSP頁(yè)面的訪問(wèn)是否為線程安全 |
| language | 定義JSP頁(yè)面所用的腳本語(yǔ)言,默認(rèn)是Java |
| session | 指定JSP頁(yè)面是否使用session |
| isELIgnored | 指定是否執(zhí)行EL表達(dá)式 (默認(rèn)true) |
| isScriptingEnabled | 確定腳本元素能否被使用 |
| pageEncoding | 當(dāng)前頁(yè)面的編碼格式 |
列:
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %><%@ Include %>指令
JSP可以通過(guò)include指令來(lái)包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會(huì)被同時(shí)編譯執(zhí)行。最后會(huì)被整合 成一個(gè) Servlet .class
注意: 使用 include 指令是以靜態(tài)方式包含文件 簡(jiǎn)單來(lái)說(shuō)就是合二為一 ,原封不動(dòng)地附加到當(dāng)前文件中 所以要避免重復(fù)的代碼 和變量 等邏輯。
例如:里面不要包含<html> <body> … 這樣的標(biāo)簽,因?yàn)槭前言创a原封不動(dòng)的附加過(guò)來(lái),所以會(huì)與當(dāng)前的jsp中的這樣的標(biāo)簽重復(fù)導(dǎo)致出錯(cuò)。
但是也是有好處的 就是 js 和jsp … 變量方法等共享 你可以在 Include指令 后面修改包含頁(yè)面內(nèi) 變量的內(nèi)容 從而改變包含頁(yè)面的狀態(tài)
為了避嫌 html 和jsp 中文亂碼的情況 在項(xiàng)目的web.xml中添加
<jsp-config><jsp-property-group><url-pattern>*.html</url-pattern><url-pattern>*.jsp</url-pattern><page-encoding>UTF-8</page-encoding></jsp-property-group></jsp-config>Include指令的語(yǔ)法格式如下:
<%@ include file="url" %>創(chuàng)建一個(gè)index1.html
<h1>index1.html O(∩_∩)O哈哈~</h1>創(chuàng)建一個(gè)index1.jsp
<h1>index1.jsp O(∩_∩)O哈哈~</h1>創(chuàng)建一個(gè)index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <html> <head><title>index</title> </head> <body> <%@ include file="index1.html" %> <%@ include file="index1.jsp" %> <h1>index.jsp</h1></body> </html>頁(yè)面顯示
<%@ Taglib %>指令
在JSP頁(yè)面中使用第三方的標(biāo)簽庫(kù)時(shí),需要使用taglib指令來(lái)“導(dǎo)包”
Taglib指令的語(yǔ)法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>uri屬性確定標(biāo)簽庫(kù)的位置,prefix屬性指定標(biāo)簽庫(kù)的前綴。
比如引入JSTL標(biāo)簽庫(kù)
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>然后我們就可以在當(dāng)前頁(yè)面使用JSTL語(yǔ)法了
JSP行為
JSP行為標(biāo)簽使用XML語(yǔ)法結(jié)構(gòu)來(lái)控制servlet引擎。它能夠動(dòng)態(tài)插入一個(gè)文件,重用JavaBean組件,引導(dǎo)用戶(hù)去另一個(gè)頁(yè)面,為Java插件產(chǎn)生相關(guān)的HTML等等。
行為標(biāo)簽只有一種語(yǔ)法格式,它嚴(yán)格遵守XML標(biāo)準(zhǔn):
<jsp:action_name attribute="value" />行為標(biāo)簽基本上是一些預(yù)先就定義好的函數(shù),下表羅列出了一些可用的JSP行為標(biāo)簽:
| jsp:include | 用于在當(dāng)前頁(yè)面中包含靜態(tài)或動(dòng)態(tài)資源 |
| jsp:useBean | 尋找和初始化一個(gè)JavaBean組件 |
| jsp:setProperty | 設(shè)置 JavaBean組件的值 配合 jsp:useBean使用 |
| jsp:getProperty | 輸出某個(gè)JavaBean的屬性。 配合 jsp:useBean 使用 |
| jsp:forward | 把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面 (轉(zhuǎn)發(fā)) |
至于其他的行為 就沒(méi)什么卵用了 這里就不 在寫(xiě)了
<jsp:include>行為元素
<jsp:include>行為元素用來(lái)包含靜態(tài)和動(dòng)態(tài)的文件。該行為把指定文件插入正在生成的頁(yè)面。語(yǔ)法格式如下:
<jsp:include page="URL" flush="true" />前面已經(jīng)介紹過(guò)include指令,就相當(dāng)于兩個(gè)文件內(nèi)容 合二為一 生成一個(gè).class文件,
而這里的jsp:include動(dòng)作不同, 相當(dāng)于生成 二個(gè).class文件 他們內(nèi)容 互不相關(guān) 不會(huì)有 標(biāo)簽 變量…沖突問(wèn)題 但是都會(huì)顯示在同一個(gè)頁(yè)面中 因?yàn)?當(dāng)我們請(qǐng)求 原文jsp文件的時(shí)候 他內(nèi)部就會(huì)請(qǐng)求 包含的jsp文件 也就是 插入文件的時(shí)間是在頁(yè)面被請(qǐng)求的時(shí)候。
以下是include動(dòng)作相關(guān)的屬性列表。
| page | 包含在頁(yè)面中的相對(duì)URL地址。 |
| flush | 布爾屬性,定義在包含資源前是否刷新緩存區(qū)。 |
列:
創(chuàng)建index1.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1>index1.html ^_^</h1> </body> </html>創(chuàng)建index1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body> <h1> index1.jsp ^_^</h1> </body> </html>創(chuàng)建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <html> <head><title>index</title> </head> <body><jsp:include page="index1.html" flush="true" /> <jsp:include page="index1.jsp" flush="true" /><h1>index.jsp</h1></body> </html>頁(yè)面顯示:
<jsp:useBean>行為元素
jsp:useBean動(dòng)作用來(lái)裝載一個(gè)將在JSP頁(yè)面中使用的JavaBean。
這個(gè)功能非常有用,因?yàn)樗沟梦覀兗瓤梢园l(fā)揮Java組件重用的優(yōu)勢(shì), 但是必須準(zhǔn)守 JavaBean API 規(guī)范
必須是 無(wú)慘構(gòu)造 有g(shù)et set 方法 需要被序列化并且實(shí)現(xiàn)了 Serializable 接口
jsp:useBean動(dòng)作最簡(jiǎn)單的語(yǔ)法為:
<jsp:useBean id="對(duì)象名稱(chēng)" class="類(lèi)的包路徑" />至于其他屬性 沒(méi)什么卵用 就別浪費(fèi)時(shí)間研究了
在類(lèi)載入后 相當(dāng)于new 對(duì)象 id就是對(duì)象的名稱(chēng),我們既可以通過(guò) jsp:setProperty 和 jsp:getProperty 動(dòng)作來(lái)修改和獲取bean的屬性。
演示:
public class TestBean {private String message = "No message specified";public String getMessage() {return(message);}public void setMessage(String message) {this.message = message;} }然后重啟Tomcat 會(huì)自動(dòng)編譯 TestBean 成TestBean.class 之后我們?cè)趈sp頁(yè)面才能使用,否則會(huì)報(bào)錯(cuò)
然后在index.jsp頁(yè)面使用下面代碼
<center><h2>Using JavaBeans in JSP</h2><jsp:useBean id="test" class="co.boke.test.TestBean" /><jsp:getProperty name="test" property="message" /><br/><jsp:setProperty name="test" property="message" value="Hello"/><jsp:getProperty name="test" property="message" /></center><jsp:forward> 行為元素
jsp:forward動(dòng)作把請(qǐng)求轉(zhuǎn)到另外的頁(yè)面。jsp:forward標(biāo)記只有一個(gè)屬性page。語(yǔ)法格式如下所示:
<jsp:forward page="URL" />page屬性包含的是一個(gè)相對(duì)URL。page的值既可以直接給出,也可以在請(qǐng)求的時(shí)候動(dòng)態(tài)計(jì)算,可以是一個(gè)JSP頁(yè)面或者一個(gè) Java Servlet.
比如:
創(chuàng)建index1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><p>Today's date: <%= (new java.util.Date()).toLocaleString()%> </p></body> </html>創(chuàng)建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <html> <head><title>index</title> </head> <body><%! int num = 2; %><% if (num == 2) {%> <jsp:forward page="index1.jsp"/> <% } %></body> </html>if 滿足條件 轉(zhuǎn)發(fā)請(qǐng)求 到 index1.jsp頁(yè)面
JSP9大內(nèi)置對(duì)象和4大作用域以及Cookie
JSP支持九個(gè)自動(dòng)定義的變量,江湖人稱(chēng)隱含對(duì)象。這九個(gè)隱含對(duì)象的簡(jiǎn)介見(jiàn)下表:
| request(請(qǐng)求) | 用于向客戶(hù)端發(fā)送和獲取數(shù)據(jù) 作用范圍一次請(qǐng)求 |
| response(響應(yīng)) | 用于響應(yīng)客戶(hù)端請(qǐng)求 比如設(shè)置 響應(yīng)頭 狀態(tài)碼 … |
| out(輸出) | 用于把結(jié)果輸出至網(wǎng)頁(yè)上 比如 out.println() |
| session(會(huì)話) | 用于向客戶(hù)端發(fā)送和獲取數(shù)據(jù) 作用范圍是一次會(huì)話 |
| application(應(yīng)用程序) | 用于向客戶(hù)端發(fā)送和獲取數(shù)據(jù) 作用范圍是將Tomcat服務(wù)關(guān)閉 |
| config(配置對(duì)象) | 代表當(dāng)前JSP 配置信息, 但JSP 頁(yè)面通常無(wú)須配置,因此也就不存在配置信息 很少使用 |
| pageContext(頁(yè)面上下文對(duì)象) | 可以訪問(wèn)頁(yè)面中所有作用域 以及一些頁(yè)面屬性 和設(shè)置 |
| page(頁(yè)面對(duì)象) | 用于向客戶(hù)端發(fā)送和獲取數(shù)據(jù) 作用范圍 類(lèi)似于java的 this 表示當(dāng)前頁(yè)面 |
| Exception(異常對(duì)象) | 表示jsp頁(yè)面運(yùn)行時(shí)產(chǎn)生的異常和報(bào)錯(cuò)信息 該對(duì)象只有在錯(cuò)誤頁(yè)面<%@ page 指令中設(shè)置isErrorPage 為true 的頁(yè)面 中才能使用 很少使用 |
| Cookie(小型文本文件) | 這個(gè)就是將數(shù)據(jù)以鍵值對(duì)形式 保存在當(dāng)前游覽器的Cookie里 也就是本地電腦里 可以通過(guò)游覽器查看到 |
四大作用域是: page, request , session , application
和servlet 的9個(gè)內(nèi)置對(duì)象 用法一樣 我們就不啰嗦了
然后還有一個(gè)特殊對(duì)象Cookie 這個(gè)就不陌生把
接下來(lái)我們把 page , request , response , session , application , pageContext, Cookie 這7大常用的對(duì)象 詳細(xì)講一遍
至于其他的 反正我基本沒(méi)怎么用過(guò)
這里注意: Servler 和jsp 都是一樣的 可以互通 但是為了方便 我們 就使用2個(gè) jsp頁(yè)面來(lái)演示上面的方法
page(當(dāng)前頁(yè))
四大作用域之一page
page 對(duì)象是為了執(zhí)行當(dāng)前頁(yè)面應(yīng)答請(qǐng)求而設(shè)置的 Servlet 類(lèi)的實(shí)體,即顯示 JSP 頁(yè)面自身,與類(lèi)的 this 指針類(lèi)似,使用它來(lái)調(diào)用 Servlet 類(lèi)中所定義的方法,只有在本頁(yè)面內(nèi)才是合法的。它是 java.lang.Object 類(lèi)的實(shí)例,對(duì)于開(kāi)發(fā) JSP 比較有用。表 1 列出了 page 對(duì)象常用的方法。
| class getClass() | 返回當(dāng)前 Object 的類(lèi) |
| int hashCode | 返回 Object 的 hash 代碼 |
| String toString | 把 Object 對(duì)象轉(zhuǎn)換成 String 類(lèi)的對(duì)象 |
| boolean equals(Object obj) | 比較對(duì)象和指定的對(duì)象是否相等 |
| void copy (Object obj) | 把對(duì)象拷貝到指定的對(duì)象中 |
| Object clone() | 復(fù)制對(duì)象(克隆對(duì)象) |
創(chuàng)建index.jsp
<%Object obj;obj=null; %>返回當(dāng)前頁(yè)面所在類(lèi):<%=page.getClass()%> <br> 返回當(dāng)前頁(yè)面的 hash 代碼:<%=page.hashCode()%> <br> 轉(zhuǎn)換成 String 類(lèi)的對(duì)象:<%=page.toString()%> <br> 比較1:<%=page.equals(obj) %> <br> 比較2:<%=page.equals(this) %>頁(yè)面顯示
返回當(dāng)前頁(yè)面所在類(lèi):class org.apache.jsp.index_jsp 返回當(dāng)前頁(yè)面的 hash 代碼:1772279684 轉(zhuǎn)換成 String 類(lèi)的對(duì)象:org.apache.jsp.index_jsp@69a2d784 比較1:false 比較2:truerequest (轉(zhuǎn)發(fā))
四大作用域之一request
客戶(hù)端可通過(guò) HTML 表單或在網(wǎng)頁(yè)地址后面提供參數(shù)的方法提交數(shù)據(jù),然后通過(guò) request 對(duì)象的相關(guān)方法來(lái)獲取這些數(shù)據(jù)。request 對(duì)象封裝了客戶(hù)端的請(qǐng)求信息,包括用戶(hù)提交的信息以及客戶(hù)端的一些信息,服務(wù)端通過(guò) request 對(duì)象可以了解到客戶(hù)端的需求,然后做出響應(yīng)。
request 對(duì)象是 HttpServletRequest(接口)的實(shí)例。請(qǐng)求信息的內(nèi)容包括請(qǐng)求的標(biāo)題頭(Header)信息(如瀏覽器的版本信息語(yǔ)言和編碼方式等),請(qǐng)求的方式(如 HTTP 的 GET 方法、POST 方法等),請(qǐng)求的參數(shù)名稱(chēng)、參數(shù)值和客戶(hù)端的主機(jī)名稱(chēng)等。
request 對(duì)象提供了一些方法,主要用來(lái)處理客戶(hù)端瀏覽器提交的請(qǐng)求中的各項(xiàng)參數(shù)和選項(xiàng)。表 1 列出了 request 對(duì)象常用的方法。下面介紹 request 對(duì)象的應(yīng)用。
什么是轉(zhuǎn)發(fā)?
比如頁(yè)面1 轉(zhuǎn)發(fā)到頁(yè)面2 那么頁(yè)面2在轉(zhuǎn)發(fā)到頁(yè)面3 此時(shí)頁(yè)面3 將不能獲取到頁(yè)面1 的內(nèi)容
大部分的方法 都是獲取信息 get
| String getParameter(String name) | 返回指定name的值 多個(gè)name 只能獲取第一個(gè) |
| String[] getParameterValues(String name) | 獲取 獲取一組name相同的數(shù)據(jù) 返回的是數(shù)組 |
| Map<String,String[]> request.getParameterMap(); | 將前端傳來(lái)的數(shù)據(jù) 封裝到map中 |
| Enumeration getParameterNames() | 返回請(qǐng)求中所有參數(shù)的名稱(chēng)集合 |
| void setAttribute(String,Object) | 存儲(chǔ)此請(qǐng)求中的屬性 |
| Object getAttribute(String name) | 返回指定屬性的屬性值 |
| Enumeration getAttributeNames() | 返回request對(duì)象的所有屬性名稱(chēng)的集合 |
| void setCharacterEncoding(String charset) | 設(shè)置請(qǐng)求的字符編碼方式 可以用于解決中文亂碼問(wèn)題 |
| String getRemoteAddr() | 返回發(fā)送此請(qǐng)求的客戶(hù)端IP地址 |
| String getRequestURI() | 返回發(fā)送此請(qǐng)求的URI |
| String getServletPath() | 返回所請(qǐng)求的servlet路徑 |
| String request.getContextPath() | 獲取當(dāng)前web(虛擬目錄) 如果沒(méi)有那么就空 |
| Cookie[] getCookies() | 返回客戶(hù)端所有的Cookie的數(shù)組 |
| String getMethod() | 得到客戶(hù)機(jī)請(qǐng)求方式 比如 GET,,POST,或PUT |
| String getRequestedSessionId() | 返回request的session ID |
| boolean isSecure() | 返回request是否使用了加密通道,比如HTTPS |
| voie request.getRequestDispatcher(path).forward(request,response); | 將請(qǐng)求轉(zhuǎn)發(fā)給指定頁(yè)面 |
| String request.getHeader(String key) | 獲取游覽器的請(qǐng)求頭信息 |
還有很多方法這里 就不一 一列出來(lái)了 以上方法都?jí)蚰愠砸粔氐牧?而且常用的就幾個(gè)下面我會(huì)演示的
出現(xiàn)請(qǐng)求的數(shù)據(jù)是 中文亂碼的情況
比如: 頁(yè)面1 給頁(yè)面2 轉(zhuǎn)發(fā)數(shù)據(jù) 頁(yè)面2出現(xiàn)中文亂碼了 那么在頁(yè)面2開(kāi)頭位置加上下面代碼
<%//設(shè)置請(qǐng)求的字符編碼方式 utf-8request.setCharacterEncoding("utf-8"); %>轉(zhuǎn)發(fā)-參數(shù)獲取和設(shè)置
演示下面方法的用法
常用語(yǔ) 2個(gè)不同頁(yè)面之間的傳值
-
void request.setAttribute (String,Object)
-
Object request.getAttribute (String,Object)
-
Enumeration<String> getAttributeNames()
-
void request.getRequestDispatcher(path).forward(request,response);
創(chuàng)建 index.jsp
<% request.setAttribute("Name","HuAnmin"); //設(shè)置request值 request.setAttribute("Pass","123"); request.getRequestDispatcher("index1.jsp").forward(request,response); // 將request 轉(zhuǎn)發(fā) %>創(chuàng)建index1.jsp
<%//設(shè)置 請(qǐng)求 和響應(yīng) 的格式都是 utf-8request.setCharacterEncoding("utf-8"); %><%-- 獲取轉(zhuǎn)發(fā)來(lái)的request內(nèi)的值--%>姓名:<%=request.getAttribute("Name")%><br> 你的密碼是:<%=request.getAttribute("Pass")%><br><br>所有的request里的key和value<br> <%Enumeration<String> attributeNames = request.getAttributeNames();while(attributeNames.hasMoreElements()){String name=attributeNames.nextElement(); //獲取 name 名稱(chēng)if(name.contains("javax.servlet.forward")){ //過(guò)濾掉不用的信息continue;}String value=(String) request.getAttribute(name); //通過(guò)name 獲取值out.print(name + "=" + value+"<br/>");}%>轉(zhuǎn)發(fā)到 index1.jsp頁(yè)面顯示
姓名:HuAnmin 你的密碼是:123所有的request里的key和value Pass=123 Name=HuAnminurl參數(shù)和表單name獲取
演示下面方法的用法
常用于 url參數(shù) 和 表單提交的數(shù)據(jù)
-
String getParameter(String name) 如果是多個(gè)name那么只獲取第一個(gè)
-
String[] getParameterValues(String name)
-
Enumeration getParameterNames()
創(chuàng)建 index.jsp
<form action="index1.jsp" method="post">賬戶(hù):<input type="text" name="UserName" value="HuAnmin" placeholder="請(qǐng)輸入你的賬戶(hù)"><br>密碼:<input type="text" name="PassWord" value="123" placeholder="請(qǐng)輸入你的密碼"><br>愛(ài)好:<input type="checkbox" name="AiHao" value="游泳" checked="checked">游泳<input type="checkbox" name="AiHao" value="跑步" checked="checked">跑步<input type="checkbox" name="AiHao" value="跳遠(yuǎn)">跳遠(yuǎn)<br><input type="submit" value="點(diǎn)擊"> </form><a href="index1.jsp?UserName=ABC&&PassWord=123&&AiHao=上網(wǎng)&&AiHao=打代碼">GET Parameter</a>創(chuàng)建index1.jsp
<%-- 獲取表單 或 url參數(shù) 的值--%><%//設(shè)置 請(qǐng)求 和響應(yīng) 的格式都是 utf-8request.setCharacterEncoding("utf-8"); %> 賬戶(hù):<%=request.getParameter("UserName")%><br> 密碼:<%=request.getParameter("PassWord")%><br> 愛(ài)好: <%= Arrays.toString(request.getParameterValues("AiHao"))%> <br><br> 全部參數(shù) <br> <%Enumeration<String> attributeNames = request.getParameterNames();while(attributeNames.hasMoreElements()){String name=attributeNames.nextElement(); //獲取 name 名稱(chēng)String value=request.getParameter(name); //通過(guò)name 獲取值out.print(name + "=" + value+"<br/>");}%>表單提交到 index1.jsp頁(yè)面顯示
賬戶(hù):HuAnmin 密碼:123 愛(ài)好: [游泳, 跑步]全部參數(shù) UserName=HuAnmin PassWord=123 AiHao=游泳點(diǎn)超鏈接 index1.jsp頁(yè)面顯示
賬戶(hù):ABC 密碼:123 愛(ài)好: [上網(wǎng), 打代碼]全部參數(shù) UserName=ABC PassWord=123 AiHao=上網(wǎng)url參數(shù)獲取和表單name 之Map映射實(shí)體類(lèi)
演示下面方法的用法
url參數(shù) 和表單name 常用于 映射javaBean 因?yàn)槿绻韱翁蟮脑?我們自己 手動(dòng)映射實(shí)體類(lèi)太慢了
要求必須 表單或者url 的key 的名稱(chēng) 和 實(shí)體類(lèi)的 成員變量名一致 并且 實(shí)體類(lèi)實(shí)現(xiàn)get set 方法
- Map<String,String[]> request.getParameterMap();
需要的jar
鏈接:https://pan.baidu.com/s/18x2eJyr3qaBEgom1Uvpmcw
提取碼:1234
復(fù)制這段內(nèi)容后打開(kāi)百度網(wǎng)盤(pán)手機(jī)App,操作更方便哦–來(lái)自百度網(wǎng)盤(pán)超級(jí)會(huì)員V4的分享
或者在pom.xml中添加Maven
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version></dependency>二選一
創(chuàng)建一個(gè)MyUser 實(shí)體類(lèi)
public class MyUser {private String name;private String pass;private String aiHao;// 自己補(bǔ)充 get set toString}創(chuàng)建index.jsp
<form action="index1.jsp" method="post">賬戶(hù):<input type="text" name="name" value="HuAnmin" placeholder="請(qǐng)輸入你的賬戶(hù)"><br>密碼:<input type="text" name="pass" value="123" placeholder="請(qǐng)輸入你的密碼"><br>愛(ài)好:<input type="checkbox" name="aiHao" value="游泳" checked="checked">游泳<input type="checkbox" name="aiHao" value="跑步" checked="checked">跑步<input type="checkbox" name="aiHao" value="跳遠(yuǎn)">跳遠(yuǎn)<br><input type="submit" value="點(diǎn)擊"> </form>創(chuàng)建index1.jsp
<%//設(shè)置 請(qǐng)求 和響應(yīng) 的格式都是 utf-8request.setCharacterEncoding("utf-8"); %>--------普通用法--------<br> <%Map<String,String[]> name1=request.getParameterMap();out.println("賬戶(hù)"+name1.get("name")[0]+"<br/>");out.println("密碼"+name1.get("pass")[0]+"<br/>");out.println("愛(ài)好"+ Arrays.toString(name1.get("aiHao")) +"<br/>");%>-------------映射實(shí)體類(lèi)-------------<br> <%Map<String, String[]> parameterMap = request.getParameterMap();MyUser user=new MyUser(); //是這個(gè)包 import org.apache.commons.beanutils.BeanUtils;try {BeanUtils.populate(user,parameterMap); //將map對(duì)象中的值 按照key的名稱(chēng)和對(duì)象內(nèi)的成員名稱(chēng)進(jìn)行映射 (必須提供set 和get)} catch (IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}out.println(user); //打印實(shí)體類(lèi) %>表單提交到 index1.jsp頁(yè)面顯示
--------普通用法-------- 賬戶(hù)HuAnmin 密碼123 愛(ài)好[游泳, 跑步] -------------映射實(shí)體類(lèi)------------- MyUser{name='HuAnmin', pass='123', aiHao='游泳'}轉(zhuǎn)發(fā)常用內(nèi)置參數(shù)獲取
演示下面方法的用法
-
String request.getServletPath()
-
String request.getRequestURI()
-
String request. getRemoteAddr()
-
String request.getContextPath()
-
String request.getMethod()
-
String request. isSecure()
-
String getRequestedSessionId()
創(chuàng)建index.jsp
<% request.getRequestDispatcher("/index1.jsp").forward(request,response); %>創(chuàng)建index1.jsp
<%//設(shè)置 請(qǐng)求 和響應(yīng) 的格式都是 utf-8request.setCharacterEncoding("utf-8"); %><%out.println("請(qǐng)求的servlet路徑"+request.getServletPath()+"<br>");out.println("請(qǐng)求的URI: "+request.getRequestURI()+"<br>");out.println("客戶(hù)端IP地址:"+request.getRemoteAddr()+"<br>");out.println("虛擬路徑: "+request.getContextPath()+"<br>");out.println("請(qǐng)求方式: "+request.getMethod()+"<br>");out.println("是否使用了加密通道(HTTPS): "+request. isSecure()+"<br>");out.println("返回請(qǐng)求的session ID : "+request. getRequestedSessionId()+"<br>"); %>轉(zhuǎn)發(fā)到 index1.jsp頁(yè)面顯示
請(qǐng)求的servlet路徑/index1.jsp 請(qǐng)求的URI: /java_Web/index1.jsp 客戶(hù)端IP地址:0:0:0:0:0:0:0:1 虛擬路徑: /java_Web 請(qǐng)求方式: GET 是否使用了加密通道(HTTPS): false 返回請(qǐng)求的session ID : 71720FDE92375A2DDAD3BFC10D2A0DC7獲取游覽器的請(qǐng)求頭信息
演示下面方法的用法
用的不多 因?yàn)橐话愣际窃O(shè)置而不是獲取
- String request.getHeader(String key)
| Accept | 指定瀏覽器或其他客戶(hù)端可以處理的MIME類(lèi)型。它的值通常為 image/png 或 image/jpeg |
| Accept-Charset | 指定瀏覽器要使用的字符集。比如 ISO-8859-1 |
| Accept-Encoding | 指定編碼類(lèi)型。它的值通常為 gzip 或compress |
| Accept-Language | 指定客戶(hù)端首選語(yǔ)言,servlet會(huì)優(yōu)先返回以當(dāng)前語(yǔ)言構(gòu)成的結(jié)果集,如果servlet支持這種語(yǔ)言的話。比如 en,en-us,ru等等 |
| Authorization | 在訪問(wèn)受密碼保護(hù)的網(wǎng)頁(yè)時(shí)識(shí)別不同的用戶(hù) |
| Connection | 表明客戶(hù)端是否可以處理HTTP持久連接。持久連接允許客戶(hù)端或?yàn)g覽器在一個(gè)請(qǐng)求中獲取多個(gè)文件。Keep-Alive 表示啟用持久連接 |
| Content-Length | 僅適用于POST請(qǐng)求,表示 POST 數(shù)據(jù)的字節(jié)數(shù) |
| Cookie | 返回先前發(fā)送給瀏覽器的cookies |
| Host | 指出原始URL中的主機(jī)名和端口號(hào) |
| If-Modified-Since | 表明只有當(dāng)網(wǎng)頁(yè)在指定的日期被修改后客戶(hù)端才需要這個(gè)網(wǎng)頁(yè)。 服務(wù)器發(fā)送304碼給客戶(hù)端,表示沒(méi)有更新的資源 |
| If-Unmodified-Since | 與If-Modified-Since相反, 只有文檔在指定日期后仍未被修改過(guò),操作才會(huì)成功 |
| Referer | 標(biāo)志著所引用頁(yè)面的URL。比如,如果你在頁(yè)面1,然后點(diǎn)了個(gè)鏈接至頁(yè)面2,那么頁(yè)面1的URL就會(huì)包含在瀏覽器請(qǐng)求頁(yè)面2的信息頭中 |
| User-Agent | 用來(lái)區(qū)分不同瀏覽器或客戶(hù)端發(fā)送的請(qǐng)求,并對(duì)不同類(lèi)型的瀏覽器返回不同的內(nèi)容 |
創(chuàng)建index.jsp
Header: <%=request.getHeader("Host")%><br> Header: <%=request.getHeader("Accept")%><br> Header: <%=request.getHeader("Cookie")%><br> Header: localhost:8081 Header: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Header: JSESSIONID=71720FDE92375A2DDAD3BFC10D2A0DC7response(請(qǐng)求)
Response響應(yīng)對(duì)象主要將JSP容器處理后的結(jié)果傳回到客戶(hù)端。可以通過(guò)response變量設(shè)置HTTP的狀態(tài)和向客戶(hù)端發(fā)送數(shù)據(jù),如Cookie、HTTP文件頭信息等。
response對(duì)象的常用方法
| String encodeRedirectURL(String url) | 對(duì)sendRedirect()方法使用的URL進(jìn)行編碼 |
| String encodeURL(String url) | 將URL編碼,回傳包含Session ID的URL |
| boolean containsHeader(String name) | 返回指定的響應(yīng)頭是否存在 |
| boolean isCommitted() | 返回響應(yīng)是否已經(jīng)提交到客戶(hù)端 |
| void addCookie(Cookie cookie) | 添加指定的cookie至響應(yīng)中 |
| void addDateHeader(String name, long date) | 添加指定名稱(chēng)的響應(yīng)頭和日期值 |
| void addHeader(String name, String value) | 添加指定名稱(chēng)的響應(yīng)頭和值 |
| void addIntHeader(String name, int value) | 添加指定名稱(chēng)的響應(yīng)頭和int值 |
| void flushBuffer() | 將任何緩存中的內(nèi)容寫(xiě)入客戶(hù)端 |
| void reset() | 清除任何緩存中的任何數(shù)據(jù),包括狀態(tài)碼和各種響應(yīng)頭 |
| void resetBuffer() | 清除基本的緩存數(shù)據(jù),不包括響應(yīng)頭和狀態(tài)碼 |
| void sendError(int sc) | 使用指定的狀態(tài)碼向客戶(hù)端發(fā)送一個(gè)出錯(cuò)響應(yīng),然后清除緩存 |
| void sendError(int sc, String msg) | 使用指定的狀態(tài)碼和消息向客戶(hù)端發(fā)送一個(gè)出錯(cuò)響應(yīng) |
| void sendRedirect(String location) | 使用指定的URL向客戶(hù)端發(fā)送一個(gè)臨時(shí)的間接響應(yīng) |
| void setBufferSize(int size) | 設(shè)置響應(yīng)體的緩存區(qū)大小 |
| void setCharacterEncoding(String charset) | 指定響應(yīng)的編碼集(MIME字符集),例如UTF-8 |
| void setContentLength(int len) | 指定HTTP servlets中響應(yīng)的內(nèi)容的長(zhǎng)度,此方法用來(lái)設(shè)置 HTTP Content-Length 信息頭 |
| void setContentType(String type) | 設(shè)置響應(yīng)的內(nèi)容的類(lèi)型,如果響應(yīng)還未被提交的話 |
| void setDateHeader(String name, long date) | 使用指定名稱(chēng)和值設(shè)置響應(yīng)頭的名稱(chēng)和內(nèi)容 |
| void setHeader(String name, String value) | 使用指定名稱(chēng)和值設(shè)置響應(yīng)頭的名稱(chēng)和內(nèi)容 |
| void setIntHeader(String name, int value) | 使用指定名稱(chēng)和值設(shè)置響應(yīng)頭的名稱(chēng)和內(nèi)容 |
| void setLocale(Locale loc) | 設(shè)置響應(yīng)的語(yǔ)言環(huán)境,如果響應(yīng)尚未被提交的話 |
| void setStatus(int sc) | 設(shè)置響應(yīng)的狀態(tài)碼 |
動(dòng)態(tài)設(shè)置響應(yīng)的類(lèi)型
利用 <%@ page %> 指令設(shè)置發(fā)送到客戶(hù)端文檔響應(yīng)報(bào)頭的 MIME 類(lèi)型和字符編碼,
如<%@ page contentType=“text/html;charset=utf-8”%>,它表示當(dāng)用戶(hù)訪問(wèn)該頁(yè)面時(shí),JSP 引擎將按照 contentType 的屬性值即 text/html(網(wǎng)頁(yè))做出反應(yīng)。
如果要?jiǎng)討B(tài)改變這個(gè)屬性值來(lái)響應(yīng)客戶(hù),就需要使用 response 對(duì)象的 setContentType(String s) 方法。語(yǔ)法格式如下:
response.setContentType("MIME");MIME 可以為 :
-
text/css :客戶(hù)端瀏覽器按CSS格式進(jìn)行解析文檔
-
text/xml :客戶(hù)端瀏覽器按XML格式進(jìn)行解析文檔
-
text/html : (網(wǎng)頁(yè))
-
image/jpeg png jpg … 客戶(hù)端瀏覽器按指定格式進(jìn)行解析文檔
-
image/gif gif動(dòng)畫(huà)
-
video/mp4 mp4 視頻
-
text/plain 文本
-
application/zip 壓縮
-
application/pdf pdf 文檔
-
text/json json字符串
-
application/x-msexcel(Excel 文件)
-
application/msword(Word 文件)
-
…
可能大家看不懂到底有什么樣 我這樣告訴你 用處大這呢
下面是一個(gè) 小 的案例將后臺(tái)圖片 顯示在網(wǎng)頁(yè)上 常用于二維碼掃描
<%response.setCharacterEncoding("utf-8");response.setContentType("image/jpg"); //修改當(dāng)前頁(yè)面為long startTime = System.currentTimeMillis();ServletContext application1 = request.getServletContext();//填寫(xiě) 相對(duì)路徑 String ap=application1.getRealPath("img/test.jpg");try (FileInputStream fis1=new FileInputStream(ap);BufferedInputStream fis=new BufferedInputStream(fis1);ServletOutputStream outputStream = response.getOutputStream();){byte[] data=new byte[4096];int len;while( (len=fis.read(data) )!= -1) {outputStream.write(data,0,len);//寫(xiě)入數(shù)據(jù)}} catch (IOException e) {e.printStackTrace();return;}long endTime = System.currentTimeMillis();System.out.println("緩沖字節(jié)流復(fù)制視頻花費(fèi)時(shí)間為:" + (endTime - startTime)); %>你在運(yùn)行看看效果
重定向網(wǎng)頁(yè)
在某些情況下,當(dāng)響應(yīng)客戶(hù)時(shí),需要將客戶(hù)引導(dǎo)至另一個(gè)頁(yè)面,例如,當(dāng)客戶(hù)輸入正確的登錄信息時(shí),就需要被引導(dǎo)到登錄成功頁(yè)面,否則被引導(dǎo)到錯(cuò)誤顯示頁(yè)面。此時(shí),可以使用 response 的 sendRedirect(URL) 方法將客戶(hù)請(qǐng)求重定向到一個(gè)不同的頁(yè)面。
這里注意: 是重定向 而不是轉(zhuǎn)發(fā) 重定向后上一個(gè)頁(yè)面的數(shù)據(jù)將丟失
效果等同于 html 中的 <a href=“” >標(biāo)簽
例如,將客戶(hù)請(qǐng)求重定向到 login.jsp 頁(yè)面的代碼如下:
response.sendRedirect("login.jsp");錯(cuò)誤狀態(tài)
| 100 | Continue | 只有一部分請(qǐng)求被服務(wù)器接收,但只要沒(méi)被服務(wù)器拒絕,客戶(hù)端就會(huì)延續(xù)這個(gè)請(qǐng)求 |
| 101 | Switching Protocols | 服務(wù)器交換機(jī)協(xié)議 |
| 200 | OK | 請(qǐng)求被確認(rèn) |
| 201 | Created | 請(qǐng)求已完成,新的資源被創(chuàng)建 |
| 202 | Accepted | 請(qǐng)求被接受,但未處理完 |
| 203 | Non-authoritative Information | |
| 204 | No Content | |
| 205 | Reset Content | |
| 206 | Partial Content | |
| 300 | Multiple Choices | 一個(gè)超鏈接表,用戶(hù)可以選擇一個(gè)超鏈接并訪問(wèn),最大支持5個(gè)超鏈接 |
| 301 | Moved Permanently | 被請(qǐng)求的頁(yè)面已經(jīng)移動(dòng)到了新的URL下 |
| 302 | Found | 被請(qǐng)求的頁(yè)面暫時(shí)性地移動(dòng)到了新的URL下 |
| 303 | See Other | 被請(qǐng)求的頁(yè)面可以在一個(gè)不同的URL下找到 |
| 304 | Not Modified | |
| 305 | Use Proxy | |
| 306 | Unused | 已經(jīng)不再使用此狀態(tài)碼,但狀態(tài)碼被保留 |
| 307 | Temporary Redirect | 被請(qǐng)求的頁(yè)面暫時(shí)性地移動(dòng)到了新的URL下 |
| 400 | Bad Request | 服務(wù)器無(wú)法識(shí)別請(qǐng)求 |
| 401 | Unauthorized | 被請(qǐng)求的頁(yè)面需要用戶(hù)名和密碼 |
| 402 | Payment Required | 目前還不能使用此狀態(tài)碼 |
| 403 | Forbidden | 禁止訪問(wèn)所請(qǐng)求的頁(yè)面 |
| 404 | Not Found | 服務(wù)器無(wú)法找到所請(qǐng)求的頁(yè)面 |
| 405 | Method Not Allowed | 請(qǐng)求中所指定的方法不被允許 |
| 406 | Not Acceptable | 服務(wù)器只能創(chuàng)建一個(gè)客戶(hù)端無(wú)法接受的響應(yīng) |
| 407 | Proxy Authentication Required | 在請(qǐng)求被服務(wù)前必須認(rèn)證一個(gè)代理服務(wù)器 |
| 408 | Request Timeout | 請(qǐng)求時(shí)間超過(guò)了服務(wù)器所能等待的時(shí)間,連接被斷開(kāi) |
| 409 | Conflict | 請(qǐng)求有矛盾的地方 |
| 410 | Gone | 被請(qǐng)求的頁(yè)面不再可用 |
| 411 | Length Required | "Content-Length"沒(méi)有被定義,服務(wù)器拒絕接受請(qǐng)求 |
| 412 | Precondition Failed | 請(qǐng)求的前提條件被服務(wù)器評(píng)估為false |
| 413 | Request Entity Too Large | 因?yàn)檎?qǐng)求的實(shí)體太大,服務(wù)器拒絕接受請(qǐng)求 |
| 414 | Request-url Too Long | 服務(wù)器拒絕接受請(qǐng)求,因?yàn)閁RL太長(zhǎng)。多出現(xiàn)在把"POST"請(qǐng)求轉(zhuǎn)換為"GET"請(qǐng)求時(shí)所附帶的大量查詢(xún)信息 |
| 415 | Unsupported Media Type | 服務(wù)器拒絕接受請(qǐng)求,因?yàn)槊襟w類(lèi)型不被支持 |
| 417 | Expectation Failed | |
| 500 | Internal Server Error | 請(qǐng)求不完整,服務(wù)器遇見(jiàn)了出乎意料的狀況 |
| 501 | Not Implemented | 請(qǐng)求不完整,服務(wù)器不提供所需要的功能 |
| 502 | Bad Gateway | 請(qǐng)求不完整,服務(wù)器從上游服務(wù)器接受了一個(gè)無(wú)效的響應(yīng) |
| 503 | Service Unavailable | 請(qǐng)求不完整,服務(wù)器暫時(shí)重啟或關(guān)閉 |
| 504 | Gateway Timeout | 網(wǎng)關(guān)超時(shí) |
| 505 | HTTP Version Not Supported | 服務(wù)器不支持所指定的HTTP版本 |
在 JSP 頁(yè)面中,使用 response 對(duì)象中的 sendError() 方法指明一個(gè)錯(cuò)誤狀態(tài)。該方法接收一個(gè)錯(cuò)誤以及一條可選的錯(cuò)誤消息,該消息將內(nèi)容主體返回給客戶(hù)。
例如,代碼 response.sendError(500"請(qǐng)求頁(yè)面存在錯(cuò)誤") 將客戶(hù)請(qǐng)求重定向到一個(gè)在內(nèi)容主體上包含出錯(cuò)消息的出錯(cuò)頁(yè)面。
創(chuàng)建index.jsp
<form name="forml" method="post" action="index1.jsp">用戶(hù)名:<input name="user" type="text" /> <br>密 碼:<input name="pwd" type="text" /> <br><input type="submit" value="提交" /><input type="reset" value="重置" /> </form>創(chuàng)建index1.jsp
<%request.setCharacterEncoding("utf-8");String user=request.getParameter("user");String pwd=request.getParameter("pwd");if(user.equals("admin")&&pwd.equals("123"))//判斷賬戶(hù)密碼{response.sendRedirect("jsp/ok.jsp");}else{response.sendError(500,"請(qǐng)輸入正確的用戶(hù)和密碼!");} %>創(chuàng)建/jsp/ok.jsp
<h1>登錄成功</h1>當(dāng)?shù)卿浭『?/p>
設(shè)置響應(yīng)頭
常用的響應(yīng)頭:
| Allow | 指定服務(wù)器支持的request方法(GET,POST等等) |
| Cache-Control | 指定響應(yīng)文檔能夠被安全緩存的情況。通常取值為 public**,**private 或no-cache 等等。 Public意味著文檔可緩存,Private意味著文檔只為單用戶(hù)服務(wù)并且只能使用私有緩存。No-cache 意味著文檔不被緩存。 |
| Connection | 命令瀏覽器是否要使用持久的HTTP連接。close****值 命令瀏覽器不使用持久HTTP連接,而keep-alive 意味著使用持久化連接。 |
| Content-Disposition | 讓瀏覽器要求用戶(hù)將響應(yīng)以給定的名稱(chēng)存儲(chǔ)在磁盤(pán)中 |
| Content-Encoding | 指定傳輸時(shí)頁(yè)面的編碼規(guī)則 |
| Content-Language | 表述文檔所使用的語(yǔ)言,比如en, en-us,,ru等等 |
| Content-Length | 表明響應(yīng)的字節(jié)數(shù)。只有在瀏覽器使用持久化 (keep-alive) HTTP 連接時(shí)才有用 |
| Content-Type | 表明文檔使用的MIME類(lèi)型 |
| Expires | 指明啥時(shí)候過(guò)期并從緩存中移除 |
| Last-Modified | 指明文檔最后修改時(shí)間。客戶(hù)端可以 緩存文檔并且在后續(xù)的請(qǐng)求中提供一個(gè) If-Modified-Since請(qǐng)求頭 |
| Location | 在300秒內(nèi),包含所有的有一個(gè)狀態(tài)碼的響應(yīng)地址,瀏覽器會(huì)自動(dòng)重連然后檢索新文檔 |
| Refresh | 指明瀏覽器每隔多久請(qǐng)求更新一次頁(yè)面。 |
| Retry-After | 與503 (Service Unavailable)一起使用來(lái)告訴用戶(hù)多久后請(qǐng)求將會(huì)得到響應(yīng) |
| Set-Cookie | 指明當(dāng)前頁(yè)面對(duì)應(yīng)的cookie |
response 對(duì)象的 setHeader() 方法用于設(shè)置指定名字的 HTTP 文件頭的值,如果該值已經(jīng)存在,則新值會(huì)覆蓋舊值。最常用的一個(gè)頭信息是 refresh,用于設(shè)置刷新或者跳轉(zhuǎn)。
實(shí)現(xiàn)頁(yè)面一秒鐘刷新一次,設(shè)置語(yǔ)句如下:
response.setHeader("refresh","1");實(shí)現(xiàn)頁(yè)面定時(shí)跳轉(zhuǎn),如 2 秒鐘后自動(dòng)跳轉(zhuǎn)到URL所指的頁(yè)面,設(shè)置語(yǔ)句如下
response.setHeader("refresh","3;jsp/ok.jsp") ;例:用 response 對(duì)象自動(dòng)刷新客戶(hù)頁(yè)面,實(shí)現(xiàn)秒表的功能,代碼如下:
<h2> response 對(duì)象設(shè)置頁(yè)面自動(dòng)刷新</h2> <font size="5" color=blue> 數(shù)字時(shí)鐘 </font> <br> <br> <font size="3" color=blue> 現(xiàn)在時(shí)刻:<br><%response.setHeader("refresh","1");//每秒刷新一次頁(yè)面int y,m,d,h,mm,s;Calendar c=Calendar.getInstance();y=c.get(Calendar.YEAR); //年m=c.get(Calendar.MONTH)+1; //月d=c.get(Calendar.DAY_OF_MONTH); //日h=c.get(Calendar.HOUR); //時(shí)(HOUR:十二小時(shí)制:HOUR_OF_DAY:十二四小時(shí)制)mm=c.get(Calendar.MINUTE); //分s=c.get(Calendar.SECOND); //分out.println(y+"年"+m+"月"+d+"日"+h+"時(shí)"+mm+"分"+s+"秒");%> </font>轉(zhuǎn)發(fā)和重定向的區(qū)別
轉(zhuǎn)發(fā) 就是將頁(yè)面a 的數(shù)據(jù)轉(zhuǎn)發(fā)到頁(yè)面b( 處理后發(fā)現(xiàn)我好像處理不了) 然后可以在次使用轉(zhuǎn)發(fā) 將a頁(yè)面數(shù)據(jù) 轉(zhuǎn)發(fā)到頁(yè)面c(進(jìn)行處理)
url 不變 還是a頁(yè)面的地址
(注意 轉(zhuǎn)發(fā) 不能訪問(wèn) 項(xiàng)目之外 的資源 比如百度等等)
重定向 是將請(qǐng)求的url和狀態(tài)碼302返回給跳轉(zhuǎn)前的頁(yè)面然后讓他進(jìn)行重新跳轉(zhuǎn) url 變?yōu)?跳轉(zhuǎn)的url
也就是說(shuō)重定向一次就會(huì)發(fā)送兩次請(qǐng)求
(重定向 可以訪問(wèn) 項(xiàng)目之外的 資源 比如: https://www.baidu.com/)
也就是將頁(yè)面重請(qǐng)求新的頁(yè)面 url地址更換 和a標(biāo)簽 一樣
不能進(jìn)行上一個(gè)頁(yè)面數(shù)據(jù)的共享 因?yàn)閡rl都變了 request作用域也就沒(méi)有了 所以request里的數(shù)據(jù)也就沒(méi)了
session(會(huì)話)
四大作用域之一session 數(shù)據(jù)是保存在服務(wù)端的
客戶(hù)與服務(wù)器之間的通信是通過(guò) HTTP 協(xié)議完成的。HTTP 是一種無(wú)狀態(tài)的協(xié)議,當(dāng)客戶(hù)向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器接收請(qǐng)求并返回響應(yīng)后,該連接就被關(guān)閉了。此時(shí),服務(wù)器端不保留連接的有關(guān)信息,要想記住客戶(hù)的連接信息,可以使用 JSP 提供的 session 對(duì)象。
用戶(hù)登錄網(wǎng)站時(shí),系統(tǒng)將為其生成一個(gè)獨(dú)一無(wú)二的 session 對(duì)象,用以記錄該用戶(hù)的個(gè)人信息。一旦用戶(hù)退出網(wǎng)站,那么,所對(duì)應(yīng)的 session 對(duì)象將被注銷(xiāo)。session 對(duì)象可以綁定若干個(gè)用戶(hù)信息或者 JSP 對(duì)象,不同的 session 對(duì)象的同名變量是不會(huì)相互干擾的。
當(dāng)用戶(hù)首次訪問(wèn)服務(wù)器上的一個(gè) JSP 頁(yè)面時(shí),JSP 引擎便產(chǎn)生一個(gè) session 對(duì)象,同時(shí)分配一個(gè) String 類(lèi)型的 ID 號(hào),JSP 引擎同時(shí)將這個(gè) ID 號(hào)發(fā)送到客戶(hù)端,存放在 Cookie 中,這樣,session 對(duì)象和客戶(hù)端之間就建立了一一對(duì)應(yīng)的關(guān)系。
當(dāng)用戶(hù)再次訪問(wèn)該服務(wù)器的其他頁(yè)面時(shí),不再分配給用戶(hù)新的 session 對(duì)象,直到用戶(hù)關(guān)閉瀏覽器,或者在一定時(shí)間(系統(tǒng)默認(rèn)在 30 分鐘內(nèi),但可在編寫(xiě)程序時(shí),修改這個(gè)時(shí)間限定值或者顯式地結(jié)束一個(gè)會(huì)話)客戶(hù)端不向服務(wù)器發(fā)出應(yīng)答請(qǐng)求,服務(wù)器端就會(huì)取消該用戶(hù)的 session 對(duì)象,與用戶(hù)的會(huì)話對(duì)應(yīng)關(guān)系消失。當(dāng)用戶(hù)重新打開(kāi)瀏覽器,再次連接到該服務(wù)器時(shí),服務(wù)器為該用戶(hù)再創(chuàng)建一個(gè)新的 session 對(duì)象。
session 對(duì)象保存的是每個(gè)用戶(hù)專(zhuān)用的私有信息,可以是與客戶(hù)端有關(guān)的,也可以是一般信息,可以根據(jù)需要設(shè)定相應(yīng)的內(nèi)容,并且所保存的信息在當(dāng)前 session 屬性范圍內(nèi)是共享的。
簡(jiǎn)單來(lái)說(shuō):
session 的生命周期 就是本頁(yè)面的處理結(jié)果 在所有頁(yè)面關(guān)閉前都有效 也就是把游覽器關(guān)了(超過(guò)有效期 和總時(shí)間) 也會(huì)失效
也就跟打電話一樣 只要電話不斷就一直有效 而電話就是游覽器 但是會(huì)有時(shí)間限制默認(rèn)30分鐘 沒(méi)有重定向 和 轉(zhuǎn)發(fā)的限制
不同游覽器之間數(shù)據(jù)不通用 因?yàn)槊總€(gè)會(huì)話的sessionid不同
session對(duì)象的常用方法:
| Object getAttribute(String name) | 獲取指定名字的屬性 |
| Enumeration getAttributeName() | 獲取 session 中全部屬性的名字,一個(gè)枚舉 |
| long getCreationTime() | 返回 session 的創(chuàng)建時(shí)間,單位:毫秒 |
| public String getld() | 返回創(chuàng)建 session 時(shí) JSP 引擎為它設(shè)置的唯一 ID 號(hào) |
| long getLastAccessedTime() | 返回此 session 中客戶(hù)端最近一次請(qǐng)求的時(shí)間。由 1970-01-01算起,單位是毫秒。使用這個(gè)方法,可以判斷某個(gè)用戶(hù)在站點(diǎn)上一共停留了多長(zhǎng)時(shí)間 |
| int getMaxInactiveInterval() | 返回兩次請(qǐng)求間隔多長(zhǎng)時(shí)間 session 被銷(xiāo)毀(單位:秒) |
| void setMaxlnactivelnterval(int interval) | 設(shè)置兩次請(qǐng)求間隔多長(zhǎng)時(shí)間 session 被銷(xiāo)毀(單位:秒) |
| void invalidate() | 銷(xiāo)毀 session 對(duì)象 |
| boolean isNew() | 判斷請(qǐng)求是否會(huì)產(chǎn)生新的 session 對(duì)象 |
| void removeAttxibute(String name) | 刪除指定名字的屬性 |
| void setAttribute(String name,String value) | 設(shè)定指定名字的屬性值 |
使用 session 對(duì)象在不同的 JSP 文件(整個(gè)客戶(hù)會(huì)話過(guò)程,即 session scope)中保存屬性信息,比如用戶(hù)名、驗(yàn)證信息等,最為典型的應(yīng)用是實(shí)現(xiàn)網(wǎng)上商店購(gòu)物車(chē)的信息存儲(chǔ)。下面重點(diǎn)介紹 session 對(duì)象的應(yīng)用。
創(chuàng)建及獲取客戶(hù)會(huì)話屬性
JSP 頁(yè)面可以將任何對(duì)象作為屬性來(lái)保存。使用 setAttribute() 方法設(shè)置指定名稱(chēng)的屬性,并將其存儲(chǔ)在 session 對(duì)象中,使用 getAttribute() 方法獲取與指定名字 name 相聯(lián)系的屬性。語(yǔ)法格式如下:
session.setAttribute(String name,String value); //參數(shù)name為屬性名稱(chēng),value為屬性值 session.getAttribute(String name); //參數(shù) name 為屬性名稱(chēng)例: 用 session 對(duì)象創(chuàng)建及獲取會(huì)話屬性。通過(guò) session 對(duì)象的 setAttribute() 方法,將數(shù)據(jù)保存在 session 對(duì)象中,并通過(guò) getAttribute() 方法取得數(shù)據(jù)的值,代碼如下:
創(chuàng)建index.jsp
<body>session 的創(chuàng)建時(shí)間:<%=new Date(session.getCreationTime()).toLocaleString() %> <br>session 的 ID 號(hào):<%=session.getId() %> <br> <hr>當(dāng)前時(shí)間:<%=new Date().toLocaleString( ) %> <br>該 session 是新創(chuàng)建的嗎?:<%=session.isNew()?"是":"否" %> <br> <hr>當(dāng)前時(shí)間:<%=new Date().toLocaleString( ) %> <br><% session.setAttribute("info","您好,我們正在使用 session 對(duì)象傳遞數(shù)據(jù)!"); %>已向 Session 中保存數(shù)據(jù),請(qǐng)單擊下面的鏈接將頁(yè)面重定向到 idnex1.jsp<a href="index1.jsp"> 請(qǐng)按這里</a> </body>創(chuàng)建index1.jsp
獲取 session 中的數(shù)據(jù)為:<br> <%=session.getAttribute("info")%>從會(huì)話中移除指定的對(duì)象
JSP 頁(yè)面可以將任何已經(jīng)保存的對(duì)象部分或者全部移除。使用 removeAttribute() 方法,將指定名稱(chēng)的對(duì)象移除,也就是說(shuō),從這個(gè)會(huì)話刪除與指定名稱(chēng)綁定的對(duì)象。使用 invalidate() 方法,可以將會(huì)話中的全部?jī)?nèi)容刪除。語(yǔ)法格式如下:
session.removeAttribute(String name); //參數(shù)name為session對(duì)象的屬性名,代表要移除的對(duì)象名 session.invalidate(); //把保存的所有對(duì)象全部刪除在上面的案例中將index1.jsp改造
移除 session 中的數(shù)據(jù)后:<br> <%session.removeAttribute("info");if(session.getAttribute("info")==null){out.println("session 對(duì)象 info 已經(jīng)不存在");}else{out.println(session.getAttribute("info"));};%>index1.jsp顯示
移除 session 中的數(shù)據(jù)后: session 對(duì)象 info 已經(jīng)不存在設(shè)置會(huì)話時(shí)限
當(dāng)某一客戶(hù)與 Web 應(yīng)用程序之間處于非活動(dòng)狀態(tài)時(shí),并不以顯式的方式通知服務(wù)器,所以,在 Servlet 程序或 JSP 文件中,做超時(shí)設(shè)置是確保客戶(hù)會(huì)話終止的唯一方法。
Servlet 程序容器設(shè)置一個(gè)超時(shí)時(shí)長(zhǎng),當(dāng)客戶(hù)非活動(dòng)的時(shí)間超出時(shí)長(zhǎng)的大小時(shí),JSP 容器將使 session 對(duì)象無(wú)效,并撤銷(xiāo)所有屬性的綁定,這樣,就清除了客戶(hù)申請(qǐng)的資源,從而實(shí)現(xiàn)了會(huì)話生命周期的管理。
session 用于管理會(huì)話生命周期的方法有 getLastAccessedTime()、getMaxInactiveInterval() 和 setMaxInactiveInterval(int interval)。
例: 為 session 對(duì)象設(shè)置會(huì)話時(shí)限。首先輸出 session 對(duì)象默認(rèn)的有效時(shí)間,然后設(shè)置為 5 分鐘,并輸出新設(shè)置的有效時(shí)間。代碼如下:
<body>session 對(duì)象默認(rèn)的有效時(shí)間:<%=session.getMaxInactiveInterval()%>秒<br><%session.setMaxInactiveInterval(60*5); //設(shè)置session的有效時(shí)間為5分鐘%>已經(jīng)將 session 有效時(shí)間修改為:<%=session.getMaxInactiveInterval()%>秒<br> </body>頁(yè)面顯示
session 對(duì)象默認(rèn)的有效時(shí)間:1800秒 已經(jīng)將 session 有效時(shí)間修改為:300秒設(shè)置總默認(rèn)會(huì)話時(shí)間
原本默認(rèn)為30分鐘 也就是 1800秒
在配置文件web.xml里 添加
<session-config><session-timeout>60</session-timeout></session-config>然后使用下面的代碼看看
session 對(duì)象默認(rèn)的有效時(shí)間:<%=session.getMaxInactiveInterval()%>秒<br>頁(yè)面顯示
session 對(duì)象默認(rèn)的有效時(shí)間:3600秒設(shè)置
application(應(yīng)用程序)
四大作用域之一application 數(shù)據(jù)保存在服務(wù)器里
JSP application 對(duì)象用于保存應(yīng)用程序的公用數(shù)據(jù),服務(wù)器啟動(dòng)并自動(dòng)創(chuàng)建 application 對(duì)象后,只要沒(méi)有關(guān)閉服務(wù)器,application 對(duì)象就一直存在,所有用戶(hù)共享 application 對(duì)象。
不同游覽之間都能 獲取 到application 內(nèi)的值 因?yàn)橹凳潜4嬖诜?wù)器上的 沒(méi)有session那樣的限制 需要sessionid
類(lèi)似于系統(tǒng)的全局變量 也就是application里儲(chǔ)存的值 是可以被多個(gè)頁(yè)面同時(shí)調(diào)用的
application 對(duì)象的常用方法。
| getAttribute( String arg) | 獲取 application 對(duì)象中含有關(guān)鍵字的對(duì)象 |
| getAttributeNames() | 獲取 application 對(duì)象的所有參數(shù)名字 |
| getMajorVersion() | 獲取服務(wù)器支持 Servlet 的主版本號(hào) |
| getMinorVersion() | 獲取服務(wù)器支持 Servlet 的從版本號(hào) |
| removeAttribute(java.lang.String name) | 根據(jù)名字刪除 application 對(duì)象的參數(shù) |
| setAttribute(String key,Object obj) | 將參數(shù) Object 指定的對(duì)象 obj 添加到 application 對(duì)象中,并 為添加的對(duì)象指定一個(gè)索引關(guān)鍵字 |
例: 利用 application 對(duì)象查找 Servlet 有關(guān)的屬性信息,包括 Servlet 的引擎名、版本號(hào)、服務(wù)器支持的 Servlet API 的最大和最小版本號(hào)、指定資源的路徑等。代碼如下:
創(chuàng)建idnex.jsp
<body> JSP(SERVLET)引擎名及版本號(hào): <%=application.getServerInfo()%><br> 服務(wù)器支持的 Server API 的最大版本號(hào): <%=application.getMajorVersion ()%><br> 服務(wù)器支持的 Server API 的最小版本號(hào): <%=application.getMinorVersion ()%><br> 指定資源(文件及目錄)的 URL 路徑: <%=application.getResource("index.jsp")%><br> 返回 index.jsp 虛擬路徑的真實(shí)路徑:<br> <%=application.getRealPath("index.jsp")%> </body>頁(yè)面顯示
JSP(SERVLET)引擎名及版本號(hào): Apache Tomcat/9.0.29 服務(wù)器支持的 Server API 的最大版本號(hào): 4 服務(wù)器支持的 Server API 的最小版本號(hào): 0 指定資源(文件及目錄)的 URL 路徑: file:/C:/Users/12841/IdeaProjects/java-Web/target/java-Web/index.jsp 返回 index.jsp 虛擬路徑的真實(shí)路徑: C:\Users\12841\IdeaProjects\java-Web\target\java-Web\index.jsp管理應(yīng)用程序?qū)傩?/strong>
application 對(duì)象與 session 對(duì)象相同,都可以設(shè)置屬性。但是,兩個(gè)屬性的有效范圍是不同的。
在 session 對(duì)象中,設(shè)置的屬性只在當(dāng)前客戶(hù)的會(huì)話范圍(session scope)有效,客戶(hù)超過(guò)預(yù)期時(shí)間不發(fā)送請(qǐng)求時(shí),session 對(duì)象將被回收。
在 application 對(duì)象中設(shè)置的屬性在整個(gè)應(yīng)用程序范圍(application scope)都有效。即使所有的用戶(hù)都不發(fā)送請(qǐng)求,只要不關(guān)閉應(yīng)用服務(wù)器,在其中設(shè)置的屬性也是有效的。
列: 用 application 對(duì)象的 setAttribute() 和 getAttribute() 方法 實(shí)現(xiàn)網(wǎng)頁(yè)計(jì)數(shù)器功能(記錄網(wǎng)站的訪問(wèn)量),代碼如下:
<%int n=0;if(application.getAttribute("num")==null)n=1;else{String str=application.getAttribute("num").toString();//getAttribute("num")返回的是Object類(lèi)型n=Integer.valueOf(str).intValue()+1;}application.setAttribute("num",n);out.println("您好,您是第"+application.getAttribute("num")+"位訪問(wèn)客戶(hù)!"); %>然后你刷新頁(yè)面看看效果
您好,您是第3位訪問(wèn)客戶(hù)!out對(duì)象(輸出)
out 對(duì)象是一個(gè)輸出流,用來(lái)向客戶(hù)端輸出數(shù)據(jù),可以是各種數(shù)據(jù)類(lèi)型的內(nèi)容,同時(shí),它還可以管理應(yīng)用服務(wù)器上的輸出緩沖區(qū),緩沖區(qū)的默認(rèn)值是 8KB,可以通過(guò)頁(yè)面指令 page 來(lái)改變默認(rèn)大小。
out 對(duì)象是一個(gè)繼承自抽象類(lèi) javax.servlet.jsp.JspWriter 的實(shí)例,在實(shí)際應(yīng)用中,out 對(duì)象會(huì)通過(guò) JSP 容器變換為 java.io.PrintWriter 類(lèi)的對(duì)象。
在使用 out 對(duì)象輸出數(shù)據(jù)時(shí),可以對(duì)數(shù)據(jù)緩沖區(qū)進(jìn)行操作,及時(shí)清除緩沖區(qū)中的殘余數(shù)據(jù),為其他的輸出讓出緩沖空間。數(shù)據(jù)輸出完畢后要及時(shí)關(guān)閉輸出流。下面介紹 out 對(duì)象的應(yīng)用。
out 對(duì)象常用的方法
| void print(各種數(shù)據(jù)類(lèi)型) | 將指定類(lèi)型的數(shù)據(jù)輸出到 HTTP 流,不換行 |
| void println(各種數(shù)據(jù)類(lèi)型) | 將指定類(lèi)型的數(shù)據(jù)輸出到 HTTP 流,并輸出一個(gè)換行符 |
| void newline | 輸出換行字符 |
向客戶(hù)端輸出數(shù)據(jù)
在使用 print() 或 println() 方法向客戶(hù)端輸出時(shí),由于客戶(hù)端是瀏覽器,因此可以使用 HTML 中的一些標(biāo)記控制輸出格式。例如:
<%out.println("<font color=red>Hello </font>"); %>管理輸出緩沖區(qū)
默認(rèn)情況下,服務(wù)端要輸出到客戶(hù)端的內(nèi)容不直接寫(xiě)到客戶(hù)端,而是先寫(xiě)到一個(gè)輸出緩沖區(qū)中。使用 out 對(duì)象的 getBufferSize() 方法取得當(dāng)前緩沖區(qū)的大小(單位是 KB),用 getRemaining() 方法取得當(dāng)前使用后還剩余的緩沖區(qū)的大小(單位是 KB)。
JSP 只有在下面三種情況下,才會(huì)把緩沖區(qū)的內(nèi)容輸出到客戶(hù)端。
? 該 JSP 網(wǎng)頁(yè)已完成信息的輸出。
? 輸出緩沖區(qū)己滿
? JSP 中調(diào)用了 out.flush() 或 response.flushBuffer()。
另外,調(diào)用 out 對(duì)象的 clear() 方法,可以清除緩沖區(qū)的內(nèi)容,類(lèi)似于重置響應(yīng)流,以便重新開(kāi)始操作。如果響應(yīng)已經(jīng)提交,則會(huì)產(chǎn)生 IOException 異常。此外,另一種方法 clearBuffer() 可以清除緩沖區(qū)“當(dāng)前”內(nèi)容,而且即使內(nèi)容已經(jīng)提交給客戶(hù)端,也能夠訪問(wèn)該方法。
例: 用 out 對(duì)象管理輸出緩沖區(qū),代碼如下:
<%out.println("使用out對(duì)象管理輸出緩沖區(qū):<br>");%> <br> 緩沖大小:<%=out.getBufferSize()%> <br> 剩余緩存大小:<%=out.getRemaining()%> <br> 是否自動(dòng)刷新:<%=out.isAutoFlush()%> <br>通過(guò)改變println 來(lái)觀察變化
pageContext對(duì)象(頁(yè)面上下文對(duì)象)
pageContext 是頁(yè)面上下文對(duì)象,這個(gè)特殊的對(duì)象提供了 JSP 程序執(zhí)行時(shí)所需要用到的所有屬性和方法,如 session、application、config、out 等對(duì)象的屬性,也就是說(shuō),它可以訪問(wèn)本頁(yè)所有的 session,也可以取本頁(yè)所在的 application 的某一屬性值,它相當(dāng)于頁(yè)面中所有其他對(duì)象功能的集合,可以用它訪問(wèn)本頁(yè)中所有的其他對(duì)象。
pageContext 對(duì)象是 javax.servlet:jsp.pageContext 類(lèi)的一個(gè)實(shí)例,它的創(chuàng)建和初始化都是由容器來(lái)完成的,JSP 頁(yè)面里可以直接使用 pageContext 對(duì)象的句柄,pageContext 對(duì)象的 getXxx()、setXxx() 和 findXxx() 方法可以根據(jù)不同的對(duì)象范圍實(shí)現(xiàn)對(duì)這些對(duì)象的管理。列出了 pageContext 對(duì)象的常用方法:
| void forward(String relativeUrlPath) | 把頁(yè)面轉(zhuǎn)發(fā)到另一個(gè)頁(yè)面或者 Servlet 組件上 |
| Exception getException() | 返回當(dāng)前頁(yè)的 Exception 對(duì)象 |
| ServletRequest getRequest() | 返回當(dāng)前頁(yè)的 request 對(duì)象 |
| ServletResponse getResponse() | 返回當(dāng)前頁(yè)的 response 對(duì)象 |
| ServletConfig getServletConfig() | 返回當(dāng)前頁(yè)的 ServletConfig 對(duì)象 |
| HttpSession getSession() | 返回當(dāng)前頁(yè)的 session 對(duì)象 |
| Object getPage() | 返回當(dāng)前頁(yè)的 page 對(duì)象 |
| ServletContext getServletContext() | 返回當(dāng)前頁(yè)的 application 對(duì)象 |
| public Object getAttribute(String name) | 獲取屬性值 |
| Object getAttribute(String name,int scope) | 在指定的范圍內(nèi)獲取屬性值 |
| void setAttribute(String name,Object attribute) | 設(shè)置屬性及屬性值 |
| void setAttribute(String name,Object obj,int scope) | 在指定范圍內(nèi)設(shè)置屬性及屬性值 |
| void removeAttribute(String name) | 刪除某屬性 |
| void removeAttribute(String name,int scope) | 在指定范圍內(nèi)刪除某屬性 |
| void invalidate() | 返回 servletContext 對(duì)象,全部銷(xiāo)毀 |
pageContext 對(duì)象的主要作用是提供一個(gè)單一界面,以管理各種公開(kāi)對(duì)象(如 session、application、config、request、response 等),提供一個(gè)單一的 API 來(lái)管理對(duì)象和屬性。
通過(guò) pageContext 對(duì)象取得不同范圍的屬性值,代碼如下:
<body> <%request.setAttribute("info","value of request scope");session.setAttribute("info","value of request scope");application.setAttribute("info","value of application scope"); %> 利用 pageContext 取出以下范圍內(nèi)各值(方法一):<br> request 設(shè)定的值:<%=pageContext.getRequest().getAttribute("info") %> <br> session 設(shè)定的值:<%=pageContext.getSession().getAttribute("info") %> <br> application 設(shè)的值:<%=pageContext.getServletContext().getAttribute("info") %> <hr> 利用pageContext取出以下范圍內(nèi)各值(方法二):<br> 范圍1(page)內(nèi)的值:<%=pageContext.getAttribute("info",1) %> <br> 范圍2(request)內(nèi)的值:<%=pageContext.getAttribute("info",2) %> <br> 范圍3(session)內(nèi)的值:<%=pageContext.getAttribute("info",3) %> <br> 范圍4(application)內(nèi)的值:<%=pageContext.getAttribute("info",4) %> <hr> 利用 pageContext 修改或刪除某個(gè)范圍內(nèi)的值:<br> 修改 request 設(shè)定的值: <% pageContext.setAttribute("info","value of request scope is modified by pageContext",2); %> <br> 修改后:<%=pageContext.getRequest().getAttribute("info") %> <br> 刪除: session 設(shè)定的值:<br> <% pageContext.removeAttribute("info"); %> 刪除后:<%=session.getAttribute("info") %> </body>頁(yè)面顯示
利用 pageContext 取出以下范圍內(nèi)各值(方法一): request 設(shè)定的值:value of request scope session 設(shè)定的值:value of request scope application 設(shè)的值:value of application scope 利用pageContext取出以下范圍內(nèi)各值(方法二): 范圍1(page)內(nèi)的值:null 范圍2(request)內(nèi)的值:value of request scope 范圍3(session)內(nèi)的值:value of request scope 范圍4(application)內(nèi)的值:value of application scope 利用 pageContext 修改或刪除某個(gè)范圍內(nèi)的值: 修改 request 設(shè)定的值: 修改后:value of request scope is modified by pageContext 刪除: session 設(shè)定的值: 刪除后:nullconfig對(duì)象(配置對(duì)象)
當(dāng)一個(gè) Servlet 初始化時(shí),容器把某些信息通過(guò)此對(duì)象傳遞給這個(gè) Servlet,這些信息包括 Servlet 初始化時(shí)所要用到的參數(shù)(通過(guò)屬性名和屬性值構(gòu)成)以及服務(wù)器的有關(guān)信息,config 對(duì)象的應(yīng)用范圍是本頁(yè)。
開(kāi)發(fā)者可以在 web.xml 文件中為應(yīng)用程序環(huán)境中的 Servlet 程序和 JSP 頁(yè)面提供初始化參數(shù)
config對(duì)象的常用方法
| ServletContext getServletContext() | 返回所執(zhí)行的 Servlet 的環(huán)境對(duì)象 |
| String getServletName() | 返回所執(zhí)行的 Servlet 的名字 |
| String getInitParameter(String name) | 返回指定名字的初始參數(shù)值 |
| Enumeration getlnitParameterName() | 返回該 JSP 中所有初始參數(shù)名,一個(gè)枚舉 |
列:
在web.xml中添加如下參數(shù)
<servlet><!--指定servlet的名字--><servlet-name>config_index</servlet-name><!--指定哪一個(gè)JSP頁(yè)面配置成Servlet--><jsp-file>/index.jsp</jsp-file><!--配置名為name的參數(shù),值為yeeku--><init-param><param-name>name</param-name><param-value>yeeku</param-value></init-param><!--配置名為age的參數(shù),值為30--><init-param><param-name>age</param-name><param-value>30</param-value></init-param></servlet><servlet-mapping><!--指定將config Servlet配置到/config路徑--><servlet-name>config_index</servlet-name><url-pattern>/index.jsp</url-pattern></servlet-mapping>創(chuàng)建/index.jsp
<%=config.getServletName()%><br> <!-- 輸出該JSP中名為name的參數(shù)配置信息 --> name配置參數(shù)的值:<%=config.getInitParameter("name")%><br/> <!-- 輸出該JSP中名為age的參數(shù)配置信息 --> age配置參數(shù)的值:<%=config.getInitParameter("age")%> config_index name配置參數(shù)的值:yeeku age配置參數(shù)的值:30exception(異常處理)
當(dāng)編寫(xiě)JSP程序的時(shí)候,程序員可能會(huì)遺漏一些BUG,這些BUG可能會(huì)出現(xiàn)在程序的任何地方。JSP代碼中通常有以下幾類(lèi)異常:
- 檢查型異常:檢查型異常就是一個(gè)典型的用戶(hù)錯(cuò)誤或者一個(gè)程序員無(wú)法預(yù)見(jiàn)的錯(cuò)誤。舉例來(lái)說(shuō),如果一個(gè)文件將要被打開(kāi),但是無(wú)法找到這個(gè)文件,則一個(gè)異常被拋出。這些異常不能在編譯期被簡(jiǎn)單地忽略。
- 運(yùn)行時(shí)異常:一個(gè)運(yùn)行時(shí)異常可能已經(jīng)被程序員避免,這種異常在編譯期將會(huì)被忽略。
- 錯(cuò)誤:錯(cuò)誤不是異常,但問(wèn)題是它超出了用戶(hù)或者程序員的控制范圍。錯(cuò)誤通常會(huì)在代碼中被忽略,您幾乎不能拿它怎么樣。舉例來(lái)說(shuō),棧溢出錯(cuò)誤。這些錯(cuò)誤都會(huì)在編譯期被忽略。
Throwable類(lèi)中一些重要的方法:
| String getMessage() | 返回異常的信息 |
| String toString() | 返回類(lèi)名+異常信息 |
| void printStackTrace() | 將異常棧軌跡輸出至System.err 控制臺(tái)里 |
JSP提供了可選項(xiàng)來(lái)為每個(gè)JSP頁(yè)面指定錯(cuò)誤頁(yè)面。無(wú)論何時(shí)頁(yè)面拋出了異常,JSP容器都會(huì)自動(dòng)地調(diào)用錯(cuò)誤頁(yè)面。
接下來(lái)的例子為index.jsp指定了一個(gè)發(fā)生錯(cuò)誤的頁(yè)面。使用<%@page errorPage=“XXXXX”%>指令指定一個(gè)錯(cuò)誤頁(yè)面。
創(chuàng)建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <%@ page errorPage="error.jsp" %> <html> <head><title>index</title> </head> <body> <%int i=1/0;System.out.println(i); %> </body> </html>創(chuàng)建error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--指定當(dāng)前頁(yè)面為錯(cuò)誤頁(yè)面--%> <%@ page isErrorPage="true" %> <html> <head><title>Title</title> </head> <body> <h1>發(fā)生錯(cuò)誤了</h1><%String message = exception.getMessage();out.println("異常消息::"+message); %> </body> </html>當(dāng)頁(yè)面index.jsp發(fā)生錯(cuò)誤自動(dòng)跳轉(zhuǎn)到error.jsp中
Cookies處理
Cookies是存儲(chǔ)在客戶(hù)機(jī)的文本文件,它們保存了大量軌跡信息。在servlet技術(shù)基礎(chǔ)上,JSP顯然能夠提供對(duì)HTTP cookies的支持。
通常有三個(gè)步驟來(lái)識(shí)別回頭客:
● 服務(wù)器腳本發(fā)送一系列cookies至瀏覽器。比如名字,年齡,ID號(hào)碼等等。
● 瀏覽器在本地機(jī)中存儲(chǔ)這些信息,以備不時(shí)之需。
● 當(dāng)下一次瀏覽器發(fā)送任何請(qǐng)求至服務(wù)器時(shí),它會(huì)同時(shí)將這些cookies信息發(fā)送給服務(wù)器,然后服務(wù)器使用這些信息來(lái)識(shí)別用戶(hù)或者干些其它事情。
Cookie剖析
Cookies通常在HTTP信息頭中設(shè)置(雖然JavaScript能夠直接在瀏覽器中設(shè)置cookies)。在JSP中,設(shè)置一個(gè)cookie需要發(fā)送如下的信息頭給服務(wù)器
HTTP/1.1 200 OK Date: Fri, 04 Feb 2000 21:03:38 GMT Server: Apache/1.3.9 (UNIX) PHP/4.0b3 Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com Connection: close Content-Type: text/html正如您所見(jiàn),Set-Cookie信息頭包含一個(gè)鍵值對(duì),一個(gè)GMT(格林尼治標(biāo)準(zhǔn))時(shí)間,一個(gè)路徑,一個(gè)域名。鍵值對(duì)會(huì)被編碼為URL。有效期域是個(gè)指令,告訴瀏覽器在什么時(shí)候之后就可以清除這個(gè)cookie。
如果瀏覽器被配置成可存儲(chǔ)cookies,那么它將會(huì)保存這些信息直到過(guò)期。如果用戶(hù)訪問(wèn)的任何頁(yè)面匹配了cookie中的路徑和域名,那么瀏覽器將會(huì)重新將這個(gè)cookie發(fā)回給服務(wù)器。瀏覽器端的信息頭長(zhǎng)得就像下面這樣:
GET / HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc) Host: zink.demon.co.uk:1126 Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyzCookie對(duì)象中常用的方法:
| public void setDomain(String pattern) | 設(shè)置cookie的域名,比如w3cschool.cn |
| public String getDomain() | 獲取cookie的域名,比如w3cschool.cn |
| public void setMaxAge(int expiry) | 設(shè)置cookie有效期,以秒為單位,默認(rèn)有效期為當(dāng)前session的存活時(shí)間 |
| public int getMaxAge() | 獲取cookie有效期,以秒為單位,默認(rèn)為-1 ,表明cookie會(huì)活到瀏覽器關(guān)閉為止 |
| public String getName() | 返回 cookie的名稱(chēng),名稱(chēng)創(chuàng)建后將不能被修改 |
| public void setValue(String newValue) | 設(shè)置 cookie的值 |
| public String getValue() | 獲取cookie的值 |
| public void setPath(String uri) | 設(shè)置cookie 的路徑,默認(rèn)為當(dāng)前頁(yè)面目錄下的所有URL,還有此目錄下的所有子目錄 |
| public String getPath() | 獲取cookie 的路徑 |
| public void setSecure(boolean flag) | 指明cookie是否要加密傳輸 |
| public void setComment(String purpose) | 設(shè)置注釋描述 cookie的目的。當(dāng)瀏覽器將cookie展現(xiàn)給用戶(hù)時(shí),注釋將會(huì)變得非常有用 |
| public String getComment() | 返回描述cookie目的的注釋,若沒(méi)有則返回null |
使用JSP設(shè)置Cookies
使用JSP設(shè)置cookie包含三個(gè)步驟:
(1)創(chuàng)建一個(gè)Cookie對(duì)象: 調(diào)用Cookie的構(gòu)造函數(shù),使用一個(gè)cookie名稱(chēng)和值做參數(shù),它們都是字符串。
Cookie cookie = new Cookie("key","value");請(qǐng)務(wù)必牢記,名稱(chēng)和值中都不能包含空格或者如這些的字符: [ ] ( ) = , " / ? @ : ;
(2)設(shè)置訪問(wèn)cookie的路徑 一般都為/ (也就是當(dāng)前項(xiàng)目下所有頁(yè)面都能訪問(wèn))
設(shè)置cookie訪問(wèn)路徑 只有此路徑下頁(yè)面才能訪問(wèn) 如果不設(shè)置默認(rèn)為當(dāng)前調(diào)用cookie頁(yè)面的路徑
cookie.setPath("/");(3) 設(shè)置有效期:調(diào)用setMaxAge()函數(shù)表明cookie在多長(zhǎng)時(shí)間(以秒為單位)內(nèi)有效。下面的操作將有效期設(shè)為了24小時(shí)=1天。
如果為 0 Cookie將被刪除
cookie.setMaxAge(60*60*24);(4) 將cookie發(fā)送至HTTP響應(yīng)頭中:調(diào)用response.addCookie()函數(shù)來(lái)向HTTP響應(yīng)頭中添加cookies。
response.addCookie(cookie);設(shè)置Cookie
創(chuàng)建index.jsp
<%// 為 name 和 age設(shè)置cookieCookie name = new Cookie("name", "huanmin");Cookie age = new Cookie("pass","123");name.setPath("/"); age.setPath("/");// 設(shè)置cookie過(guò)期時(shí)間為24小時(shí)。name.setMaxAge(60*60*24);age.setMaxAge(60*60*24);// 在響應(yīng)頭部添加cookieresponse.addCookie( name );response.addCookie( age ); %>設(shè)置完我們可以打開(kāi)火狐游覽器 F12
獲取Cookie
創(chuàng)建index1.jsp
<%Cookie cookie = null;Cookie[] cookies = null;// 獲取cookies的數(shù)據(jù),是一個(gè)數(shù)組cookies = request.getCookies();if( cookies != null ){for (int i = 0; i < cookies.length; i++){cookie = cookies[i];if (cookie.getName().equals("name")){out.print("name : " + cookie.getName( ) + ", ");out.print("Value: " + cookie.getValue( )+" <br/>");}if (cookie.getName().equals("pass")){out.print("name : " + cookie.getName( ) + ", ");out.print("Value: " + cookie.getValue( )+" <br/>");}}}else{out.println("<h2>No cookies founds</h2>");} %>頁(yè)面顯示
name : name, Value: huanmin name : pass, Value: 123刪除Cookies
刪除cookie原理就是讓cookie內(nèi)對(duì)象的有效期為0就會(huì)自動(dòng)被刪除
刪除cookie內(nèi)的全部數(shù)據(jù)
<%Cookie[] cookie1=request.getCookies();for(int i=0;i<cookie1.length;i++){cookie1[i].setMaxAge(0);cookie1[i].setPath("/");//必須加上否則刪除失敗response.addCookie(cookie1[i]);} %>刪除指定Cookie
<%//獲取cookue對(duì)象Cookie[] cookie=request.getCookies();if(cookie!=null){ //判斷對(duì)象是否有值for(int i=0;i<cookie.length;i++){//獲取集合中 的對(duì)象 值if(cookie[i].getName().equals("name")){cookie[i].setMaxAge(0);cookie[i].setPath("/");response.addCookie(cookie[i]);}if(cookie[i].getName().equals("pass")){cookie[i].setMaxAge(0);cookie[i].setPath("/");response.addCookie(cookie[i]);}out.print(cookie[i].getValue());}}%>cookie與session區(qū)別
cookie 是保存在客戶(hù)端可以長(zhǎng)期保存(自定義) 而session是保存在服務(wù)器中 結(jié)束訪問(wèn)就會(huì)銷(xiāo)毀數(shù)據(jù)
cookie保存的是String類(lèi)型的 而session保存的是一個(gè)地址對(duì)象Object
cookie 一般保存不重要的信息 比如: 免登陸 ,驗(yàn)證令牌 等
因?yàn)槭谴鎯?chǔ)在用戶(hù)電腦上可控制性不強(qiáng) (可以加密)
session 是保存在服務(wù)器中 訪問(wèn)結(jié)束就會(huì)刪除 訪問(wèn)信息 比較安全 無(wú)法被第三方 訪問(wèn)到
控制流語(yǔ)句
JSP提供對(duì)Java語(yǔ)言的全面支持。您可以在JSP程序中使用Java API甚至建立Java代碼塊,包括判斷語(yǔ)句和循環(huán)語(yǔ)句等等。
和java 語(yǔ)法一樣 就是需要使用<% %> 將代碼包裹起來(lái)才能使用
判斷語(yǔ)句
If…else塊,請(qǐng)看下面這個(gè)例子:
<%! int day = 3; %> <% if (day == 1 | day == 7) { %> <p> Today is weekend</p> <% } else { %> <p> Today is not weekend</p> <% } %>頁(yè)面顯示
Today is not weekend
if else if 這個(gè)就不用說(shuō)了吧 照葫蘆畫(huà)瓢 總會(huì)吧
<%! int day = 3; %><% if (day == 1 | day == 7) { %> <p> Today is weekend</p> <% } else if(day==3){ %> <p> Today is not weekend</p> <% } else {%> <p> NO</p> <%} %>現(xiàn)在來(lái)看看switch…case塊,與if…else塊有很大的不同,它使用out.println() 來(lái)輸出到頁(yè)面上,并且整個(gè)都裝在腳本程序的標(biāo)簽中,就像下面這樣:
<%! int day = 3; %><% switch(day) { case 0: out.println("It\'s Sunday."); break; case 1: out.println("It\'s Monday."); break; case 2: out.println("It\'s Tuesday."); break; case 3: out.println("It\'s Wednesday."); break; case 4: out.println("It\'s Thursday."); break; case 5: out.println("It\'s Friday."); break; default: out.println("It's Saturday."); } %>頁(yè)面顯示
It’s Wednesday.
循環(huán)語(yǔ)句
在JSP程序中可以使用Java的三個(gè)基本循環(huán)類(lèi)型:for,while,和 do…while。
讓我們來(lái)看看for循環(huán)的例子:
<%! int fontSize; %><%for ( fontSize = 1; fontSize <= 3; fontSize++){ %> <font color="green" size="<%= fontSize %>">JSP Tutorial</font><br /> <%}%>將上例改用while循環(huán)來(lái)寫(xiě):
<%! int fontSize; %><%fontSize=1;while ( fontSize <= 3){ %> <font color="green" size="<%= fontSize %>">JSP Tutorial </font><br /> <%fontSize++;%> <%}%>JSP運(yùn)算符
JSP支持所有Java邏輯和算術(shù)運(yùn)算符。
下表羅列出了JSP常見(jiàn)運(yùn)算符,優(yōu)先級(jí)從高到底:
| 后綴 | () [] . (點(diǎn)運(yùn)算符) | 左到右 |
| 一元 | ++ - - ! ~ | 右到左 |
| 可乘性 | * / % | 左到右 |
| 可加性 | + - | 左到右 |
| 移位 | >> >>> << | 左到右 |
| 關(guān)系 | > >= < <= | 左到右 |
| 相等/不等 | == != | 左到右 |
| 位與 | & | 左到右 |
| 位異或 | ^ | 左到右 |
| 位或 | | | 左到右 |
| 邏輯與 | && | 左到右 |
| 邏輯或 | || | 左到右 |
| 條件判斷 | ?: | 右到左 |
| 賦值 | = += -= *= /= %= >>= <<= &= ^= |= | 右到左 |
| 逗號(hào) | , | 左到右 |
JSP常量
與Java中的一樣 使用final 關(guān)鍵字 不可以被修改
比如:
<%! final int FONTSIZE=15; %> <%! final String FINAL="常亮"; %>JSP開(kāi)發(fā)模式
必須明白java三層框架 然后在來(lái)看 jsp必須知道jsp的幾種開(kāi)發(fā)模式
JSP 程序開(kāi)發(fā)模式包括 JSP 編程、JSP+JavaBean 編程、JSP+JavaBean+Servlet 編程、MVC 模式。
單純的JSP編程
在 JSP 編程模式下,通過(guò)應(yīng)用 JSP 中的腳本標(biāo)志,可以直接在 JSP 頁(yè)面中實(shí)現(xiàn)各種功能。雖然這種模式很容易實(shí)現(xiàn),但是,其缺點(diǎn)也非常明顯。因?yàn)閷⒋蟛糠值?Java 代碼與 HTML 代碼混淆在一起,會(huì)給程序的維護(hù)和調(diào)試帶來(lái)很多困難,而且難以理清完整的程序結(jié)構(gòu)。
這就好比規(guī)劃管理一個(gè)大型企業(yè),如果將負(fù)責(zé)不同任務(wù)的所有員工都安排在一起工作,勢(shì)必會(huì)造成公司秩序混亂、不易管理等許多隱患。所以說(shuō),單純的 JSP 頁(yè)面編程模式是無(wú)法應(yīng)用到大型、中型甚至小型的 JSP Web 應(yīng)用程序開(kāi)發(fā)中的。
JSP+JavaBean 編程
JSP+JavaBean 編程模式是 JSP 程序開(kāi)發(fā)經(jīng)典設(shè)計(jì)模式之一,適合小型或中型網(wǎng)站的開(kāi)發(fā)。利用 JavaBean 技術(shù),可以很容易地完成一些業(yè)務(wù)邏輯上的操作,例如數(shù)據(jù)庫(kù)的連接、用戶(hù)登錄與注銷(xiāo)等。
JavaBean 是一個(gè)遵循了一定規(guī)則的 Java 類(lèi),在程序的開(kāi)發(fā)中,將要進(jìn)行的業(yè)務(wù)邏輯封裝到這個(gè)類(lèi)中,在 JSP 頁(yè)面中,通過(guò)動(dòng)作標(biāo)簽來(lái)調(diào)用這個(gè)類(lèi),從而執(zhí)行這個(gè)業(yè)務(wù)邏輯。此時(shí)的 JSP 除了負(fù)責(zé)部分流程的控制外,主要用來(lái)進(jìn)行頁(yè)面的顯示,而 JavaBean 則負(fù)責(zé)業(yè)務(wù)邏輯的處理。
可以看出,JSP+JavaBean 設(shè)計(jì)模式具有一個(gè)比較清晰的程序結(jié)構(gòu),在 JSP 技術(shù)的起步階段,該模式曾被廣泛應(yīng)用。
如下:表示該模式對(duì)客戶(hù)端的請(qǐng)求進(jìn)行處理的過(guò)程,相關(guān)的說(shuō)明如下。
1.用戶(hù)通過(guò)客戶(hù)端瀏覽器請(qǐng)求服務(wù)器。
2.服務(wù)器接收用戶(hù)請(qǐng)求后調(diào)用 JSP 頁(yè)面。
3.在 JSP 頁(yè)面中調(diào)用 JavaBean。
4.在 JavaBean 中連接及操作數(shù)據(jù)庫(kù),或?qū)崿F(xiàn)其他業(yè)務(wù)邏輯。
5.JavaBean 將執(zhí)行的結(jié)果返回 JSP+ 頁(yè)面。
6.服務(wù)器讀取 JSP 頁(yè)面中的內(nèi)容(將頁(yè)面中的靜態(tài)內(nèi)容與動(dòng)態(tài)內(nèi)容相結(jié)合)。
7.服務(wù)器將最終的結(jié)果返回給客戶(hù)端瀏覽器進(jìn)行顯示。
結(jié)構(gòu)演示:
明白的人自然就懂 不明白的永遠(yuǎn)都不明白
總結(jié): jsp(既當(dāng)?shù)之?dāng)媽) +javaBean(就只干數(shù)據(jù)訪問(wèn)層)
現(xiàn)在基本都沒(méi)人用這模式 除非你是自己開(kāi)發(fā)
JSP+JavaBean+Servlet 編程
JSP+JavaBean 設(shè)計(jì)模式雖然已經(jīng)對(duì)網(wǎng)站的業(yè)務(wù)邏輯和顯示頁(yè)面進(jìn)行了分離,但這種模式下的 JSP 不但要控制程序中的大部分流程,而且還要負(fù)責(zé)頁(yè)面的顯示,所以仍然不是一種理想的設(shè)計(jì)模式。
在 JSP+JavaBean 設(shè)計(jì)模式的基礎(chǔ)上加入 Servlet 來(lái)實(shí)現(xiàn)程序中的控制層,是一個(gè)很好的選擇。在這種模式中,由 Servlet 來(lái)執(zhí)行業(yè)務(wù)邏輯并負(fù)責(zé)程序的流程控制,JavaBean 組件實(shí)現(xiàn)業(yè)務(wù)邏輯,充當(dāng)模型的角色,JSP 用于頁(yè)面的顯示。可以看出,這種模式使得程序中的層次關(guān)系更明顯,各組件的分工也非常明確。下圖表示該模式對(duì)客戶(hù)端的請(qǐng)求進(jìn)行處理的過(guò)程。
各步驟的說(shuō)明如下:
1.用戶(hù)通過(guò)客戶(hù)端瀏覽器請(qǐng)求服務(wù)器。
2.服務(wù)器接收用戶(hù)請(qǐng)求后調(diào)用 Servlet。
3.Servlet 根據(jù)用戶(hù)請(qǐng)求調(diào)用 JavaBean 處理業(yè)務(wù)。
4.在 JavaBean 中連接及操作數(shù)據(jù)庫(kù),或?qū)崿F(xiàn)其他業(yè)務(wù)邏輯。
5.JavaBean 將結(jié)果返回 Servlet,在 Servlet 中將結(jié)果保存到請(qǐng)求對(duì)象中。
6.由 Servlet 轉(zhuǎn)發(fā)請(qǐng)求到 JSP 頁(yè)面。
7.服務(wù)器讀取 JSP 頁(yè)面中的內(nèi)容(將頁(yè)面中的靜態(tài)內(nèi)容與動(dòng)態(tài)內(nèi)容結(jié)合)。
8.服務(wù)器將最終的結(jié)果返回給客戶(hù)端瀏覽器進(jìn)行顯示。
結(jié)構(gòu)演示:
總結(jié):jsp(只負(fù)責(zé)顯示數(shù)據(jù)) + JavaBean(數(shù)據(jù)訪問(wèn)處理) +Servlet(對(duì)要顯示的數(shù)據(jù)進(jìn)行整合 不用在jsp頁(yè)面在處理了)
但 JSP+JavaBean+Servlet 模式同樣也存在缺點(diǎn)。
因?yàn)橐粋€(gè)請(qǐng)求(功能) 就要對(duì)應(yīng)一個(gè)Servlet 如果100個(gè)請(qǐng)求呢1000個(gè)呢 那么又會(huì)出現(xiàn)多少個(gè)Servlet呢? 這就會(huì)造成邏輯混亂 類(lèi)堆積 維護(hù)比較難
當(dāng)然有解決辦法 就是使用MVC模式
MVC 模式
MVC(Model-View-Controller,模型-視圖-控制器)是一種程序設(shè)計(jì)概念,它同時(shí)適用于簡(jiǎn)單的和復(fù)雜的程序。使用該模式,可將待開(kāi)發(fā)的應(yīng)用程序分解為三個(gè)獨(dú)立的部分:模型、視圖和控制器。
提出這種設(shè)計(jì)模式主要是因?yàn)閼?yīng)用程序中用來(lái)完成任務(wù)的代碼(模型,也稱(chēng)為“業(yè)務(wù)邏輯”)通常是程序中相對(duì)穩(wěn)定的部分,并且會(huì)被重復(fù)使用,而程序與用戶(hù)進(jìn)行交互的頁(yè)面(視圖),卻是經(jīng)常改變的。
如果因需要更新頁(yè)面而不得不對(duì)業(yè)務(wù)邏輯代碼進(jìn)行改動(dòng),或者要在不同的模塊中應(yīng)用相同的功能時(shí)重復(fù)地編寫(xiě)業(yè)務(wù)邏輯代碼,不僅會(huì)降低整體程序開(kāi)發(fā)的進(jìn)程,而且會(huì)使程序變得難以維護(hù)。因此將業(yè)務(wù)邏輯代碼與外觀呈現(xiàn)分離,將會(huì)更容易地根據(jù)需求的改變來(lái)改進(jìn)程序。MVC 模式的模型如圖 所示。
Model(模型):MVC 模式中的 Model(模型)指的是業(yè)務(wù)邏輯的代碼,是應(yīng)用程序中真正用來(lái)完成任務(wù)的部分。
View(視圖):視圖實(shí)際上就是程序與用戶(hù)進(jìn)行交互的界面,用戶(hù)可以看到它的存在。視圖可以具備一定的功能,并應(yīng)遵守對(duì)其所做的約束。在視圖中,不應(yīng)包含對(duì)數(shù)據(jù)處理的代碼,即業(yè)務(wù)邏輯代碼。
Controller(控制器):控制器主要用于控制用戶(hù)請(qǐng)求并做出響應(yīng)。它根據(jù)用戶(hù)的請(qǐng)求,選擇模型或修改模型,并決定返回什么樣的視圖。
雖然用來(lái)實(shí)現(xiàn) MVC 設(shè)計(jì)模式的技術(shù)可能都是相同的,但各公司都有自己的 MVC 架構(gòu)。也就是說(shuō),這些公司用來(lái)實(shí)現(xiàn)自己的 MVC 架構(gòu)所應(yīng)用的技術(shù)可能都是 JSP、Servlet 與 JavaBean,但它們的流程及設(shè)計(jì)卻是不同的,所以工程師需要花更多的時(shí)間去了解。
從項(xiàng)目開(kāi)發(fā)的觀點(diǎn)上來(lái)說(shuō),因?yàn)樾枰O(shè)計(jì) MVC 各對(duì)象之間的數(shù)據(jù)交換格式與方法,所以在系統(tǒng)的設(shè)計(jì)上需要花費(fèi)更多的時(shí)間。
但是現(xiàn)在市面上有很多成熟的MVC創(chuàng)建可以選擇一個(gè)實(shí)現(xiàn)了 MVC 模式的現(xiàn)成的框架,在此框架的基礎(chǔ)上進(jìn)行開(kāi)發(fā),能夠大大節(jié)省開(kāi)發(fā)時(shí)間,會(huì)取得事半功倍的效果。目前,已有很多可以使用的現(xiàn)成的 MVC 框架,例如 Struts SSM 框架。
我這里給你展示一個(gè)我之前做的SSM項(xiàng)目結(jié)構(gòu)圖
總結(jié):jsp(只負(fù)責(zé)顯示數(shù)據(jù)) + JavaBean(數(shù)據(jù)訪問(wèn)處理) +controller(對(duì)要顯示的數(shù)據(jù)進(jìn)行整合 不用在jsp頁(yè)面在處理了)
controller 和servlet 感覺(jué)上是不是差不多 但是呢實(shí)際上 controller底層還是servlet
就是對(duì)servlet進(jìn)行一層封裝 過(guò)濾… 當(dāng)訪問(wèn) controller成功后 將結(jié)果給servlet 而已
只不過(guò)springmvc幫助你做好了url和method的映射了(注解實(shí)現(xiàn)),不需要你自己在web.xml一個(gè)servlet和一個(gè)method去配置了
國(guó)際化開(kāi)發(fā)
下表列舉出了Locale對(duì)象中比較重要的方法,用于檢測(cè)request對(duì)象的地區(qū),語(yǔ)言,和區(qū)域。所有這些方法都會(huì)在瀏覽器中顯示國(guó)家名稱(chēng)和語(yǔ)言名稱(chēng):
| String getCountry() | 返回國(guó)家/地區(qū)碼的英文大寫(xiě),或 ISO 3166 2-letter 格式的區(qū)域 |
| String getDisplayCountry() | 返回要顯示給用戶(hù)的國(guó)家名稱(chēng) |
| String getLanguage() | 返回語(yǔ)言碼的英文小寫(xiě),或ISO 639 格式的區(qū)域 |
| String getDisplayLanguage() | 返回要給用戶(hù)看的語(yǔ)言名稱(chēng) |
| String getISO3Country() | 返回國(guó)家名稱(chēng)的3字母縮寫(xiě) |
| String getISO3Language() | 返回語(yǔ)言名稱(chēng)的3字母縮寫(xiě) |
實(shí)例演示
這個(gè)例子告訴我們?nèi)绾卧贘SP中顯示語(yǔ)言和國(guó)家:
<body> <center><h1>Detecting Locale</h1> </center><%//獲取客戶(hù)端本地化信息 Locale locale = request.getLocale(); //語(yǔ)言區(qū)域 比如 中文有中文簡(jiǎn)體(zh-CN)和繁體(zh-TW).. String language = locale.getLanguage();//語(yǔ)言: 中文(zh) 英文(en) ... String country = locale.getCountry(); //國(guó)家 %><p align="center"><% out.println("國(guó)家 : " + country + "<br />");out.println("語(yǔ)言 : " + language + "<br />");out.println("語(yǔ)言區(qū)域 : " + locale + "<br />");%> </p></body>語(yǔ)言切換
JSP可以使用西歐語(yǔ)言來(lái)輸出一個(gè)頁(yè)面,比如英語(yǔ),西班牙語(yǔ),德語(yǔ),法語(yǔ),意大利語(yǔ)等等。由此可見(jiàn),設(shè)置Content-Language信息頭來(lái)正確顯示所有字符是很重要的。 如果不知道每個(gè)國(guó)家語(yǔ)言縮寫(xiě) 在百度上搜索 :各國(guó)語(yǔ)言縮寫(xiě)表
http://www.mamicode.com/info-detail-2692661.html 也可以參考這個(gè)網(wǎng)站
en 英語(yǔ)
zh 中文
自動(dòng)識(shí)別切換語(yǔ)言案例:
<%@ page import="java.util.Locale" %> <%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <html> <head><title>index</title> </head> <body><%String re_language = request.getParameter("Language");//獲取客戶(hù)端本地化信息Locale locale = request.getLocale();String langua = locale.getLanguage(); //自動(dòng)識(shí)別獲取你的語(yǔ)言if(re_language!=null){application.setAttribute("Language",re_language); //設(shè)置頁(yè)面語(yǔ)言}else{application.setAttribute("Language",langua); //設(shè)置頁(yè)面默認(rèn)語(yǔ)言}// 設(shè)置請(qǐng)求頭內(nèi)的 Content-Language(當(dāng)前頁(yè)面的語(yǔ)言)response.setHeader("Content-Language", (String) application.getAttribute("Language"));//獲取當(dāng)前響應(yīng)頭里的 語(yǔ)言String language= response.getHeader("Content-Language"); %><label for="Language"></label> <select id="Language"><% if("en".equals(language )){ %><option selected="selected" value="en">English</option><%}else{%><option value="en">English</option><%}%><% if("zh".equals(language)){ %><option selected="selected" value="zh">中文</option><%}else{%><option value="zh">中文</option><%}%></select><center><h1><%if("en".equals(language)){out.print("The current language is : English");}else if("zh".equals(language)){out.print("當(dāng)前語(yǔ)言是: 中文");}%></h1> </center> <div align="center"><%if(language.equals("en")){%>Hello World!<%}%><%if(language.equals("zh")){%>你好 世界!<%}%> </div><script>//下拉框 變化 從而變化 頁(yè)面語(yǔ)言var Language=document.getElementById("Language");Language.οnchange=function(){let value = Language.value;location.href="http://localhost:8081/java_Web/"+"?Language="+value;} </script></body> </html>自動(dòng)識(shí)別并格式化時(shí)間為當(dāng)前地區(qū)的時(shí)間字符串格式
<%@ page import="java.text.DateFormat" %> <%@ page import="java.util.Date" %> <%@ page import="java.util.Locale" %> <%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %> <html> <head><title>index</title> </head> <body> <%//獲取客戶(hù)端本地化信息Locale locale = request.getLocale(); //獲取你是哪個(gè) 語(yǔ)言_區(qū)域//設(shè)置 格式 時(shí)間為你國(guó)家的 時(shí)間字符串格式String date = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT, locale).format(new Date( ));%> <div align="center"><p>Local Date: <% out.print(date); %></p> </div></body> </html>自動(dòng)格式格式貨幣 為當(dāng)前地區(qū)的貨幣格式
<%@ page import="java.text.NumberFormat" %> <%@ page import="java.util.Locale" %> <%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %><%Locale locale = request.getLocale( );NumberFormat nft = NumberFormat.getCurrencyInstance(locale); //自動(dòng)格式格式 貨幣為當(dāng)前地區(qū)的貨幣格式%> <html> <head><title></title> </head> <body><div align="center"><p>格式化的貨幣:<%String formattedCurr = nft.format(1000000);//格式化out.print(formattedCurr);%></p> </div> </body> </html>自動(dòng)格式百分比 為當(dāng)前地區(qū)格式的百分比格式
<%@ page import="java.text.NumberFormat" %> <%@ page import="java.util.Locale" %> <%@ page language="java" contentType="text/html; charset=UTF-8" isELIgnored="true" pageEncoding="UTF-8" %><% Locale locale = request.getLocale( ); NumberFormat nft = NumberFormat.getPercentInstance(locale);//自動(dòng)格式百分比 為當(dāng)前地區(qū)格式的百分比格式 %> <html> <head><title></title> </head> <body> <div align="center"><p>格式化的百分比:<%String formattedPerc = nft.format(0.51); //格式化out.print(formattedPerc);%></p> </div> </body> </html>到這里 基本上所有JSP的 基礎(chǔ)教程完事 但是jsp學(xué)習(xí)之旅并沒(méi)有結(jié)束 我們還有如下知識(shí)沒(méi)有掌握
EL , JSTL 使用 jsp連接數(shù)據(jù)庫(kù) ,jsp過(guò)濾器 xml數(shù)據(jù)處理,自定義jsp的標(biāo)簽
可以看出來(lái)這些內(nèi)容 其實(shí)就是 讓你開(kāi)發(fā)jsp的時(shí)候更加方便
點(diǎn)贊 -收藏-關(guān)注-便于以后復(fù)習(xí)和收到最新內(nèi)容 有其他問(wèn)題在評(píng)論區(qū)討論-或者私信我-收到會(huì)在第一時(shí)間回復(fù) 如有侵權(quán),請(qǐng)私信聯(lián)系我 感謝,配合,希望我的努力對(duì)你有幫助^_^總結(jié)
以上是生活随笔為你收集整理的Java-Jsp基础教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工作112:vue路由跳转错误:Erro
- 下一篇: java web程序设计郭_Java W