国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

所在位置: 首頁(yè) > 營(yíng)銷(xiāo)資訊 > 網(wǎng)站運(yùn)營(yíng) > 大數(shù)據(jù)從入門(mén)到深入:JavaEE 之 動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)基礎(chǔ) JSP的數(shù)據(jù)交互(2)

大數(shù)據(jù)從入門(mén)到深入:JavaEE 之 動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)基礎(chǔ) JSP的數(shù)據(jù)交互(2)

時(shí)間:2023-09-26 04:36:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-09-26 04:36:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

大數(shù)據(jù)從入門(mén)到深入:JavaEE 之 動(dòng)態(tài)網(wǎng)頁(yè)開(kāi)發(fā)基礎(chǔ) JSP的數(shù)據(jù)交互(2):

1.6 JSP優(yōu)化

1.6.1 JSP的內(nèi)置對(duì)象

上一個(gè)案例中我們雖然實(shí)現(xiàn)了頁(yè)面展示數(shù)據(jù)庫(kù)數(shù)據(jù)的效果,但是很遺憾的是頁(yè)面由于加入了 Java代碼,頁(yè)面變得異?;靵y,那么如果將Java代碼和前端頁(yè)面分開(kāi)呢?

怎么分?一個(gè)功能分為兩個(gè)終端(客戶(hù)端與服務(wù)端)(前端與后端),客戶(hù)端接收數(shù)據(jù) 提交給服務(wù) 端 服務(wù)端處理 然后把結(jié)果給客戶(hù)端展示,這個(gè)就是一個(gè)完整的請(qǐng)求/響應(yīng)模式;

但是模式是好模式可以分開(kāi)又面臨一個(gè)問(wèn)題,數(shù)據(jù)如何在頁(yè)面與頁(yè)面之間傳遞呢,此時(shí)我們就 可以使用JSP的內(nèi)容對(duì)象來(lái)解決

JSP內(nèi)置對(duì)象是 Web 容器創(chuàng)建的一組對(duì)象

JSP內(nèi)置對(duì)象的名稱(chēng)是JSP 的保留字,JSP內(nèi)置對(duì)象是可以直接在JSP頁(yè)面使用的對(duì)象,無(wú)需使 用“new”,直接使用。那么像這樣的對(duì)象一共有9個(gè)

JSP中一共預(yù)先定義了9個(gè)這樣的對(duì)象,分別為:request、response、session、application、out、 pagecontext、config、page、exception

1、request對(duì)象

request 對(duì)象是 javax.servlet.httpServletRequest類(lèi)型的對(duì)象。 該對(duì)象代表了客戶(hù)端的請(qǐng) 求信息,主要用于接受通過(guò)HTTP協(xié)議傳送到服務(wù)器的數(shù)據(jù)。(包括頭信息、系統(tǒng)信息、請(qǐng) 求方式以及請(qǐng)求參數(shù)等)。request對(duì)象的作用域?yàn)橐淮握?qǐng)求。

2、response對(duì)象

response 代表的是對(duì)客戶(hù)端的響應(yīng),主要是將JSP容器處理過(guò)的對(duì)象傳回到客戶(hù)端。 response對(duì)象也具有作用域,它只在JSP頁(yè)面內(nèi)有效。

3、session對(duì)象

session 對(duì)象是由服務(wù)器自動(dòng)創(chuàng)建的與用戶(hù)請(qǐng)求相關(guān)的對(duì)象。服務(wù)器為每個(gè)用戶(hù)都生成一個(gè) session對(duì)象,用于保存該用戶(hù)的信息,跟蹤用戶(hù)的操作狀態(tài)。session對(duì)象內(nèi)部使用Map 類(lèi)來(lái)保存數(shù)據(jù),因此保存數(shù)據(jù)的格式為 “Key/value”。 session對(duì)象的value可以使復(fù)雜 的對(duì)象類(lèi)型,而不僅僅局限于字符串類(lèi)型。

4、application對(duì)象

application 對(duì)象可將信息保存在服務(wù)器中,直到服務(wù)器關(guān)閉,否則application對(duì)象中保 存的信息會(huì)在整個(gè)應(yīng)用中都有效。與session對(duì)象相比,application對(duì)象生命周期更長(zhǎng),類(lèi) 似于系統(tǒng)的“全局變量”。

5、out 對(duì)象

out 對(duì)象用于在Web瀏覽器內(nèi)輸出信息,并且管理應(yīng)用服務(wù)器上的輸出緩沖區(qū)。在使用 out 對(duì)象輸出數(shù)據(jù)時(shí),可以對(duì)數(shù)據(jù)緩沖區(qū)進(jìn)行操作,及時(shí)清除緩沖區(qū)中的殘余數(shù)據(jù),為其他 的輸出讓出緩沖空間。待數(shù)據(jù)輸出完畢后,要及時(shí)關(guān)閉輸出流。

6、pageContext 對(duì)象

pageContext 對(duì)象的作用是取得任何范圍的參數(shù),通過(guò)它可以獲取 JSP頁(yè)面的out、 request、reponse、session、application 等對(duì)象。pageContext對(duì)象的創(chuàng)建和初始化都 是由容器來(lái)完成的,在JSP頁(yè)面中可以直接使用 pageContext對(duì)象。

