JAVA 客户端跳转与服务器端跳转 get与post
雖然說(shuō)get?與post?問(wèn)題很老套了,但是作為web?開(kāi)發(fā)人員來(lái)說(shuō)對(duì)于這個(gè)的理解確實(shí)很有必要,其實(shí)說(shuō)到get?和post,還可以有doGet?與doPost?和客戶(hù)端跳轉(zhuǎn)與服務(wù)端跳轉(zhuǎn)的區(qū)別;
?
GET?與POST?的區(qū)別:
?
???????一、Get?是從服務(wù)器上獲取?數(shù)據(jù),Post?則是向服務(wù)器傳送?數(shù)據(jù);
?
???????二、Get?將表單中數(shù)據(jù)的按照variable=value?的形式,添加到action?所指向的URL?地址的后面?,并且兩者用“?”?連接,而各個(gè)變量之間使用“&”?連接。Post?是將表單中的數(shù)據(jù)放在form?的數(shù)據(jù)體中(?或者說(shuō)把內(nèi)容放在了http消息體里)?,按照變量和值相對(duì)應(yīng)的方式,傳遞到action?所指向URL?;
?
???????所以從上第二點(diǎn)也可以得到另外兩個(gè)結(jié)論:
?
????????????? 1?、Get?傳送的數(shù)據(jù)量較小?,不能大于2KB?,這主要是因?yàn)槭躑RL?長(zhǎng)度限制。
?
? ? ? ? ? ? ? ? ? ?Post?傳送的數(shù)據(jù)量較大?,所以在上傳文件只能使用Post(?注意在文件上傳時(shí)還要加上enctype="multipart/form-data"?作為上傳文件的標(biāo)識(shí))?。一般被默認(rèn)為不受限制。但理論上,IIS4?中最大量為80KB?,IIS5?中為100KB?;
?
????????????? 2?、Get?安全性非常低?(因?yàn)橛脩?hù)可以通過(guò)URL?看到)
?
? ? ? ? ? ? ? ? ???Post?安全性較高?(其所有操作對(duì)用戶(hù)來(lái)說(shuō)都是不可見(jiàn)的)。但是執(zhí)行效率卻比Post?方法要高點(diǎn)(優(yōu)點(diǎn)造就了?其缺點(diǎn));
?
??????????????總結(jié):
?
???????????????????? ?a?、如果是包含機(jī)密信息的話(huà),建議用Post?數(shù)據(jù)提交方式;
?
??????????????????????b?、當(dāng)數(shù)據(jù)處理不改變數(shù)據(jù)模型的狀態(tài)則推薦使用Get?方式,例如在做數(shù)據(jù)查詢(xún)。而操作改變了數(shù)據(jù)模型的狀態(tài)時(shí),則建議使用Post?方式,例如數(shù)據(jù)添加、修改或刪除,送電子郵件等;
?
???????三、Get?限制Form?表單的數(shù)據(jù)集的值必須為ASCII?字符;而Post?支持整個(gè)ISO10646?字符集,所以說(shuō)在出現(xiàn)一些亂碼時(shí)有時(shí)候可以將Get?請(qǐng)求換為Post?請(qǐng)求;
?
???????四、Get?是Form?的默認(rèn)方法;
?
???????五、Get?方式提交來(lái)的數(shù)據(jù)在服務(wù)器端用Request.QueryString()?來(lái)獲取,用Post?方式提交的數(shù)據(jù)用Request.Form()?來(lái)獲取;
?
?
?
服務(wù)器端跳轉(zhuǎn)與客戶(hù)端跳轉(zhuǎn):
?
???????首先我們需要理解什么是服務(wù)器端跳轉(zhuǎn),什么是客戶(hù)端的跳轉(zhuǎn)。簡(jiǎn)單理解所謂服務(wù)器端跳轉(zhuǎn)就是指地址欄內(nèi)容不變(客戶(hù)端瀏覽器的地址欄不會(huì)顯示目標(biāo)地址的URL?),而客戶(hù)端跳轉(zhuǎn)是指地址欄內(nèi)容發(fā)生改變(客戶(hù)端向服務(wù)器發(fā)請(qǐng)求偶,然后服務(wù)器再給客戶(hù)端一個(gè)響應(yīng),然后客戶(hù)端再根據(jù)服務(wù)器端給的響應(yīng)中的URL?再向服務(wù)器發(fā)送請(qǐng)求,所以是兩次請(qǐng)求,因此地址欄改變了顯示最后一次請(qǐng)求地址);
?
Java?中服務(wù)器端跳轉(zhuǎn):
?
?????? 1?、request.getRequestDispatcher("success.jsp").forward(request,response)?,它是只要執(zhí)行到此語(yǔ)句之后則立刻進(jìn)行跳轉(zhuǎn),可以傳遞request?屬性?;
?
???? 2?、<jsp:forward>,?這種跳轉(zhuǎn)屬于無(wú)條件跳轉(zhuǎn),它只能在棧內(nèi)轉(zhuǎn),而sendREdirect?中則可以任意轉(zhuǎn),甚至可以輸入baidu?;
?
客戶(hù)端跳轉(zhuǎn):
?
1?、response.sendRedirect("fail.jsp")?,所有頁(yè)面執(zhí)行完之后再進(jìn)行跳轉(zhuǎn),?不能傳遞request?范圍的屬性?,但是可以通過(guò)地址重寫(xiě)的方式向跳轉(zhuǎn)頁(yè)傳遞參數(shù),因?yàn)樵摲椒▓?zhí)行完之后就相當(dāng)于一次http request?的結(jié)束,這是服務(wù)器會(huì)向客戶(hù)端發(fā)送302?狀態(tài)碼和新的url?,告訴客戶(hù)端重新發(fā)送request?請(qǐng)求到新的url?,然后客戶(hù)端照此執(zhí)行,執(zhí)行即新的請(qǐng)求響應(yīng)流程開(kāi)始,服務(wù)器再重新創(chuàng)建HttpServletRequest?對(duì)象和HttpServletResponse?對(duì)象,此時(shí)兩個(gè)請(qǐng)求已經(jīng)不在一個(gè)線(xiàn)程了,所以request?和response?對(duì)象都不是開(kāi)始的那個(gè)了;
?
?????? 2?、response.setHeader("refresh","2;URL=index.jsp"),2?秒后跳轉(zhuǎn)到其他頁(yè)面;
?
?????? 3?、<a href="http://www.baidu.com">?百度</a>?,超鏈接;
?
?????? 4?、表單提交;
?
通過(guò)以上可以得知,如果現(xiàn)在一個(gè)頁(yè)面中使用了JDBC?,則應(yīng)該在forward?跳轉(zhuǎn)之前關(guān)閉數(shù)據(jù)庫(kù)鏈接,而使用respose則可以在任意的位置處關(guān)閉;
?
注意:
?
?????? 1?、客戶(hù)端跳轉(zhuǎn)“/?”代表服務(wù)器路徑webapps?,即服務(wù)器根路徑,服務(wù)器端跳轉(zhuǎn)“/?”代表站點(diǎn)根路徑,即應(yīng)用程序根路徑;
?
? ? ? ?2?、盡量使用response.sendRedirect("fail.jsp")?而不去使用forward?,因?yàn)楫?dāng)服務(wù)器崩潰了,那么sendRedirect?則就會(huì)起很大的好處了。
超強(qiáng)干貨來(lái)襲 云風(fēng)專(zhuān)訪(fǎng):近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的JAVA 客户端跳转与服务器端跳转 get与post的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于大龄程序员的谣言 新手必读
- 下一篇: 再谈 Java中Runnable和Thr