轉(zhuǎn)發(fā)和重定向的區(qū)別
在四方臺(tái)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需搭建網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),四方臺(tái)網(wǎng)站建設(shè)費(fèi)用合理。
重定向response.sendRedirect("success.jsp");
轉(zhuǎn)發(fā):request.getRequestDispatcher("success.jsp").forward(request,response);
1.轉(zhuǎn)發(fā)在服務(wù)器端完成的;重定向是在客戶端完成的
★2.轉(zhuǎn)發(fā)的速度快;重定向速度慢
3.轉(zhuǎn)發(fā)的是同一次請(qǐng)求;重定向是兩次不同請(qǐng)求
★4.轉(zhuǎn)發(fā)不會(huì)執(zhí)行轉(zhuǎn)發(fā)后的代碼;重定向會(huì)執(zhí)行重定向之后的代碼
★5.轉(zhuǎn)發(fā)地址欄沒(méi)有變化;重定向地址欄有變化
6.轉(zhuǎn)發(fā)必須是在同一臺(tái)服務(wù)器下完成;重定向可以在不同的服務(wù)器下完成
一、跳轉(zhuǎn)到新頁(yè)面,并且是在新窗口中打開(kāi)頁(yè)面:
function openHtml()
{
//do someghing here...
window.open("xxxx.html");
}
window是一個(gè)javascript對(duì)象,可以用它的open方法,需要注意的是,如果這個(gè)頁(yè)面不是一相相對(duì)路徑,那么要加“http://”,比如:
function openHtml()
{
window.open("");
}
二、在本頁(yè)面窗口中跳轉(zhuǎn):
function totest2()
{
window.location.assign("test2.html");
}
如果直接使用location.assgin()也可以,但是window.location.assign()更合理一些,當(dāng)前窗口的location對(duì)象的assign()方法。
另外,location對(duì)象還有一個(gè)方法replace()也可以做頁(yè)面跳轉(zhuǎn),它跟assign()方法的區(qū)別在于:
replace() 方法不會(huì)在 History 對(duì)象中生成一個(gè)新的紀(jì)錄。當(dāng)使用該方法時(shí),新的 URL 將覆蓋 History 對(duì)象中的當(dāng)前紀(jì)錄。
說(shuō)說(shuō)servlet里面的方法:
public void?ValidateUserPass(String user,String pass){
RequestDispathcher?rd =null
//假使你的代碼是從DB中獲取
DBFactory?db=DBFactoryImpl.getDBFactoryInstance();//得到數(shù)據(jù)庫(kù)鏈接
flg=db.findUser(user,pass);
//?這里是不存在用戶
if(flg.hasNext()==-1){
//?登錄時(shí)錯(cuò)誤了,一般我們會(huì)給用戶一個(gè)提示
session.setAttirbute("msg","對(duì)不起,用戶名或密碼錯(cuò)誤");
RequestDispathcher?rd?=?req.getRequesDispatcher("login.jsp");
rd.forward(request,?reponse);//將請(qǐng)求對(duì)象和響應(yīng)對(duì)象傳遞進(jìn)來(lái)
}???//?這里是存在當(dāng)前用戶
else{
//當(dāng)然這里登錄成功時(shí),我們要把當(dāng)前用戶寫(xiě)到session里面保存
session.setAttirbute("userName",user);
//這個(gè)請(qǐng)求轉(zhuǎn)發(fā)語(yǔ)句
request.sendRedirect("index.html");
}
}
// * 上述代碼,你可以參考下我的方法,我也很久沒(méi)做JAVA開(kāi)發(fā)了,我現(xiàn)在從事前端UI開(kāi)發(fā),本來(lái)我想在寫(xiě)一個(gè)用struts 2登錄的程序的,可我現(xiàn)在忘得差不多了,上面我所用到的屬性建議你自己好好的研究一下,往后你將學(xué)到struts2 hibernate,Spring等一系列優(yōu)秀的開(kāi)源框架,說(shuō)白了,這些東西的底層還是這些,只不過(guò)這些框架做了一些封裝隔離。上述代碼建議你重點(diǎn)理解一下:請(qǐng)求轉(zhuǎn)發(fā)和重定向的區(qū)別。
a頁(yè)面代碼 !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" HTML HEAD TITLE page A /TITLE script language="javascript" function newWin(){ var str = window.showModalDialog("pageB.html",null,"dialogWidth=400px;dialogHeight=300px"); if (typeof(str) == "undefined") { alert("沒(méi)有傳回值來(lái)"); }else{ document.getElementById("mytext").value=str; } } /script /HEAD BODY input type="text" id="mytext" input type="button" value="button" onclick="newWin();" /BODY /HTML b頁(yè)面代碼 !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" HTML HEAD TITLE Page B /TITLE script language="javascript" function colseWin(){ var returnValue = document.getElementById("mytext").value.trim; window.returnValue=returnValue; window.close(); } /script /HEAD BODY input type="text" id="mytext" input type="button" value="保存并關(guān)閉" onclick="colseWin();" /BODY /HTML 把兩個(gè)文件保存到同級(jí)目錄下就可以了. 檢舉 回答人的補(bǔ)充 2009-09-10 23:01 java五種JSP頁(yè)面跳轉(zhuǎn)方法詳解 1. RequestDispatcher.forward() 是在服務(wù)器端起作用,當(dāng)使用forward()時(shí),Servlet engine傳遞HTTP請(qǐng)求從當(dāng)前的Servlet or JSP到 另外一個(gè)Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時(shí)form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動(dòng)傳遞. 但forward()無(wú)法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無(wú)法在后面帶參數(shù)傳遞,比如servlet?name=frank,這樣不行,可以程序內(nèi)通過(guò)response.setAttribute("name",name)來(lái)傳至下一個(gè) 頁(yè)面。 重定向后瀏覽器地址欄URL不變。 例:在servlet中進(jìn)行重定向 public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType("text/html; charset=gb2312"); ServletContext sc = getServletContext(); RequestDispatcher rd = null; rd = sc.getRequestDispatcher("/index.jsp"); //定向的頁(yè)面 rd.forward(request, response); } 通常在servlet中使用,不在jsp中使用。 2. response.sendRedirect() 是在用戶的瀏覽器端工作,sendRedirect()可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個(gè)頁(yè)面,同時(shí)它可以重定向至不同的主機(jī)上,sendRedirect()可以重定向有frame.的jsp文件. 重定向后在瀏覽器地址欄上會(huì)出現(xiàn)重定向頁(yè)面的URL 例:在servlet中重定向 public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType("text/html; charset=gb2312"); response.sendRedirect("/index.jsp"); } 由于response是jsp頁(yè)面中的隱含對(duì)象,故在jsp頁(yè)面中可以用response.sendRedirect()直接實(shí)現(xiàn)重定位。 注意: (1) 使用response.sendRedirect時(shí),前面不能有HTML輸出; 這并不是絕對(duì)的,不能有HTML輸出其實(shí)是指不能有HTML被送到了瀏覽器。事實(shí)上現(xiàn)在的server都有cache機(jī)制,一般在8K(我是說(shuō) JSP SERVER),這就意味著,除非你關(guān)閉了cache,或者你使用了out.flush()強(qiáng)制刷新,那么在使用sendRedirect之前, 有少量的HTML輸出也是允許的。 (2) response.sendRedirect之后,應(yīng)該緊跟一句return。 我們已經(jīng)知道response.sendRedirect是通過(guò)瀏覽器來(lái)做轉(zhuǎn)向的,所以只有在頁(yè)面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。 比較: (1) Dispatcher.forward()是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址; (2) response.sendRedirect()則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。 前者更加高效,在前者可以滿足需要時(shí),盡量使用RequestDispatcher.forward()方法。 注:在有些情況下,比如,需要跳轉(zhuǎn)到一個(gè)其它服務(wù)器上的資源,則必須使用HttpServletResponse.sendRequest()方法。 3. <jsp:forward page="" /> 它的底層部分是由RequestDispatcher來(lái)實(shí)現(xiàn)的,因此它帶有RequestDispatcher.forward()方法的印記。 如果在之前有很多輸出,前面的輸出已使緩沖區(qū)滿,將自動(dòng)輸出到客戶端,那么該語(yǔ)句將不起作用,這一點(diǎn)應(yīng)該特別注意。 另外要注意:它不能改變?yōu)g覽器地址,刷新的話會(huì)導(dǎo)致重復(fù)提交 4. 修改HTTP header的Location屬性來(lái)重定向 通過(guò)設(shè)置直接修改地址欄來(lái)實(shí)現(xiàn)頁(yè)面的重定向。 jsp文件代碼如下: <% response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); String newLocn = "/newpath/jsa.jsp"; response.setHeader("Location",newLocn); %> 5. JSP中實(shí)現(xiàn)在某頁(yè)面停留若干秒后,自動(dòng)重定向到另一頁(yè)面 在html文件中,下面的代碼: <meta http-equiv="refresh" content="300; url=target.jsp"> 它的含義:在5分鐘之后正在瀏覽的頁(yè)面將會(huì)自動(dòng)變?yōu)閠arget.html這一頁(yè)。代碼中300為刷新的延遲時(shí)間,以秒為單位。targer.html為你想轉(zhuǎn)向的目標(biāo)頁(yè),若為本頁(yè)則為自動(dòng)刷新本頁(yè)。 由上可知,可以通過(guò)setHeader來(lái)實(shí)現(xiàn)某頁(yè)面停留若干秒后,自動(dòng)重定向到另一頁(yè)面。 關(guān)鍵代碼: String content=stayTime+";URL="+URL; response.setHeader("REFRESH",content); 檢舉 提問(wèn)人的追問(wèn) 2009-09-10 23:01 在java里面寫(xiě) 就是在class 不是在頁(yè)面上寫(xiě) 檢舉 提問(wèn)人的追問(wèn) 2009-09-10 23:11 我要跳轉(zhuǎn)到另一個(gè)域名里 response.sendRedirect("這里面可以寫(xiě) ")嗎; 檢舉 回答人的補(bǔ)充 2009-09-10 23:19 那您要的是 通過(guò)點(diǎn)擊來(lái)跳轉(zhuǎn)還是通過(guò)內(nèi)制時(shí)間來(lái)跳轉(zhuǎn)? 檢舉 回答人的補(bǔ)充 2009-09-10 23:37 這個(gè)頁(yè)面跳轉(zhuǎn)的好處在于不需要JS調(diào)用,直接在html文件頭里加入 meta http-equiv="refresh[刷新-這里指定動(dòng)作]" content="5[這里是時(shí)間];url=/article[這里是跳轉(zhuǎn)的URL]" 注意框內(nèi)的是注釋。 而用JS的方法則是這樣的: 在body內(nèi)任意位置加上 〈SCRIPT LANGUAGE=javascript〉 〈!-- window.location=″/home/default.htm″ //--〉 〈/SCRIPT〉 第三種方法是像c一樣的使用include,如: 〈BODY〉 〈p〉準(zhǔn)備調(diào)用文件〈/p〉 〈!--#include file= ″home/default.htm″--〉 〈p〉文件調(diào)用結(jié)束〈p〉 〈/BODY〉 ASP里可以用這個(gè)寫(xiě)法: 〈%Response.Redirect ″/home/default.htm″%〉
通俗來(lái)說(shuō),form表單是寫(xiě)在前端頁(yè)面(如html、jsp)上的,form有一個(gè)‘a(chǎn)ction’的參數(shù),這里需要填寫(xiě)目標(biāo)地址,如果不填寫(xiě)的話客戶端是不知道往哪里發(fā)送信息的,因此form是由客戶端主動(dòng)發(fā)送給服務(wù)器(具體的地址就是action索要填的值)的。這屬于客戶端向服務(wù)器發(fā)起請(qǐng)求,代碼表現(xiàn)為:
form
action='10086.jsp' method='get'
…………
/form
就像你打10086,你問(wèn)問(wèn)題(提交表單),客服(服務(wù)器)會(huì)根據(jù)你的問(wèn)題(form)反饋答案。同理,正常來(lái)說(shuō),后臺(tái)接收到前端發(fā)來(lái)的信息后,會(huì)進(jìn)行一系列操作,最后發(fā)送結(jié)果回去。
====分割線====
而轉(zhuǎn)發(fā)和重定向的代碼是寫(xiě)在后臺(tái)代碼里的,因?yàn)椴⒉皇撬械臉I(yè)務(wù)都由同一個(gè)后臺(tái)頁(yè)面處理(例如統(tǒng)一管理平臺(tái)),前端form填的是頁(yè)面A,但實(shí)際上頁(yè)面A在接收到form后并不進(jìn)行處理,而是通過(guò)轉(zhuǎn)發(fā)或者重定向的方式,發(fā)送給頁(yè)面B,頁(yè)面B處理后會(huì)把結(jié)果發(fā)送給A,然后A再反饋給前端。因此,這屬于服務(wù)器向服務(wù)器發(fā)起請(qǐng)求
轉(zhuǎn)發(fā)的代碼是request.getrequestdispatcher (10086-2.jsp).forward(request,response),特點(diǎn)是url不會(huì)變,客戶端無(wú)法判斷是form表單的后臺(tái)頁(yè)面在處理還是別的頁(yè)面在處理(你在瀏覽器上是無(wú)法知道10086-2.jsp這個(gè)頁(yè)面的存在)。就像10086客戶有時(shí)候會(huì)讓你稍等,等待期間你是不知道他是在敲電腦還是找外援尋求答案。
重定向的代碼是response.sendRedirect("10086-2.jsp"),特點(diǎn)是url會(huì)變。瀏覽器的地址欄會(huì)明顯看到地址發(fā)生改變。就像10086客服告訴你該問(wèn)題不是他負(fù)責(zé)的范圍,然后幫你轉(zhuǎn)接到其他相應(yīng)的客戶。
至于怎么判斷啥時(shí)候使用轉(zhuǎn)發(fā),啥時(shí)候使用重定向,還請(qǐng)理解jsp的四大作用域之后再回頭思考。