7、config 對(duì)象

config 對(duì)象的主要作用是取得服務(wù)器的配置信息。通過(guò) pageConext對(duì)象的 getServletConfig() 方法可以獲取一個(gè)config對(duì)象。當(dāng)一個(gè)Servlet 初始化時(shí),容器把某些 信息通過(guò) config對(duì)象傳遞給這個(gè) Servlet。 開(kāi)發(fā)者可以在web.xml 文件中為應(yīng)用程序環(huán)境 中的Servlet程序和JSP頁(yè)面提供初始化參數(shù)。

8、page 對(duì)象

page 對(duì)象代表JSP本身,只有在JSP頁(yè)面內(nèi)才是合法的。 page隱含對(duì)象本質(zhì)上包含當(dāng)前 Servlet接口引用的變量,類(lèi)似于Java編程中的 this 指針。

9、exception 對(duì)象

exception 對(duì)象的作用是顯示異常信息,只有在包含 isErrorPage="true" 的頁(yè)面中才可以 被使用,在一般的JSP頁(yè)面中使用該對(duì)象將無(wú)法編譯JSP文件。excepation對(duì)象和Java的所 有對(duì)象一樣,都具有系統(tǒng)提供的繼承結(jié)構(gòu)。exception 對(duì)象幾乎定義了所有異常情況。在

Java程序中,可以使用try/catch關(guān)鍵字來(lái)處理異常情況; 如果在JSP頁(yè)面中出現(xiàn)沒(méi)有捕獲 到的異常,就會(huì)生成 exception 對(duì)象,并把 exception 對(duì)象傳送到在page指令中設(shè)定的錯(cuò) 誤頁(yè)面中,然后在錯(cuò)誤頁(yè)面中處理相應(yīng)的 exception 對(duì)象。

那我們經(jīng)常使用的有五個(gè) :

1.6.2 request對(duì)象

重要程度 : ☆☆☆☆☆ (最重要)

request對(duì)象主要用于處理客戶(hù)端請(qǐng)求

舉個(gè)例子 : 傳輸一個(gè)HelloWorld

a.jsp 有一個(gè)form表單需要往b.jsp傳入一個(gè) name="userName"的文本框內(nèi)容

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>數(shù)據(jù)發(fā)送</title></head><body> <div> <form action="b.jsp" method="get"> 年輕的挑戰(zhàn)者呀,請(qǐng)留下你的大名 : <input type="text" name="userName" /> <button type="submit">提交到服務(wù)器</button> </form> </div></body></html>b.jsp接收這個(gè)內(nèi)容展示即可

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 獲取a.jsp提交的數(shù)據(jù) String userName = request.getParameter("userName"); out.print("歡迎你," + userName + ",歡迎來(lái)到JSP的世界;");%>此處需要注意的就是在接收頁(yè)面數(shù)據(jù)的時(shí)候 需要根據(jù)頁(yè)面 form表單中封裝的 input標(biāo)簽的 name值來(lái)進(jìn)行接收

并且此處接收到的數(shù)據(jù)只能是String 類(lèi)型 ,因?yàn)檫@是我們的數(shù)據(jù)傳輸協(xié)議(HTTP協(xié)議)限制的




HTTP協(xié)議 :

