日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

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

生活随笔

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

java

Java-Jsp基础教程

發(fā)布時(shí)間:2023/12/9 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)用程序的用戶界面部分。網(wǎng)頁(yè)開(kāi)發(fā)者們通過(guò)結(jié)合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來(lái)編寫(xiě)JSP。

JSP通過(guò)網(wǎng)頁(yè)表單獲取用戶輸入數(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ù)、記錄用戶選擇信息、訪問(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可以在客戶端動(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)建查詢表。

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)客戶請(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ù)器和客戶端都在同一臺(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)用戶去另一個(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)求)用于向客戶端發(fā)送和獲取數(shù)據(jù) 作用范圍一次請(qǐng)求
response(響應(yīng))用于響應(yīng)客戶端請(qǐng)求 比如設(shè)置 響應(yīng)頭 狀態(tài)碼 …
out(輸出)用于把結(jié)果輸出至網(wǎng)頁(yè)上 比如 out.println()
session(會(huì)話)用于向客戶端發(fā)送和獲取數(shù)據(jù) 作用范圍是一次會(huì)話
application(應(yīng)用程序)用于向客戶端發(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ì)象)用于向客戶端發(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

客戶端可通過(guò) HTML 表單或在網(wǎng)頁(yè)地址后面提供參數(shù)的方法提交數(shù)據(jù),然后通過(guò) request 對(duì)象的相關(guān)方法來(lái)獲取這些數(shù)據(jù)。request 對(duì)象封裝了客戶端的請(qǐng)求信息,包括用戶提交的信息以及客戶端的一些信息,服務(wù)端通過(guò) request 對(duì)象可以了解到客戶端的需求,然后做出響應(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ù)值和客戶端的主機(jī)名稱(chēng)等。

request 對(duì)象提供了一些方法,主要用來(lái)處理客戶端瀏覽器提交的請(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)求的客戶端IP地址
String getRequestURI()返回發(fā)送此請(qǐng)求的URI
String getServletPath()返回所請(qǐng)求的servlet路徑
String request.getContextPath()獲取當(dāng)前web(虛擬目錄) 如果沒(méi)有那么就空
Cookie[] getCookies()返回客戶端所有的Cookie的數(shù)組
String getMethod()得到客戶機(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">賬戶:<input type="text" name="UserName" value="HuAnmin" placeholder="請(qǐng)輸入你的賬戶"><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"); %> 賬戶:<%=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è)面顯示

賬戶:HuAnmin 密碼:123 愛(ài)好: [游泳, 跑步]全部參數(shù) UserName=HuAnmin PassWord=123 AiHao=游泳

點(diǎn)超鏈接 index1.jsp頁(yè)面顯示

賬戶: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">賬戶:<input type="text" name="name" value="HuAnmin" placeholder="請(qǐng)輸入你的賬戶"><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("賬戶"+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è)面顯示

--------普通用法-------- 賬戶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("客戶端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 客戶端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指定瀏覽器或其他客戶端可以處理的MIME類(lèi)型。它的值通常為 image/pngimage/jpeg
Accept-Charset指定瀏覽器要使用的字符集。比如 ISO-8859-1
Accept-Encoding指定編碼類(lèi)型。它的值通常為 gzipcompress
Accept-Language指定客戶端首選語(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í)別不同的用戶
Connection表明客戶端是否可以處理HTTP持久連接。持久連接允許客戶端或?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è)在指定的日期被修改后客戶端才需要這個(gè)網(wǎng)頁(yè)。 服務(wù)器發(fā)送304碼給客戶端,表示沒(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ū)分不同瀏覽器或客戶端發(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é)果傳回到客戶端。可以通過(guò)response變量設(shè)置HTTP的狀態(tài)和向客戶端發(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)提交到客戶端
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ě)入客戶端
void reset()清除任何緩存中的任何數(shù)據(jù),包括狀態(tài)碼和各種響應(yīng)頭
void resetBuffer()清除基本的緩存數(shù)據(jù),不包括響應(yīng)頭和狀態(tài)碼
void sendError(int sc)使用指定的狀態(tài)碼向客戶端發(fā)送一個(gè)出錯(cuò)響應(yīng),然后清除緩存
void sendError(int sc, String msg)使用指定的狀態(tài)碼和消息向客戶端發(fā)送一個(gè)出錯(cuò)響應(yīng)
void sendRedirect(String location)使用指定的URL向客戶端發(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ā)送到客戶端文檔響應(yīng)報(bào)頭的 MIME 類(lèi)型和字符編碼,

如<%@ page contentType=“text/html;charset=utf-8”%>,它表示當(dāng)用戶訪問(wèn)該頁(yè)面時(shí),JSP 引擎將按照 contentType 的屬性值即 text/html(網(wǎng)頁(yè))做出反應(yīng)。

如果要?jiǎng)討B(tài)改變這個(gè)屬性值來(lái)響應(yīng)客戶,就需要使用 response 對(duì)象的 setContentType(String s) 方法。語(yǔ)法格式如下:

response.setContentType("MIME");

MIME 可以為 :

  • text/css :客戶端瀏覽器按CSS格式進(jìn)行解析文檔

  • text/xml :客戶端瀏覽器按XML格式進(jìn)行解析文檔

  • text/html : (網(wǎng)頁(yè))

  • image/jpeg png jpg … 客戶端瀏覽器按指定格式進(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)客戶時(shí),需要將客戶引導(dǎo)至另一個(gè)頁(yè)面,例如,當(dāng)客戶輸入正確的登錄信息時(shí),就需要被引導(dǎo)到登錄成功頁(yè)面,否則被引導(dǎo)到錯(cuò)誤顯示頁(yè)面。此時(shí),可以使用 response 的 sendRedirect(URL) 方法將客戶請(qǐng)求重定向到一個(gè)不同的頁(yè)面。

