日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java-Jsp基础教程

發(fā)布時(shí)間:2023/12/9 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-Jsp基础教程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

學(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ī)則:

語(yǔ)法描述
<%-- 注釋 --%>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)簽:

語(yǔ)法描述
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)下表:

對(duì)象描述
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ì)象常用的方法。

方法說(shuō)明
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:true

request (轉(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=HuAnmin

url參數(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)
信息(key)描述
Accept指定瀏覽器或其他客戶(hù)端可以處理的MIME類(lèi)型。它的值通常為 image/pngimage/jpeg
Accept-Charset指定瀏覽器要使用的字符集。比如 ISO-8859-1
Accept-Encoding指定編碼類(lèi)型。它的值通常為 gzipcompress
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=71720FDE92375A2DDAD3BFC10D2A0DC7

response(請(qǐng)求)

Response響應(yīng)對(duì)象主要將JSP容器處理后的結(jié)果傳回到客戶(hù)端。可以通過(guò)response變量設(shè)置HTTP的狀態(tài)和向客戶(hù)端發(fā)送數(shù)據(jù),如Cookie、HTTP文件頭信息等。

response對(duì)象的常用方法

方法說(shuō)明
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)

狀態(tài)碼消息描述
100Continue只有一部分請(qǐng)求被服務(wù)器接收,但只要沒(méi)被服務(wù)器拒絕,客戶(hù)端就會(huì)延續(xù)這個(gè)請(qǐng)求
101Switching Protocols服務(wù)器交換機(jī)協(xié)議
200OK請(qǐng)求被確認(rèn)
201Created請(qǐng)求已完成,新的資源被創(chuàng)建
202Accepted請(qǐng)求被接受,但未處理完
203Non-authoritative Information
204No Content
205Reset Content
206Partial Content
300Multiple Choices一個(gè)超鏈接表,用戶(hù)可以選擇一個(gè)超鏈接并訪問(wèn),最大支持5個(gè)超鏈接
301Moved Permanently被請(qǐng)求的頁(yè)面已經(jīng)移動(dòng)到了新的URL下
302Found被請(qǐng)求的頁(yè)面暫時(shí)性地移動(dòng)到了新的URL下
303See Other被請(qǐng)求的頁(yè)面可以在一個(gè)不同的URL下找到
304Not Modified
305Use Proxy
306Unused已經(jīng)不再使用此狀態(tài)碼,但狀態(tài)碼被保留
307Temporary Redirect被請(qǐng)求的頁(yè)面暫時(shí)性地移動(dòng)到了新的URL下
400Bad Request服務(wù)器無(wú)法識(shí)別請(qǐng)求
401Unauthorized被請(qǐng)求的頁(yè)面需要用戶(hù)名和密碼
402Payment Required目前還不能使用此狀態(tài)碼
403Forbidden禁止訪問(wèn)所請(qǐng)求的頁(yè)面
404Not Found服務(wù)器無(wú)法找到所請(qǐng)求的頁(yè)面
405Method Not Allowed請(qǐng)求中所指定的方法不被允許
406Not Acceptable服務(wù)器只能創(chuàng)建一個(gè)客戶(hù)端無(wú)法接受的響應(yīng)
407Proxy Authentication Required在請(qǐng)求被服務(wù)前必須認(rèn)證一個(gè)代理服務(wù)器
408Request Timeout請(qǐng)求時(shí)間超過(guò)了服務(wù)器所能等待的時(shí)間,連接被斷開(kāi)
409Conflict請(qǐng)求有矛盾的地方
410Gone被請(qǐng)求的頁(yè)面不再可用
411Length Required"Content-Length"沒(méi)有被定義,服務(wù)器拒絕接受請(qǐng)求
412Precondition Failed請(qǐng)求的前提條件被服務(wù)器評(píng)估為false
413Request Entity Too Large因?yàn)檎?qǐng)求的實(shí)體太大,服務(wù)器拒絕接受請(qǐng)求
414Request-url Too Long服務(wù)器拒絕接受請(qǐng)求,因?yàn)閁RL太長(zhǎng)。多出現(xiàn)在把"POST"請(qǐng)求轉(zhuǎn)換為"GET"請(qǐng)求時(shí)所附帶的大量查詢(xún)信息
415Unsupported Media Type服務(wù)器拒絕接受請(qǐng)求,因?yàn)槊襟w類(lèi)型不被支持
417Expectation Failed
500Internal Server Error請(qǐng)求不完整,服務(wù)器遇見(jiàn)了出乎意料的狀況
501Not Implemented請(qǐng)求不完整,服務(wù)器不提供所需要的功能
502Bad Gateway請(qǐng)求不完整,服務(wù)器從上游服務(wù)器接受了一個(gè)無(wú)效的響應(yīng)
503Service Unavailable請(qǐng)求不完整,服務(wù)器暫時(shí)重啟或關(guān)閉
504Gateway Timeout網(wǎng)關(guān)超時(shí)
505HTTP 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>密&nbsp;&nbsp;&nbsp;碼:<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)頭:

響應(yīng)頭描述
Allow指定服務(wù)器支持的request方法(GET,POST等等)
Cache-Control指定響應(yīng)文檔能夠被安全緩存的情況。通常取值為 public**,**privateno-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ì)象的常用方法:

方法說(shuō)明
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ì)象的常用方法。

方法說(shuō)明
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ì)象常用的方法

方法說(shuō)明
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ì)象的常用方法:

方法說(shuō)明
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è)定的值: 刪除后:null

config對(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ì)象的常用方法

方法說(shuō)明
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ù)的值:30

exception(異常處理)

當(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=xyz

Cookie對(duì)象中常用的方法:

序號(hào)方法 & 描述
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í)從高到底:

類(lèi)別操作符結(jié)合性
后綴() [] . (點(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):

序號(hào)方法 & 描述
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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。