超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方 法。1960年美國(guó)人Ted Nelson構(gòu)思了一種通過(guò)計(jì)算機(jī)處理文本信息的方法,并稱(chēng)之為超文本 (hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同 合作研究,終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。




根據(jù)上面的案例我們可知,request對(duì)象可以在請(qǐng)求與相應(yīng)之間進(jìn)行數(shù)據(jù)的傳遞,request對(duì)象的常用方法有:

根據(jù)不同的方法我們可以完成不同的功能 : 比如說(shuō) 處理頁(yè)面post請(qǐng)求亂碼的問(wèn)題 當(dāng)我們把a(bǔ).jsp的form提交方式改成post就會(huì)出現(xiàn)亂碼問(wèn)題:

這種情況就需要設(shè)置一下request的請(qǐng)求編碼了

注意此時(shí)設(shè)置編碼的位置一定是在接收數(shù)據(jù)之前!

設(shè)置成功,刷新頁(yè)面再訪(fǎng)問(wèn),就不會(huì)出現(xiàn)亂碼情況了

再比如 接收頁(yè)面復(fù)選框的值

已知頁(yè)面有一組復(fù)選框

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>數(shù)據(jù)發(fā)送</title></head><body> <div> <form action="b.jsp" method="get"> <p> 年輕的挑戰(zhàn)者呀,請(qǐng)留下你的大名 : <input type="text" name="userName" /> </p> <p> 年輕的挑戰(zhàn)者呀,請(qǐng)選擇你的特征 : <br /> <input type="checkbox" name="tedian" value="好看" />好看<br /> <input type="checkbox" name="tedian" value="年輕" />年輕<br /> <input type="checkbox" name="tedian" value="善良" />善良<br /> <input type="checkbox" name="tedian" value="有錢(qián)" />有錢(qián)<br /> </p> <p> <button type="submit">提交到服務(wù)器</button> </p> </form> </div></body></html>效果:

大家注意細(xì)節(jié),復(fù)選框的name值都是統(tǒng)一的,所以接收這樣的數(shù)據(jù)就需要特殊對(duì)待了;

<%@page import="java.util.Arrays"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 設(shè)置請(qǐng)求流編碼 request.setCharacterEncoding("UTF-8"); // 接收單個(gè)name標(biāo)簽的值 String userName = request.getParameter("userName"); // 接收一堆 name相同的復(fù)選框的值 String[] tedians = request.getParameterValues("tedian"); out.print("歡迎您" + userName + "歡迎來(lái)到JSP的世界!<br />"); out.print("你居然是一個(gè)<strong>"+Arrays.toString(tedians)+"</strong>的人");%>此處注意,以為是多個(gè)name,一個(gè)用String變量,多個(gè)就需要用String[] 接收了;

后,request 還有一個(gè)方法就是 getRequestDispatcher 這個(gè)方法可以幫助request在多個(gè) 頁(yè)面之間跳轉(zhuǎn)并且傳遞的數(shù)據(jù)還會(huì)被轉(zhuǎn)發(fā)過(guò)程中包含的頁(yè)面共享,

那么我們看下用法

比如有這么一個(gè)系統(tǒng),有兩種類(lèi)型的用戶(hù),一種普通用戶(hù),一種是貴賓用戶(hù)vip,

要求

1. 普通用用戶(hù)與VIP貴賓登錄的時(shí)候提交到統(tǒng)一的地址

2. 服務(wù)器接收到用戶(hù)姓名再判斷用戶(hù)身份跳轉(zhuǎn)到不同頁(yè)面展示

實(shí)現(xiàn)這個(gè)需求我們就可以使用request對(duì)象的轉(zhuǎn)發(fā)功能來(lái)實(shí)現(xiàn)

具體實(shí)現(xiàn)步驟:

1. 創(chuàng)建用戶(hù)的登錄頁(yè)面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>用戶(hù)登錄</title></head><body> <div> <form action="login_server.jsp" method="post"> <p> 請(qǐng)輸入您的用戶(hù)名 : <input type="text" name="userName" /> </p> <p> <button type="submit">確定登錄</button> </p> </form> </div></body></html>2. 創(chuàng)建login_server.jsp頁(yè)面

<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 模擬數(shù)據(jù)庫(kù)定義兩組人 // 普通用戶(hù) String[] losers = {"趙文明","孫建國(guó)","王小花","李建軍"}; // VIP用戶(hù) String[] vips = {"湯姆","杰瑞"}; // 設(shè)定編碼 request.setCharacterEncoding("UTF-8"); // 接收頁(yè)面請(qǐng)求 String userName = request.getParameter("userName"); // 定義最終的展示結(jié)果頁(yè) String result = "error.jsp"; //默認(rèn)錯(cuò)誤頁(yè) // 判斷是不是普通用戶(hù) for(String a:losers){ if(userName.equals(a)){ result = "loser.jsp"; break; } } // 判斷是不是VIP用戶(hù) for(String b:vips){ if(userName.equals(b)){ result = "vip.jsp"; break; } } // 根據(jù)業(yè)務(wù)結(jié)果轉(zhuǎn)發(fā)到對(duì)應(yīng)頁(yè)面 request.getRequestDispatcher(result).forward(request, response);%>此處調(diào)用就是request對(duì)象的getRequestDispatcher方法,這個(gè)方法有一個(gè)參數(shù)是用來(lái)設(shè)定將請(qǐng)求發(fā)送的地址,頁(yè)面發(fā)起請(qǐng)求先由統(tǒng)一的一個(gè)服務(wù)頁(yè)面接收,然后根據(jù)業(yè)務(wù)不同再轉(zhuǎn)發(fā)給其他頁(yè)面進(jìn)行操作;

后面的forward()方法叫做轉(zhuǎn)發(fā)方法,也就是將現(xiàn)在的請(qǐng)求處理再交給其他程序處理,里面有兩 個(gè)參數(shù) request,response(下一章講解)

注意 : 轉(zhuǎn)發(fā)的寫(xiě)法 是 先設(shè)定請(qǐng)求地址 getRequestDispatcher("x.jsp") 然后再調(diào)用轉(zhuǎn) 發(fā)方法 forward(request, response) 缺一不可!

3. 創(chuàng)建結(jié)果展示頁(yè)

普通用戶(hù)loser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>普通用戶(hù)</title></head><body> <div> 歡迎,<%=request.getParameter("userName") %> </div> <marquee behavior="alternate" scrollamount="20" onMouseOut="this.start()" onMouseOver="this.stop()"> <h1 style="color: red;font-size: 100px;"> 請(qǐng)趕緊充錢(qián)成為VIP用戶(hù) </h1> </marquee></body></html>


會(huì)員用戶(hù) vip.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html><html ><head> <meta charset="UTF-8"> <title>炫酷炸天VIP登錄</title> <style type="text/css">html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}</style> <style type="text/css"> @import url(https://fonts.googleapis.com/css?family=Concert+One); h1 { animation:glow 10s ease-in-out infinite; /* For less laggy effect, uncomment this: animation:none; -webkit-text-stroke:1px #fff; =========== */ } * { box-sizing:border-box; } body { background:#0a0a0a; overflow:hidden; text-align:center; } figure { animation:wobble 5s ease-in-out infinite; transform-origin:center center; transform-style:preserve-3d; } @keyframes wobble { 0%,100%{ transform:rotate3d(1,1,0,40deg); } 25%{ transform:rotate3d(-1,1,0,40deg); } 50%{ transform:rotate3d(-1,-1,0,40deg); } 75%{ transform:rotate3d(1,-1,0,40deg); } } h1 { display:block; width:100%; padding:40px; line-height:1.5; font:900 8em 'Concert One', sans-serif; text-transform:uppercase; position:absolute; color:#0a0a0a; } @keyframes glow { 0%,100%{ text-shadow:0 0 30px red; } 25%{ text-shadow:0 0 30px orange; } 50%{ text-shadow:0 0 30px forestgreen; } 75%{ text-shadow:0 0 30px cyan; } } h1:nth-child(2){ transform:translateZ(5px); } h1:nth-child(3){ transform:translateZ(10px);} h1:nth-child(4){ transform:translateZ(15px); } h1:nth-child(5){ transform:translateZ(20px); } h1:nth-child(6){ transform:translateZ(25px); } h1:nth-child(7){ transform:translateZ(30px); } h1:nth-child(8){ transform:translateZ(35px); } h1:nth-child(9){ transform:translateZ(40px); } h1:nth-child(10){ transform:translateZ(45px); } </style></head><body> <figure> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1> <h1>尊貴的VIP會(huì)員<br /><%=request.getParameter("userName") %> <br />歡迎您</h1></figure></body></html>這里大家要考慮一個(gè)問(wèn)題,不管是哪個(gè)展示頁(yè)面其實(shí)地址欄中的地址始終停留在開(kāi)始被請(qǐng) 求的login_server.jsp

我們可以觀察下地址欄




地址欄中請(qǐng)求的地址還是停留在login_server.jsp,這就是轉(zhuǎn)發(fā)特性了面對(duì)客戶(hù)端來(lái)說(shuō)它只知 道請(qǐng)求傳遞給了login_server.jsp,然后login_server.jsp再把請(qǐng)求交給誰(shuí)處理就是服務(wù)器內(nèi)部 的事情了

就好比我們的信息是一個(gè)快遞,你發(fā)快遞是發(fā)給 中通 順豐 圓通 這就是請(qǐng)求的總地址,那么到 底是順豐的哪個(gè)分部幫你處理了這個(gè)快遞你其實(shí)是不知道的,但是因?yàn)槿思矣址浅?yán)密的鏈路結(jié)構(gòu),所以你的快遞會(huì)順利到 達(dá)終點(diǎn),但是中間導(dǎo)了幾手我們是不知道的,雖然我們不能很明確的知道內(nèi)部細(xì)節(jié),但是終結(jié)果就是不管導(dǎo)了多少手,數(shù) 據(jù)的傳輸肯定是通暢的,所以在request內(nèi)部進(jìn)行這種請(qǐng)求轉(zhuǎn)發(fā)處理的時(shí)候不管轉(zhuǎn)了多少次,都是可以接收到開(kāi)始請(qǐng)求的 數(shù)據(jù)的;