這里注意: 是重定向 而不是轉(zhuǎn)發(fā) 重定向后上一個(gè)頁(yè)面的數(shù)據(jù)將丟失

效果等同于 html 中的 <a href=“” >標(biāo)簽

例如,將客戶請(qǐng)求重定向到 login.jsp 頁(yè)面的代碼如下:

response.sendRedirect("login.jsp");

錯(cuò)誤狀態(tài)

狀態(tài)碼消息描述
100Continue只有一部分請(qǐng)求被服務(wù)器接收,但只要沒(méi)被服務(wù)器拒絕,客戶端就會(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è)超鏈接表,用戶可以選擇一個(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è)面需要用戶名和密碼
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è)客戶端無(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í)所附帶的大量查詢信息
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)容主體返回給客戶。

例如,代碼 response.sendError(500"請(qǐng)求頁(yè)面存在錯(cuò)誤") 將客戶請(qǐng)求重定向到一個(gè)在內(nèi)容主體上包含出錯(cuò)消息的出錯(cuò)頁(yè)面。

創(chuàng)建index.jsp

<form name="forml" method="post" action="index1.jsp">用戶名:<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"))//判斷賬戶密碼{response.sendRedirect("jsp/ok.jsp");}else{response.sendError(500,"請(qǐng)輸入正確的用戶和密碼!");} %>

創(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意味著文檔只為單用戶服務(wù)并且只能使用私有緩存。No-cache 意味著文檔不被緩存。
Connection命令瀏覽器是否要使用持久的HTTP連接。close****值 命令瀏覽器不使用持久HTTP連接,而keep-alive 意味著使用持久化連接。
Content-Disposition讓瀏覽器要求用戶將響應(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í)間??蛻舳丝梢?緩存文檔并且在后續(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)告訴用戶多久后請(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)刷新客戶頁(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ù)端的

客戶與服務(wù)器之間的通信是通過(guò) HTTP 協(xié)議完成的。HTTP 是一種無(wú)狀態(tài)的協(xié)議,當(dāng)客戶向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器接收請(qǐng)求并返回響應(yīng)后,該連接就被關(guān)閉了。此時(shí),服務(wù)器端不保留連接的有關(guān)信息,要想記住客戶的連接信息,可以使用 JSP 提供的 session 對(duì)象。

用戶登錄網(wǎng)站時(shí),系統(tǒng)將為其生成一個(gè)獨(dú)一無(wú)二的 session 對(duì)象,用以記錄該用戶的個(gè)人信息。一旦用戶退出網(wǎng)站,那么,所對(duì)應(yīng)的 session 對(duì)象將被注銷(xiāo)。session 對(duì)象可以綁定若干個(gè)用戶信息或者 JSP 對(duì)象,不同的 session 對(duì)象的同名變量是不會(huì)相互干擾的。

當(dāng)用戶首次訪問(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ā)送到客戶端,存放在 Cookie 中,這樣,session 對(duì)象和客戶端之間就建立了一一對(duì)應(yīng)的關(guān)系。

當(dāng)用戶再次訪問(wèn)該服務(wù)器的其他頁(yè)面時(shí),不再分配給用戶新的 session 對(duì)象,直到用戶關(guān)閉瀏覽器,或者在一定時(shí)間(系統(tǒng)默認(rèn)在 30 分鐘內(nèi),但可在編寫(xiě)程序時(shí),修改這個(gè)時(shí)間限定值或者顯式地結(jié)束一個(gè)會(huì)話)客戶端不向服務(wù)器發(fā)出應(yīng)答請(qǐng)求,服務(wù)器端就會(huì)取消該用戶的 session 對(duì)象,與用戶的會(huì)話對(duì)應(yīng)關(guān)系消失。當(dāng)用戶重新打開(kāi)瀏覽器,再次連接到該服務(wù)器時(shí),服務(wù)器為該用戶再創(chuàng)建一個(gè)新的 session 對(duì)象。

session 對(duì)象保存的是每個(gè)用戶專(zhuān)用的私有信息,可以是與客戶端有關(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 中客戶端最近一次請(qǐng)求的時(shí)間。由 1970-01-01算起,單位是毫秒。使用這個(gè)方法,可以判斷某個(gè)用戶在站點(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è)客戶會(huì)話過(guò)程,即 session scope)中保存屬性信息,比如用戶名、驗(yàn)證信息等,最為典型的應(yīng)用是實(shí)現(xiàn)網(wǎng)上商店購(gòu)物車(chē)的信息存儲(chǔ)。下面重點(diǎn)介紹 session 對(duì)象的應(yīng)用。

創(chuàng)建及獲取客戶會(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)某一客戶與 Web 應(yīng)用程序之間處于非活動(dòng)狀態(tài)時(shí),并不以顯式的方式通知服務(wù)器,所以,在 Servlet 程序或 JSP 文件中,做超時(shí)設(shè)置是確??蛻魰?huì)話終止的唯一方法。

Servlet 程序容器設(shè)置一個(gè)超時(shí)時(shí)長(zhǎng),當(dāng)客戶非活動(dòng)的時(shí)間超出時(shí)長(zhǎng)的大小時(shí),JSP 容器將使 session 對(duì)象無(wú)效,并撤銷(xiāo)所有屬性的綁定,這樣,就清除了客戶申請(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ì)象就一直存在,所有用戶共享 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)前客戶的會(huì)話范圍(session scope)有效,客戶超過(guò)預(yù)期時(shí)間不發(fā)送請(qǐng)求時(shí),session 對(duì)象將被回收。

在 application 對(duì)象中設(shè)置的屬性在整個(gè)應(yīng)用程序范圍(application scope)都有效。即使所有的用戶都不發(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)客戶!"); %>