而這種數(shù)據(jù)傳輸處理的方式 叫做request的請(qǐng)求轉(zhuǎn)發(fā)鏈 它的特點(diǎn)就是發(fā)生在 服務(wù)器內(nèi)部 瀏覽器看不到 每個(gè)內(nèi)部的處理環(huán)節(jié)都可以處理請(qǐng)求的數(shù)據(jù);

為了讓大家更加清楚的知道轉(zhuǎn)發(fā)的實(shí)際用途,我們接下來(lái)做個(gè)實(shí)戰(zhàn)吧!




1.6.3 案例實(shí)戰(zhàn) : MVC模式與JSTL和EL表達(dá)式

1) 案例需求 : 頁(yè)面1 發(fā)起請(qǐng)求希望能夠展示所有人員信息 頁(yè)面2接收并處理請(qǐng)求之后轉(zhuǎn)發(fā)給 頁(yè)面3展示數(shù)據(jù);

2) 具體實(shí)現(xiàn)

1. 編寫(xiě)開(kāi)始的請(qǐng)求頁(yè)面 page1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>轉(zhuǎn)發(fā)案例</title></head><body> <div> <h1>歡迎使用人員信息管理系統(tǒng)</h1> <h2>請(qǐng)選擇一個(gè)功能吧!</h2> <ol> <li> <a href="page2.jsp" target="_blank">查詢(xún)?nèi)咳藛T信息</a> </li> </ol> </div></body></html>效果 :

2. 編寫(xiě)page2.jsp 用來(lái)處理本次請(qǐng)求

<%@page import="java.util.List"%><%@page import="com.hnxy.db.Person"%><%@page import="org.apache.commons.dbutils.handlers.BeanListHandler"%><%@page import="com.hnxy.db.JdbcUtil"%><%@page import="org.apache.commons.dbutils.QueryRunner"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 獲取數(shù)據(jù) // 編寫(xiě)SQL語(yǔ)句 String sql = "select * from person"; // 創(chuàng)建SQL執(zhí)行對(duì)象 QueryRunner qr = new QueryRunner(JdbcUtil.getDataSource()); // 占位符賦值 // 執(zhí)行 List<Person> persons = qr.query(sql,new BeanListHandler<Person>(Person.class)); // 保存數(shù)據(jù) request.setAttribute("list", persons); // 轉(zhuǎn)發(fā) request.getRequestDispatcher("page3.jsp").forward(request, response);%>需要留意page2.jsp調(diào)用了一個(gè)request.setAttribute(key, val); 的方法 將我們自己的list集合 用 名稱(chēng) persons 保存在了request對(duì)象中,
此處大家需要注意的就是 request對(duì)象不僅能夠保存頁(yè)面中的提交元素,其實(shí)我們自己也可以往request里放入各種各樣的值

3. page3.jsp展示數(shù)據(jù)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>轉(zhuǎn)發(fā)案例</title></head><body> <div> <h1>展示人員信息</h1> <table border="1"> <tr> <th>編號(hào)</th> <th>姓名</th> <th>性別</th> <th>年齡</th> <th>籍貫</th> </tr> <c:forEach var="p" items="${list}"> <tr> <td>${p.id}</td> <td>${p.name}</td> <td>${p.sex}</td> <td>${p.age}</td> <td>${p.from}</td> </tr> </c:forEach> </table> </div></body></html>大家 注意下這個(gè)數(shù)據(jù)的展示頁(yè)面,完全沒(méi)有java代碼,但是還能展示出來(lái)數(shù)據(jù)

這個(gè)數(shù)據(jù)的展示頁(yè)中我們應(yīng)用一個(gè)EL表達(dá)式和JSTL表達(dá)式,這個(gè)我們放在下一個(gè)章節(jié)再說(shuō),這 里我們主要瀨說(shuō)明下現(xiàn)在我們的程序設(shè)計(jì)風(fēng)格;




1.6.4 案例實(shí)戰(zhàn)總結(jié)1 : MVC模式

1) 什么是軟件設(shè)計(jì)模式?

軟件設(shè)計(jì)模式(Design pattern),又稱(chēng)設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目 的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。

使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。

2) 什么是MVC?

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě),

一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部 件里面,在改進(jìn)和個(gè)性化定制界面及用戶(hù)交互的同時(shí),

不需要重新編寫(xiě)業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的 圖形化用戶(hù)界面的結(jié)構(gòu)中。

視圖(View)-對(duì)應(yīng)組件:JSP或者HTML文件

控制器(Controller)-對(duì)應(yīng)組件:Servlet(光寫(xiě)Java代碼的

JSP)

模型(Model) -對(duì)應(yīng)組件:JavaBean

總的來(lái)說(shuō) MVC 的軟件設(shè)計(jì)模式是我們軟件設(shè)計(jì)中非常常用的設(shè)計(jì)模式它能夠使我們的各個(gè) 組件得以大限度的復(fù)用,降低各大組件的耦合,還是相當(dāng)不錯(cuò)的

MVC設(shè)計(jì)模式 用在了 JavaWEB 請(qǐng)求與響應(yīng)的被動(dòng)服務(wù)應(yīng)用程序中

3) MVC的發(fā)展歷程

第一階段 : 現(xiàn)在

第二階段 : 馬上要學(xué)習(xí)

第三階段 : 框架設(shè)計(jì)階段 springMVC --> spring

4) MVC設(shè)計(jì)模式的優(yōu)缺點(diǎn)

MVC 優(yōu)點(diǎn)
多視圖共享一個(gè)模型,大大提高代碼的可重用性
MVC三個(gè)模塊相互獨(dú)立,松耦合架構(gòu)
控制器提高了應(yīng)用程序的靈活性和可配置性
有利于軟件工程化管理

MVC 缺點(diǎn)
原理過(guò)于復(fù)雜
增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性,難度;
視圖對(duì)模型數(shù)據(jù)的低效率訪(fǎng)問(wèn)

5) 總結(jié)

現(xiàn)在我們就處在原始的model1的開(kāi)發(fā)模式中 用一個(gè)JSP發(fā)送請(qǐng)求給 另一個(gè)jsp,接收請(qǐng)求 的這個(gè)JSP作為控制器,完成對(duì)數(shù)據(jù)的封裝(我們通過(guò)查詢(xún)可以獲取對(duì)象或者list)

這就形成了模型,然后我們通過(guò)JSP內(nèi)置對(duì)象轉(zhuǎn)發(fā)給下一個(gè)JSP頁(yè)面來(lái)展示數(shù)據(jù),這個(gè)頁(yè)面就 是視圖;

當(dāng)然,model1設(shè)計(jì)模式雖然好,但是在面對(duì)大型復(fù)雜業(yè)務(wù)的時(shí)候封裝度還是不夠,代碼編寫(xiě) 麻煩,重復(fù)率高,所以后來(lái)我們還是要穩(wěn)定在model2的時(shí)代來(lái)愉快的編程;




1.6.5 案例實(shí)戰(zhàn)總結(jié)2 : EL與JSTL

1.6.5.1 EL表達(dá)式 重要程度 ★★★★

1) 為什么需要EL表達(dá)式

小腳本式取值對(duì)于頁(yè)面來(lái)說(shuō)來(lái)事過(guò)于繁瑣,所以我們采用EL表達(dá)式的形式獲取某個(gè)值是非 常輕松的