然后你刷新頁(yè)面看看效果

您好,您是第3位訪問(wèn)客戶!

out對(duì)象(輸出)

out 對(duì)象是一個(gè)輸出流,用來(lái)向客戶端輸出數(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輸出換行字符

向客戶端輸出數(shù)據(jù)

在使用 print() 或 println() 方法向客戶端輸出時(shí),由于客戶端是瀏覽器,因此可以使用 HTML 中的一些標(biāo)記控制輸出格式。例如:

<%out.println("<font color=red>Hello </font>"); %>

管理輸出緩沖區(qū)

默認(rèn)情況下,服務(wù)端要輸出到客戶端的內(nèi)容不直接寫(xiě)到客戶端,而是先寫(xiě)到一個(gè)輸出緩沖區(qū)中。使用 out 對(duì)象的 getBufferSize() 方法取得當(dāng)前緩沖區(qū)的大小(單位是 KB),用 getRemaining() 方法取得當(dāng)前使用后還剩余的緩沖區(qū)的大小(單位是 KB)。

JSP 只有在下面三種情況下,才會(huì)把緩沖區(qū)的內(nèi)容輸出到客戶端。

? 該 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)提交給客戶端,也能夠訪問(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è)典型的用戶錯(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)題是它超出了用戶或者程序員的控制范圍。錯(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ǔ)在客戶機(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í)別用戶或者干些其它事情。

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ò)期。如果用戶訪問(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)給用戶時(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 是保存在客戶端可以長(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ǔ)在用戶電腦上可控制性不強(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ù)的連接、用戶登錄與注銷(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ì)客戶端的請(qǐng)求進(jìn)行處理的過(guò)程,相關(guān)的說(shuō)明如下。

1.用戶通過(guò)客戶端瀏覽器請(qǐng)求服務(wù)器。

2.服務(wù)器接收用戶請(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é)果返回給客戶端瀏覽器進(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è)面的顯示??梢钥闯?#xff0c;這種模式使得程序中的層次關(guān)系更明顯,各組件的分工也非常明確。下圖表示該模式對(duì)客戶端的請(qǐng)求進(jìn)行處理的過(guò)程。

各步驟的說(shuō)明如下:

1.用戶通過(guò)客戶端瀏覽器請(qǐng)求服務(wù)器。

2.服務(wù)器接收用戶請(qǐng)求后調(diào)用 Servlet。

3.Servlet 根據(jù)用戶請(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é)果返回給客戶端瀏覽器進(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ù)使用,而程序與用戶進(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í)際上就是程序與用戶進(jìn)行交互的界面,用戶可以看到它的存在。視圖可以具備一定的功能,并應(yīng)遵守對(duì)其所做的約束。在視圖中,不應(yīng)包含對(duì)數(shù)據(jù)處理的代碼,即業(yè)務(wù)邏輯代碼。

Controller(控制器):控制器主要用于控制用戶請(qǐng)求并做出響應(yīng)。它根據(jù)用戶的請(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()返回要顯示給用戶的國(guó)家名稱(chēng)
String getLanguage()返回語(yǔ)言碼的英文小寫(xiě),或ISO 639 格式的區(qū)域
String getDisplayLanguage()返回要給用戶看的語(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><%//獲取客戶端本地化信息 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");//獲取客戶端本地化信息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> <%//獲取客戶端本地化信息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ò),歡迎將生活随笔推薦給好友。

色婷婷狠狠18 | 亚洲精品婷婷 | 久久99网 | 久久er99热精品一区二区三区 | 亚洲黄a | 亚洲情感电影大片 | 国产探花视频在线播放 | 久久精品老司机 | 欧美国产日韩一区二区三区 | 欧美精品国产综合久久 | 亚洲精品综合在线观看 | 成人免费在线电影 | 九九热精品在线 | 成人免费av电影 | 看片一区二区三区 | 国产精品午夜av | 免费av网址在线观看 | 国产精品免费在线视频 | 亚洲成人精品久久 | 中文字幕资源在线观看 | 人人干人人艹 | 91精品中文字幕 | 在线电影中文字幕 | 日本中文在线 | 狠狠亚洲 | 国产精品久久一区二区无卡 | 看av在线 | 国产偷v国产偷∨精品视频 在线草 | 永久免费av在线播放 | 在线观看中文字幕 | 国产中的精品av小宝探花 | 亚洲国产精久久久久久久 | 欧美日韩首页 | 久久国产精品视频免费看 | 免费av观看网站 | 天堂av在线免费 | 精品久久久久久久久中文字幕 | 91成人天堂久久成人 | 亚洲精品在线视频播放 | www.夜夜爱 | 一本一道久久a久久综合蜜桃 | 日韩免费专区 | www.狠狠干| 精品国产乱码久久久久久1区2匹 | 国产高清免费观看 | 国产日韩欧美在线看 | 国产伦精品一区二区三区四区视频 | 日本中文字幕在线观看 | 婷婷久久网 | www.五月婷 | 韩国一区视频 | www.日本色 | 精品a级片| 91影视成人 | 国产成人精品一区二区三区在线 | av 一区二区三区四区 | 一本一本久久a久久精品综合妖精 | 99精彩视频在线观看免费 | 日韩免费福利 | 亚洲成av人影片在线观看 | 久久情侣偷拍 | 91精品推荐 | 久久毛片网 | 天天综合亚洲 | 在线观看国产高清视频 | 亚洲成人黄色在线观看 | 三级黄色a | 亚洲欧美综合精品久久成人 | 99精品国产99久久久久久97 | 亚洲天堂香蕉 | 亚洲精品免费在线观看视频 | 亚洲国产精品成人综合 | 成人永久视频 | 午夜精品999 | 黄色小视频在线观看免费 | av成人在线播放 | 亚洲高清在线精品 | 色99色| av免费播放 | 国产第一页精品 | 免费色视频在线 | 色婷婷欧美 | 久久久久高清毛片一级 | 99热国产在线 | 99re热精品视频 | 日韩久久在线 | 激情影院在线观看 | 片网址 | 欧美巨乳波霸 | 正在播放亚洲精品 | 久久久午夜精品理论片中文字幕 | 激情综合色播五月 | 亚洲国产中文在线 | 日日夜夜天天综合 | 色综合久久久久综合 | 亚洲精品视频在线播放 | 91在线你懂的 | 久久99久久精品国产 | 国产精品va在线观看入 | av电影 一区二区 | 超碰在线人人爱 | 亚洲免费高清视频 | 成人久久久电影 | 精品国产一区二 | 国产不卡一区二区视频 | 国语黄色片 | 国产高清久久 | www..com黄色片 | 在线播放视频一区 | 在线观看一级视频 | 日本特黄一级 | 欧美日韩中文在线 | 国产精品videoxxxx | 久久久久亚洲国产 | 国产 日韩 在线 亚洲 字幕 中文 | 国产福利免费在线观看 | 在线播放 日韩专区 | 久久 国产一区 | 中文在线字幕免 | 美女网站色 | 中文字幕色播 | 国产理论一区二区三区 | 最近日本字幕mv免费观看在线 | 亚洲一区二区三区四区精品 | 99久久精品国产亚洲 | 久久精品国亚洲 | 亚洲精品久久久久999中文字幕 | 亚洲国产精品小视频 | 99精品热视频只有精品10 | 欧美日韩一区二区在线观看 | 国产精品久久久久久久婷婷 | www.91av在线 | 免费a v观看| 亚洲精品美女 | 日韩欧美视频在线 | 99久久这里只有精品 | 久久最新 | 蜜臀av夜夜澡人人爽人人桃色 | 成人免费视频视频在线观看 免费 | 婷婷社区五月天 | 日韩av视屏在线观看 | 99精品系列 | 五月婷婷在线观看 | 免费一级特黄录像 | 久久蜜臀av| aaa亚洲精品一二三区 | 在线观看av国产 | 国产免费xvideos视频入口 | 在线视频第一页 | 99热播精品| 最新国产精品久久精品 | 国产又粗又硬又长又爽的视频 | 麻豆视频免费看 | 最新av网址在线观看 | 国产日韩欧美在线观看视频 | 99精品国产99久久久久久福利 | 中文字幕人成不卡一区 | av三级在线看 | 奇米四色影狠狠爱7777 | 国产一级性生活视频 | 五月婷网站| 日本中文字幕免费观看 | 国内精品在线看 | 国产又粗又猛又爽 | 久草视频中文 | 日本中文字幕视频 | 在线观看视频日韩 | 91视频在线免费观看 | 91成人欧美 | 中文字幕a∨在线乱码免费看 | 亚洲精品乱码久久久久久写真 | 亚洲成人精品久久久 | 中文字幕日本在线观看 | 亚洲aⅴ在线观看 | 黄色小说视频网站 | 九九免费精品 | 四虎国产永久在线精品 | 午夜久久福利影院 | 欧美有色 | 国产精品久久久久久久久久免费看 | 91热这里只有精品 | 91视频成人免费 | 欧美久久久久久久 | 麻花豆传媒mv在线观看网站 | 国产精品资源在线观看 | 亚洲一级黄色 | 色99在线 | av福利在线免费观看 | 五月天色网站 | 亚洲伊人天堂 | 久久99久久99免费视频 | 天天操天天操天天 | 91禁看片 | 性色xxxxhd | 久久久久免费网 | h动漫中文字幕 | 欧美天堂视频在线 | 波多野结衣电影一区二区三区 | 深爱婷婷久久综合 | 久久中文字幕视频 | av在线电影播放 | 亚洲国产成人在线播放 | 国产一区二区三区黄 | 日韩欧美在线高清 | 久影院 | 国产一区二区三区免费在线 | 成人av片免费观看app下载 | 中文在线字幕免费观 | 亚洲人毛片 | 天天干国产 | 精品国产乱码一区二区三区在线 | 国产精品久久一区二区三区不卡 | 91精品啪在线观看国产 | 国产亚洲在线 | 久久婷婷久久 | 久久久99精品免费观看乱色 | 日韩va欧美va亚洲va久久 | 国产精品美女久久久久久 | 亚洲高清视频在线观看免费 | 久久8精品 | 国产日韩欧美在线一区 | 亚洲精品在线免费播放 | 午夜精品视频一区 | 日韩激情一二三区 | 97热久久免费频精品99 | 欧美久久久久久久久中文字幕 | 亚洲欧洲xxxx | 免费在线观看av的网站 | 午夜久久久久久久久久久 | 亚洲成人欧美 | 亚洲六月丁香色婷婷综合久久 | 99性视频| 亚洲免费精品视频 | www.操.com| 国产精品美女免费 | 婷婷丁香七月 | 最新中文在线视频 | 国产精品18久久久久久久 | 91精品视频播放 | 国产一二三四在线视频 | 久久综合婷婷国产二区高清 | 91黄色小视频 | 永久免费精品视频 | 成人影音在线 | 在线播放精品一区二区三区 | 丝袜+亚洲+另类+欧美+变态 | 91精品麻豆| 婷婷色网址| 午夜精品久久久久久久99 | 在线黄色免费 | 午夜视频在线观看一区二区三区 | 国产黄色免费在线观看 | 久久成人欧美 | 国产精品18久久久久久久久 | 欧美激情综合色综合啪啪五月 | 欧美一区二区三区在线看 | 91.精品高清在线观看 | 国产精品免费久久久久影院仙踪林 | 精品欧美日韩 | 超碰人人射 | 久久99精品久久久久久三级 | 久久久久久久电影 | 色wwww| 四虎成人免费影院 | 最新日本中文字幕 | 日韩av电影网站在线观看 | 激情久久婷婷 | 久久国产精品久久国产精品 | 在线观看深夜福利 | 国产伦理精品一区二区 | 亚洲成色777777在线观看影院 | av爱干| 国产精品久免费的黄网站 | 六月激情久久 | 午夜精品一二区 | 一区在线观看 | 国产99久久久精品 | 国产精品人成电影在线观看 | 日韩中文在线电影 | 久久五月网 | 亚欧日韩av | 97国产情侣爱久久免费观看 | 亚洲视频h | 亚洲在线视频观看 | 99精品国产免费久久久久久下载 | 国产99久久久久久免费看 | 日韩精品一区二区三区在线播放 | 亚洲综合精品视频 | 国内精品久久久精品电影院 | www久久99| 欧美一级艳片视频免费观看 | 国产黄色片在线免费观看 | 在线免费高清一区二区三区 | 97在线精品视频 | 国产黄免费看 | 天天操天天操天天操天天操天天操天天操 | 久久久久久久久艹 | 中文综合在线 | 人人玩人人添人人澡97 | 国产免费三级在线观看 | 国产精品免费观看在线 | 97精品国产 | 国产免费久久 | 国产综合激情 | 日韩在线第一区 | 狠狠狠色丁香婷婷综合久久五月 | 日日干天天爽 | 国产免费不卡av | 色狠狠综合 | 97视频免费观看2区 亚洲视屏 | 99热这里只有精品8 久久综合毛片 | 国产一级黄色片免费看 | 91成人网在线播放 | 9999在线 | 超碰公开97| 欧美日韩视频一区二区三区 | 色开心 | 国产视频一区二区在线播放 | 欧美激情综合五月色丁香小说 | 精品一区二区精品 | 欧美专区国产专区 | 亚洲成av人片在线观看 | 91看片在线免费观看 | 69精品视频在线观看 | 精品国产一区二区三区久久 | 91精品国产自产老师啪 | 国语自产偷拍精品视频偷 | 成人久久久久久久久久 | 久草 | 在线观看国产日韩 | 激情 一区二区 | 91视频专区| 蜜桃视频在线观看一区 | 91av视频在线免费观看 | 久久高清国产视频 | 国产亚州av | 国内丰满少妇猛烈精品播 | 亚洲精品国偷自产在线99热 | 国产短视频在线播放 | 日本三级吹潮在线 | 精品亚洲网 | 久久综合久久综合这里只有精品 | 九九久久国产 | 天天摸日日摸人人看 | 天天曰| 日韩三级中文字幕 | 中文字幕在线观看不卡 | 国产精品久久久久久久午夜片 | 色播激情五月 | 91久久黄色 | 欧美日比视频 | 91久久在线观看 | 亚洲免费av一区二区 | 久草视频在线免费 | 精品a视频 | 精品国产欧美一区二区三区不卡 | 免费成人av在线看 | 日韩.com | 久久综合中文字幕 | www久久国产| 亚洲国产日韩欧美 | 成人a在线观看高清电影 | 国产成人av综合色 | 91久久久久久久一区二区 | 91最新视频在线观看 | 狠狠色狠狠色合久久伊人 | 国产又粗又猛又爽 | av无限看 | 免费在线色视频 | 国产精品久久久久高潮 | 国产电影黄色av | 国产精品毛片一区二区在线 | 黄色片免费电影 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲国产成人在线观看 | 99国产精品一区二区 | 日韩精品一区二区三区丰满 | 久久免费视频这里只有精品 | 在线观看国产中文字幕 | 搡bbbb搡bbb视频 | 爱色av.com| 国产免费视频在线 | 成人性生交大片免费看中文网站 | 国产精品久久久久久久久久免费看 | 亚洲成人av一区 | 中文字幕一区二区三区四区 | 色婷婷亚洲精品 | www.日韩免费 | 亚洲亚洲精品在线观看 | 日韩一级片观看 | 最新av网址大全 | av九九| 国产裸体永久免费视频网站 | 久久中文字幕导航 | 国产精品久久久久久模特 | 国产美女无遮挡永久免费 | 精品国产欧美一区二区三区不卡 | 成年人在线免费看视频 | 亚洲国产视频直播 | 永久精品视频 | 日韩网站在线播放 | 一区二区三区视频 | 久草在线中文888 | 天天摸天天舔天天操 | 手机在线看永久av片免费 | 九九久久久久久久久激情 | 久久尤物电影视频在线观看 | 免费看污片 | 亚洲精品久久久蜜桃 | 国产小视频免费观看 | 国产精品第 | 天天天综合网 | 亚洲欧美在线观看视频 | 91色亚洲 | 国产在线观看二区 | 国产精品久久99精品毛片三a | 国产高清视频在线免费观看 | 国产成人在线一区 | 免费观看一级一片 | 在线精品视频在线观看高清 | 天天爽天天做 | 五月婷综合 | 国产福利小视频在线 | 超碰在线成人 | 91丨九色丨蝌蚪丨对白 | 天天天操天天天干 | 黄色一级片视频 | 玖玖爱在线观看 | 欧美国产亚洲精品久久久8v | 99国产精品一区二区 | 99精品美女| 国产尤物一区二区三区 | 日韩三级成人 | 亚洲精品免费播放 | 国产精品久久久久一区二区 | 国产专区在线播放 | 欧美人人爱 | 9在线观看免费高清完整版 玖玖爱免费视频 | 久久久久久久久久久影院 | 日韩在线观看你懂得 | 欧美色久 | www.在线观看视频 | 中文av网 | 欧美a级成人淫片免费看 | 欧美与欧洲交xxxx免费观看 | 91av视频观看| 午夜在线日韩 | 亚洲精品玖玖玖av在线看 | 亚洲欧美在线视频免费 | 久久久精品国产免费观看一区二区 | 成人黄色国产 | 成人在线免费观看视视频 | 又黄又爽又色无遮挡免费 | 99精彩视频在线观看免费 | 日精品| 国产直播av| 国产精品久久久久久久久蜜臀 | 日韩v在线91成人自拍 | 久久成人国产精品入口 | 天天色天天干天天 | 成人久久毛片 | 日韩有码在线播放 | 超碰在线观看99 | 色欧美成人精品a∨在线观看 | 久在线观看视频 | 久草香蕉在线 | 婷婷中文字幕在线观看 | 国产免费作爱视频 | 全久久久久久久久久久电影 | 精品欧美一区二区在线观看 | 天天射日 | 99热在线免费观看 | 激情xxxx | 黄色亚洲大片免费在线观看 | 麻豆传媒精品 | 久久婷婷丁香 | 香蕉精品视频在线观看 | 91精品国产综合久久婷婷香蕉 | 丁香六月激情 | 久久人91精品久久久久久不卡 | 久久夜色网 | 免费的成人av | wwwwww国产| 国内精品久久久久影院日本资源 | 亚洲视频1 | www色片 | 91av视频在线播放 | 久久少妇av | 国产美女永久免费 | 国产精品va在线观看入 | 成av人电影| 五月综合婷 | 丁香影院在线 | 亚洲日本中文字幕在线观看 | 成人在线网站观看 | 国产伦理久久 | 一区二区三区免费 | 久草免费在线视频观看 | 国色综合| 97免费在线观看视频 | 国产亚洲亚洲 | www狠狠操| 97成人免费| 欧美天天干 | 探花在线观看 | 午夜精品一区二区三区在线视频 | 91成年人网站 | 99久久一区| 99久在线精品99re8热视频 | 午夜三级影院 | 在线观看视频中文字幕 | 人人射人人爽 | 国产手机在线观看视频 | 久久免费高清视频 | 成人黄在线观看 | 日韩xxxx视频 | 中文字幕国产精品一区二区 | 24小时日本在线www免费的 | 日本免费一二三区 | 欧美一进一出抽搐大尺度视频 | 国产精品一区二区三区观看 | 337p日本欧洲亚洲大胆裸体艺术 | 国产在线观看二区 | 日本久久综合视频 | 中文字幕在线一区二区三区 | 日韩精品久久久 | 色综合久久88色综合天天免费 | 中文字幕乱码一区二区 | 手机在线日韩视频 | 国产成人精品不卡 | 成+人+色综合| 91视频在线免费 | 九九国产精品视频 | 国产精品久久久久久久av电影 | 久久久影院一区二区三区 | 国内综合精品午夜久久资源 | av在线电影播放 | 综合久久五月天 | 精品久久一二三区 | 国产成人av网址 | 成人在线电影观看 | 成人av资源站 | 国产精品18久久久久久久久久久久 | 精品女同一区二区三区在线观看 | 免费在线成人 | 国产女人18毛片水真多18精品 | 亚洲性少妇性猛交wwww乱大交 | 国产99免费 | 亚洲欧美日韩精品一区二区 | 超碰在线色 | 在线观看视频99 | 麻豆精品传媒视频 | 国产精品久久久久久久久蜜臀 | 国产精品欧美激情在线观看 | 国产免费一区二区三区最新 | 91最新在线视频 | 国产成人免费高清 | 狠狠干网站 | 久久影视中文字幕 | www.色com | 国产亚洲精品免费 | 久久人人爽人人爽人人片 | 日韩激情精品 | 国产福利一区二区三区在线观看 | 91免费在线播放 | 99色人 | 免费网站看av片 | 91禁在线观看 | 最新91在线视频 | 视频 天天草 | 99在线高清视频在线播放 | 99精品国产在热久久下载 | 91精品国产自产91精品 | 五月婷在线播放 | 国产精品理论在线观看 | 日本久久免费电影 | 91人人澡人人爽人人精品 | 狠狠地操 | 婷婷激情综合网 | 一区二区三区手机在线观看 | 91精彩视频在线观看 | 欧美午夜理伦三级在线观看 | 一级国产视频 | 欧美日韩高清一区二区 国产亚洲免费看 | 伊人天堂网 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美一区在线观看视频 | 夜夜躁天天躁很躁波 | 福利在线看片 | 久久手机免费视频 | 日韩精品一区二区三区三炮视频 | 日本不卡视频 | 日韩三级在线观看 | 免费视频久久久久 | 人人人爽| 高清美女视频 | 精品亚洲视频在线观看 | 综合在线亚洲 | 精品乱码一区二区三四区 | 91av免费看 | 九九99| 最新日韩在线 | 国产不卡免费 | 日日骑 | 一区二区三区在线不卡 | 91一区一区三区 | 亚洲天堂va | 国产精品成人一区二区三区吃奶 | 狠狠躁夜夜躁人人爽超碰91 | 精品国产视频在线 | 久久电影色 | 四虎影视成人精品国库在线观看 | 日韩欧美精品在线观看 | 99爱这里只有精品 | 亚洲精品小视频 | 亚洲国产日韩一区 | 黄色av网站在线免费观看 | 干狠狠| av在线免费网站 | 国产不卡免费av | 国产日韩精品视频 | 在线不卡a | 91日韩精品 | 精品久久久久国产 | 日本性xxx | 中文字幕在线免费观看视频 | 亚洲一区久久久 | 欧美激情精品 | 国产护士av| 一区二区三区视频 | 日韩一区二区三区高清在线观看 | 91伊人影院 | 欧美日韩3p | 五月婷婷香蕉 | 国产99久久精品一区二区永久免费 | 久久不见久久见免费影院 | 99精品国产成人一区二区 | 久久 亚洲视频 | 亚洲一区二区三区精品在线观看 | www一起操 | www.狠狠插.com | 99精品一级欧美片免费播放 | 亚洲午夜久久久久久久久电影网 | 中文字幕在线视频第一页 | 91高清视频在线 | 午夜三级影院 | 婷婷色网 | 在线网址你懂得 | 一区二区av | 中文字幕日韩电影 | 在线观看一区二区精品 | 黄色aaaaa| 国产精品18久久久久久久久久久久 | 久久久精品免费观看 | 毛片888 | 日韩电影中文,亚洲精品乱码 | 激情五月婷婷 | 精品久久久久久久久中文字幕 | 国产麻豆果冻传媒在线观看 | 国产精品女人网站 | 日韩久久精品一区二区三区 | 激情五月看片 | 亚洲综合小说电影qvod | 国产亚洲精品久久久网站好莱 | 97视频人人免费看 | 国产夫妻性生活自拍 | 伊人天天狠天天添日日拍 | 午夜国产在线观看 | 日韩影片在线观看 | www.久久99 | 精品久久久久久国产 | 9色在线视频 | 狠狠躁天天躁 | 国产精品手机在线观看 | 美女性爽视频国产免费app | 人人爽久久涩噜噜噜网站 | 亚洲视屏一区 | 91九色蝌蚪国产 | 夜夜操狠狠干 | 五月婷婷六月丁香 | a级国产乱理论片在线观看 特级毛片在线观看 | 成片视频免费观看 | 黄色av网站在线免费观看 | 激情网五月婷婷 | 日韩av一区二区三区在线观看 | 久久久久综合精品福利啪啪 | 96精品视频 | 国产精品一级视频 | 国产99久久久久久免费看 | 日韩国产欧美在线播放 | 天天插夜夜操 | 免费看国产精品 | 国产不卡在线观看 | 在线视频日韩精品 | 9i看片成人免费看片 | 亚洲欧美在线综合 | 黄色.com| 欧美韩国日本在线观看 | 四虎4hu永久免费 | 欧美在线观看小视频 | 国产一区网址 | 午夜精品久久久久久久爽 | 91九色视频在线 | 999久久 | 色av男人的天堂免费在线 | 91女子私密保健养生少妇 | 天天综合网 天天 | 狠狠色狠狠色 | 精品国产中文字幕 | 特黄特色特刺激视频免费播放 | 亚洲做受高潮欧美裸体 | 色噜噜日韩精品一区二区三区视频 | 美女免费视频黄 | 国产一区二区高清视频 | 亚洲成人资源在线观看 | 在线不卡a| 久久免费视屏 | av免费看看| 91精品婷婷国产综合久久蝌蚪 | 成人免费观看视频大全 | 国产一二三区在线观看 | 亚洲国产精品第一区二区 | 成人免费 在线播放 | 免费三级黄色 | 成人在线观看免费视频 | 中文免费 | 国产小视频在线免费观看视频 | 国产一级二级在线播放 | 亚洲人人爱 | 久久在线免费视频 | 视频一区二区在线观看 | 视频成人 | 日本护士三级少妇三级999 | 日韩专区中文字幕 | 99久久毛片 | 日韩三级视频在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 欧美9999 | 日韩最新av| 色网站视频 | 丁香六月天婷婷 | 日韩在线观看a | 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲综合欧美日韩狠狠色 | 成人三级av | 久久久精品免费看 | 欧美色图p | 91视频91蝌蚪 | 色福利网站 | 天天色天天操天天爽 | 午夜三级影院 | 日韩免费b| 国产精品久久久久久麻豆一区 | www日韩在线观看 | 日韩精品一卡 | 国产成人三级在线观看 | 成人高清在线 | 中文字幕人成乱码在线观看 | 亚洲狠狠干| 一级片免费视频 | 久草在线久草在线2 | 日本三级全黄少妇三2023 | 国产精品嫩草影视久久久 | 中文字幕资源在线观看 | 成人午夜黄色影院 | 国产精品午夜av | 国产日韩精品在线观看 | 亚洲综合色激情五月 | 热久久99这里有精品 | 欧美日韩中文国产 | 国产美女网站视频 | 免费av网站观看 | 91视视频在线直接观看在线看网页在线看 | 国产精彩视频一区 | 天天在线免费视频 | 欧美成人基地 | 天天操夜夜操夜夜操 | a v在线观看 | 五月天久久精品 | 日韩电影一区二区在线观看 | 欧洲在线免费视频 | 国产精品白丝av | 精品国产成人 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 欧美精品v国产精品v日韩精品 | 97在线观看免费高清完整版在线观看 | 91精品国产麻豆国产自产影视 | 国产黄色高清 | 黄色软件在线看 | 一区二区欧美激情 | 日韩精品久久一区二区三区 | 中文区中文字幕免费看 | av成人在线网站 | 日韩精品在线看 | 九九99靖品 | 天天干中文字幕 | 日日爽| 欧美亚洲xxx | 国产小视频福利在线 | 免费看片网页 | 在线观看www视频 | 韩国三级在线一区 | 国内精品久久久 | 人人揉人人揉人人揉人人揉97 | 韩国精品在线观看 | www.超碰 | 天天操天天色天天射 | 国产99久久99热这里精品5 | 成人在线观看av | 国产在线观看h | 女人18精品一区二区三区 | 欧美激情综合色综合啪啪五月 | 啪啪精品 | 国产日本高清 | 精品日韩在线 | 婷婷丁香花五月天 | av在线激情 | 99精品免费久久久久久久久日本 | 中文av网站| 亚洲人成人天堂h久久 | 欧美日韩一区二区三区在线观看视频 | 最新超碰| 91精品国产99久久久久久红楼 | 又污又黄网站 | 日韩综合在线观看 | 中文字幕免费不卡视频 | 久久久国产日韩 | 蜜臀av麻豆 | 日韩美女高潮 | 青青网视频| 国内精品久久久久久久久久久 | av电影免费看| 国产一线二线三线性视频 | 久久久久久国产精品久久 | 精品国产精品一区二区夜夜嗨 | 亚洲婷婷丁香 | 国产日产精品一区二区三区四区的观看方式 | 美女免费视频网站 | 久久成人福利 | 亚洲无毛专区 | 成人黄色一级视频 | 国产高清无线码2021 | 国产精品久久99综合免费观看尤物 | 丁香花在线观看免费完整版视频 | 国产精品免费久久久久影院仙踪林 | 18女毛片 | 手机在线看永久av片免费 | 欧美老人xxxx18 | 三级视频日韩 | 99在线国产 | 天天综合网在线 | 综合黄色网 | 开心激情久久 | 国产中的精品av小宝探花 | 日韩二区在线观看 | 在线你懂 | 最近中文字幕在线 | 天天色天天搞 | 国产精品黄色影片导航在线观看 | 国产日本三级 | 色视频国产直接看 | 香蕉视频在线播放 | 国产最新福利 | 黄色福利视频网站 | 狠狠色婷婷丁香六月 | 超碰97国产| 亚洲日本韩国一区二区 | 97在线观看免费 | 激情五月播播久久久精品 | 国产成人333kkk | 国产精品一级在线 | 五月婷婷久草 | 成年人视频在线免费观看 | 人人干人人做 | 欧美日韩高清一区二区三区 | 碰超在线97人人 | 国产资源免费在线观看 | 看v片| 日韩av在线小说 | 在线免费观看的av网站 | 色婷婷国产精品一区在线观看 | 亚洲激情国产精品 | 久久av电影 | 亚洲精品久 | 日本中文在线播放 | 97超碰人人爱 | 香蕉网址 | 久久a v视频 | 天天爽综合网 | 一区二区毛片 | 久久男人中文字幕资源站 | 日本中文字幕在线观看 | 人人超碰97| 伊人色综合久久天天网 | 伊人中文字幕在线 | 综合国产在线 | 精品国产视频在线 | 日韩黄色大片在线观看 | 免费看黄色毛片 | 国产一区二区高清不卡 | av成人在线观看 | 亚洲日日日 | 日本黄色免费大片 | www.天天色 | 亚洲欧洲精品一区二区 | 久久66热这里只有精品 | 夜夜操狠狠干 | 九九热精品视频在线观看 | 日韩在线观看一区二区三区 | 日韩va亚洲va欧美va久久 | 91久草视频 | 免费97视频 | 三级免费黄色 | 欧美性色19p | 精品国产乱码久久久久久三级人 | 夜夜骑日日操 | 亚洲成人影音 | 日韩在线中文字幕视频 | 国产亚洲观看 | 91视频午夜 | 国产精品一区二区久久精品爱涩 | 免费av在线网 | 五月天色中色 | 欧美精品一区二区免费 | 中日韩三级视频 | 久久九九久久九九 | 久久久网页 | 婷婷视频在线 | 成人在线播放网站 | 999日韩| 日韩在线观看三区 | av片在线观看免费 | 天天综合天天综合 | 日本少妇久久久 | 久久久久女教师免费一区 | 天天操天天干天天插 | 麻豆成人在线观看 | 九九九热精品免费视频观看 | 992tv在线观看网站 | 免费黄a大片 | 日韩av男人的天堂 | 国产精品影音先锋 | 一区二区三区影院 | 国产不卡一区二区视频 | 久久黄色免费 | 免费看一级特黄a大片 | 天天干天天上 | 亚洲精品久久在线 | 国产亚洲一级高清 | 国内外成人在线 | 国产精品欧美久久 | 国产精品爽爽久久久久久蜜臀 | 国产精品一区二区久久久 | 夜夜视频资源 | 天天色棕合合合合合合 | 欧美精品视 | 男女激情麻豆 | 亚洲激情六月 | 国产精品第7页 | 国产精品亚洲片在线播放 | 久草国产在线观看 | 韩国av免费在线观看 | 九九热在线观看视频 | 成人91在线 | 欧美一区二区在线看 | 久久精品美女视频网站 | 在线观看中文 | 丁香视频五月 | 久久97精品 | 美女视频黄是免费的 | 久久精品综合一区 | 一级一片免费观看 | 欧美一区成人 | 九九热精品视频在线观看 | 2019中文最近的2019中文在线 | 91久久奴性调教 | 成人av电影免费在线播放 | 日韩精品一区二区三区免费观看视频 | 日韩在线视频国产 | 免费无遮挡动漫网站 | 在线精品在线 | 久久久久国产a免费观看rela | 麻豆一区二区三区视频 | 欧美贵妇性狂欢 | 中文字幕在线一区二区三区 | 九九热免费精品视频 | 欧美日韩在线免费观看视频 | 日韩免费不卡av | 人人爱天天操 | 欧美日韩中 | 久久久久女人精品毛片 | 婷婷色社区 | 欧美一区二区在线刺激视频 | 97手机电影网 | 有没有在线观看av | 免费网站污 | 日本激情视频中文字幕 | 国产亚洲一区二区在线观看 |