比如 :

小腳本 :

EL表達(dá)式

在獲取某個(gè)值的時(shí)候因?yàn)椴粫?huì)再涉及Java代碼,所以取值更靈活;




2) EL表達(dá)式概述

什么是EL

Expression Language(表達(dá)式語(yǔ)言)-- JSP內(nèi)部一組已經(jīng)定義好的獲取數(shù)據(jù)的規(guī)范 ${已經(jīng)存在的值}

EL的功能

替代JSP頁(yè)面中數(shù)據(jù)訪(fǎng)問(wèn)時(shí)的復(fù)雜編碼

EL的特點(diǎn)

自動(dòng)轉(zhuǎn)換類(lèi)型 : EL得到某個(gè)數(shù)據(jù)時(shí)可以自動(dòng)轉(zhuǎn)換類(lèi)型,所以不管從處理什么類(lèi)型數(shù)據(jù)其實(shí)都是一樣的

使用簡(jiǎn)單

3) EL表達(dá)式的語(yǔ)法

我們可以通過(guò)變量名取值,通過(guò)對(duì)象.屬性的方式取值,通過(guò)集合名稱(chēng)獲取集合元素

舉例 :

先寫(xiě)個(gè)簡(jiǎn)單點(diǎn)的,比如你想獲取你的web項(xiàng)目的項(xiàng)目名,也就是絕對(duì)定位到你的項(xiàng)目下,你可以這么寫(xiě)${pageContext.request.contextPath}它又什么用呢?以后我們向項(xiàng)目中引入CSS JS 的時(shí)候會(huì)用它這里我們要記住它的寫(xiě)法獲取單個(gè)變量 : // 在Servlet或JSP中保存數(shù)據(jù)request.setAttribute("username", "admin");// 在JSP中訪(fǎng)問(wèn)數(shù)據(jù)姓名: ${username}如果獲取對(duì)象屬性 : // 在Servlet或JSP中保存數(shù)據(jù)request.setAttribute("p", person);// 在JSP中訪(fǎng)問(wèn)數(shù)據(jù)人員編號(hào): ${p.id} 人員名稱(chēng) : ${p.name} .......獲取集合對(duì)象List : // 在Servlet或JSP中保存數(shù)據(jù)List names = new ArrayList();names.add(0, "LiYang");names.add(1,"WangHua");request.setAttribute("names",names);// 在JSP中訪(fǎng)問(wèn)數(shù)據(jù)姓名${ names[0] }<br/>姓名${ names[1] }<br/>注意 : 此處是用 變量[索引] 的方式獲取集合中元素的值Map :// 在Servlet或JSP中保存數(shù)據(jù)Map names = new HashMap();names.put("one", "LiYang");names.put("two", "WangHua");request.setAttribute("names", names);// 在JSP中訪(fǎng)問(wèn)數(shù)據(jù)姓名${ names.one }<br/>姓名${ names["two"] }<br/>注意 : 其實(shí)獲取map值只是把索引換成key而已4) EL表達(dá)式的基本操作符

關(guān)系操作符

邏輯操作符

empty操作符

5) 總結(jié) : 以后我們頁(yè)面取值的話(huà),肯定都統(tǒng)一使用EL表達(dá)式進(jìn)行取值和值的各種判斷,所以 ${參數(shù)名稱(chēng)} 這種EL表達(dá)式取值一定要記住




1.6.5.2 JSTL表達(dá)式 重要程度 ★★★★

1) 為什么使用JSTL?

使用EL表達(dá)式可以簡(jiǎn)化JSP頁(yè)面編碼,封裝了數(shù)據(jù)訪(fǎng)問(wèn)的功能,但是如果需要進(jìn)行邏輯判斷和 循環(huán)控制EL表達(dá)式是辦不到的,而JSTL標(biāo)簽庫(kù)整合彌補(bǔ)了這一問(wèn)題;

JSTL標(biāo)簽庫(kù)則封裝了邏輯控制、循環(huán)控制以及數(shù)據(jù)格式化等功能,二者結(jié)合使用才能完整實(shí) 現(xiàn)動(dòng)態(tài)頁(yè)面的開(kāi)發(fā)需求;

2) 什么是JSTL?

JSTL(JavaServer Pages Standard Tag Library,JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù))是一個(gè)不斷完善的開(kāi) 放源代碼的JSP標(biāo)簽庫(kù),是由apache的jakarta小組來(lái)維護(hù)的。

JSTL的優(yōu)點(diǎn)是提供一組標(biāo)準(zhǔn)標(biāo)簽,可用于編寫(xiě)各種動(dòng)態(tài)功能;

3) 怎么用JSTL

1. 引入jar包

jstl.jar : jstl標(biāo)簽的核心jar包

standard.jar : JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)

2. 導(dǎo)入頭部信息

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" p refix="c" %> 4) JSTL的常用標(biāo)簽

1. 頁(yè)面賦值標(biāo)簽 <c:set> 頁(yè)面取值標(biāo)簽 <c:out >

語(yǔ)法 :

<c:set var="變量名稱(chēng)" value="變量值" />

<c:out value="變量名稱(chēng)" />

舉例 :

<div> <h1>set out 標(biāo)簽展示</h1> <!‐‐ set保存一個(gè)值 ‐‐> <c:set var="msg" value="hello,jstl!" /> <!‐‐ out取值 ‐‐> out 標(biāo)簽 :<h2><c:out value="${msg}" /></h2> <!‐‐ 直接取值也可以 ‐‐> 直接取值 :<h2>${msg}</h2></div>效果 :

2. remove標(biāo)簽:刪除set標(biāo)簽設(shè)置的值

代碼 :

<div> <h1>set out 標(biāo)簽展示</h1> <!‐‐ set保存一個(gè)值 ‐‐> <c:set var="msg" value="hello,jstl!" /> <!‐‐ 刪除 ‐‐> <c:remove var="msg"/> <!‐‐ out取值 ‐‐> out 標(biāo)簽 :<h2><c:out value="${msg}" /></h2> <!‐‐ 直接取值也可以 ‐‐> 直接取值 :<h2>${msg}</h2> </div>效果 :

3. if標(biāo)簽

舉例 :

<div> <!‐‐ 比如保存一個(gè)數(shù)字 ‐‐> <c:set var="num" value="10" /> <h1>if標(biāo)簽舉例</h1> <h2>輸入數(shù)字為:${num}</h2> <c:if test="${num%2==0}"> <h2>判斷結(jié)果 : 偶數(shù)</h2> </c:if> <c:if test="${num%2!=0}"> <h2>判斷結(jié)果 :基數(shù)</h2> </c:if> </div> 效果 :

問(wèn)題 : JSTL中沒(méi)有 if-else這種靈活的結(jié)構(gòu),如果希望擁有一個(gè)if-else怎么辦呢?

4. choose標(biāo)簽 : if else 結(jié)構(gòu)

舉例 :

<div> <!‐‐ 比如保存一個(gè)數(shù)字 ‐‐> <c:set var="num" value="10" /> <h1>choose標(biāo)簽舉例</h1> <h2>輸入數(shù)字為:${num}</h2> <c:choose> <c:when test="${num%2==0}"> <h2>判斷結(jié)果 : 偶數(shù)</h2> </c:when> <c:otherwise> <h2>判斷結(jié)果 :基數(shù)</h2> </c:otherwise> </c:choose> </div>效果:

5. forEach : 實(shí)現(xiàn)對(duì)集合的遍歷

forEach 有兩種組合用法 :

第一種就是用于遍歷集合元素的

<div> <h1>forEach編輯集合元素</h1> <% List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); // 保存到request中 request.setAttribute("list", list); %> <!‐‐ 遍歷集合 ‐‐> <c:forEach var="s" items="${list}" varStatus="sta"> <p>第${sta.index+1}次循環(huán) : 集合元素為 : ${s}</p> </c:forEach> </div>效果 :

第二種就是按次數(shù)遍歷的,比如遍歷十次輸出1-10

代碼 :

<!‐‐ 按次數(shù)遍歷 ‐‐> <c:forEach var="i" begin="1" end="10"> ${i} </c:forEach>結(jié)果 :

1.6.5.3 拓展: 其他JSTL表達(dá)式

fmt 標(biāo)簽 : 用于數(shù)據(jù)格式化的標(biāo)簽

頭部信息

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>舉例說(shuō)明 : 1. 數(shù)字格式化成 錢(qián) 的格式展示

代碼 :

<div> <h1>格式化標(biāo)簽使用 : </h1> <c:set var="money" value="123.456" /> <p>沒(méi)有格式化數(shù)字 : ${money}</p> <p>已經(jīng)格式化數(shù)字 : <fmt:formatNumber type="currency" value="${money}" /> </p> </div>效果:

2. 格式化時(shí)間

代碼:

<div> <h1>格式化標(biāo)簽使用 : </h1> <% Date date = new Date(); %> <c:set var="now" value="<%=date %>" /> <p>正常時(shí)間 : ${now}</p> <p>格式化好之后的時(shí)間:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd"/></p> <p>格式化好之后的時(shí)間:<fmt:formatDate value="${now}" pattern="yyyy年MM月dd日"/></p> <c:set var="money" value="123.456" /> <p>沒(méi)有格式化數(shù)字 : ${money}</p> <p>已經(jīng)格式化數(shù)字 : <fmt:formatNumber type="currency" value="${money}" /> </p> </div>效果:




1.6.3 response對(duì)象

重要程度 : ☆☆ (一般重要)

1) 剛才我們?cè)趯?xiě)轉(zhuǎn)發(fā)請(qǐng)求的時(shí)候涉及到了一個(gè)對(duì)象叫做response對(duì)象,那么接下來(lái)我們就介紹一下這個(gè)response對(duì)象

response對(duì)象 用于響應(yīng)客戶(hù)請(qǐng)求并向客戶(hù)端輸出信息

什么意思? 舉個(gè)例子

request 是頁(yè)面發(fā)送請(qǐng)求到服務(wù)器 然后服務(wù)器接收數(shù)據(jù)再做處理 因?yàn)榭蛻?hù)端與服務(wù)器之間 傳輸?shù)亩际亲址?所以我們把request 叫做請(qǐng)求流

response正好相反,服務(wù)器處理完了頁(yè)面請(qǐng)求之后需要發(fā)送結(jié)果給頁(yè)面,此時(shí)就可以使用

response對(duì)象,因?yàn)樗欠?wù)器向客戶(hù)端發(fā)送信息的對(duì)象 所以我們把response對(duì)象 叫做 響 應(yīng)流

B/S 請(qǐng)求 與 響應(yīng) 模式

request form數(shù)據(jù) 從頁(yè)面帶到服務(wù)端 1) 設(shè)置編碼 2) 接收數(shù)據(jù) 3) 保存數(shù)據(jù) 4) 轉(zhuǎn)發(fā)數(shù)據(jù)

對(duì)于我們來(lái)說(shuō) response 有一個(gè)方法我們需要留意一下 就是 void

sendRedirect(String location) 重定向

sendRedirect 方法叫做重定向,表示本次請(qǐng)求已經(jīng)處理完,客戶(hù)端將重新發(fā)送請(qǐng)求到指定的 URL;

重定向的特點(diǎn)是 重定向后 request對(duì)象會(huì)被重置,也就是說(shuō)request中的信息都會(huì)丟失,并且 地址欄也會(huì)發(fā)生改變,改變成新的地址

看下效果:

login.jps發(fā)送請(qǐng)求給服務(wù)器login_server.jsp,如果login_server.jsp使用重定向方式跳轉(zhuǎn)頁(yè)面的話(huà)

<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><% // 模擬數(shù)據(jù)庫(kù)定義兩組人 // 普通用戶(hù) String[] losers = {"趙文明","孫建國(guó)","王小花","李建軍"}; // VIP用戶(hù) String[] vips = {"湯姆","杰瑞"}; // 設(shè)定編碼 request.setCharacterEncoding("UTF-8"); // 接收頁(yè)面請(qǐng)求 String userName = request.getParameter("userName"); // 定義最終的展示結(jié)果頁(yè) String result = "error.jsp"; //默認(rèn)錯(cuò)誤頁(yè) // 判斷是不是普通用戶(hù) for(String a:losers){ if(userName.equals(a)){ result = "loser.jsp"; break; } } // 判斷是不是VIP用戶(hù) for(String b:vips){ if(userName.equals(b)){ result = "vip.jsp"; break; } } // 根據(jù)業(yè)務(wù)結(jié)果轉(zhuǎn)發(fā)到對(duì)應(yīng)頁(yè)面 // request.getRequestDispatcher(result).forward(request, response); // 重定向到結(jié)果頁(yè)面 response.sendRedirect(result);%>效果

你看本來(lái)該展示會(huì)員名字的地方就已經(jīng)沒(méi)有數(shù)據(jù)了!

總結(jié)來(lái)看 :

轉(zhuǎn)發(fā)與重定向的具體應(yīng)用

什么時(shí)候用重定向?

因?yàn)樗牧鞒淌?頁(yè)面請(qǐng)求 --> 服務(wù)器處理 --> 頁(yè)面展示 這樣三方處理需要數(shù)據(jù)不丟失的傳遞下去此時(shí),我們需要用轉(zhuǎn)發(fā)做頁(yè)面與服務(wù)器之間的跳轉(zhuǎn)




但是當(dāng)我們做 添加 修改 刪除 操作的時(shí)候,這三種操作都會(huì)影響我們保存的數(shù)據(jù),所以只要你 做了三種操作中的任意一種,你之前保存的數(shù)據(jù)就都不對(duì)了,所以

我們需要重新查詢(xún)數(shù)據(jù) 從定向 代表本次操作已經(jīng)完成了 然后開(kāi)啟下一次操作,如果使用重 定向也意味著 頁(yè)面請(qǐng)求 --> 服務(wù)器操作 此時(shí)服務(wù)器操作完 這個(gè)業(yè)務(wù)就結(jié)束了;




什么時(shí)候用轉(zhuǎn)發(fā)?

比如說(shuō)我們做查詢(xún)的時(shí)候 這個(gè)時(shí)候 第一個(gè)頁(yè)面發(fā)起請(qǐng)求 --> 服務(wù)端 處理 數(shù)據(jù)--> 第三個(gè) 頁(yè)面展示 這幾個(gè)頁(yè)面之間需要保證是在一次轉(zhuǎn)發(fā)鏈之中 所以他們之間的跳轉(zhuǎn)必須用轉(zhuǎn)發(fā)才 能完成!




根據(jù)我們業(yè)務(wù)進(jìn)行區(qū)分的話(huà)

1) 數(shù)據(jù)操作的時(shí)候

1. 事務(wù)操作 添加 修改 刪除

2. 非事務(wù)的 查詢(xún)

2) jdbc操作

1. queryrunner update 添加 修改 刪除

2. queryrunner query 查詢(xún)

3) 頁(yè)面操作的時(shí)候

1. 重定向 添加操作 更新操作 刪除操作 完成之后 肯定是從定向到 查詢(xún)請(qǐng)求上

2. 轉(zhuǎn)發(fā) 查詢(xún)的時(shí)候因?yàn)橐4鏀?shù)據(jù) 所以基本都采用轉(zhuǎn)發(fā)的形式 跳轉(zhuǎn)下一個(gè)頁(yè)面



關(guān)鍵詞:數(shù)據(jù),基礎(chǔ),交互,動(dòng)態(tài),入門(mén),深入

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