java 中sendredirect()和forward()方法的區(qū)別
HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現(xiàn)獲取相應(yīng)URL資源。
sendRedirect實現(xiàn)請求重定向,forward實現(xiàn)的是請求轉(zhuǎn)發(fā)。
在web服務(wù)器內(nèi)部的處理機制也是不一樣的。
1. 跳轉(zhuǎn)方式
運用forward方法只能重定向到同一個Web應(yīng)用程序中的一個資源。而sendRedirect方法可以讓你重定向到任何URL。
表單form的action= "/uu ";sendRedirect( "/uu ");表示相對于服務(wù)器根路徑。
如http://localhost:8080/Test應(yīng)用(則提交至http://localhost:8080/uu);
Forward代碼中的 "/uu "則代表相對與WEB應(yīng)用的路徑。如http://localhost:8080/Test應(yīng)用(則提交至http://localhost:8080/Test/uu);
2.forward重定向后,瀏覽器url地址不變,sendRedirect轉(zhuǎn)發(fā)后,瀏覽器url地址變?yōu)槟康膗rl地址。
forward()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件, 同時forward()無法在后面帶參數(shù)傳遞,
比如servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute( "name ",name)來傳至下一個頁面.
3. 使用forward重定向的過程,是瀏覽器先向目的Servlet發(fā)送一次Request請求,然后再服務(wù)器端由Servlet再將請求發(fā)送到目的url,再由服務(wù)器端Servlet返回Response到瀏覽器端。瀏覽器和服務(wù)器一次請求響應(yīng)。
使用sendRedirect轉(zhuǎn)發(fā)的過程,瀏覽器先向目的Servlet發(fā)送一次請求,Servlet看到sendRedirect將目的url返回到瀏覽器,瀏覽器再去請求目的url,目的url再返回response到瀏覽器。瀏覽器和服務(wù)器兩次請求響應(yīng)。
4. forward方法的調(diào)用者與被調(diào)用者之間共享Request和Response
sendRedirect方法由于兩次瀏覽器服務(wù)器請求,所以有兩個Request和Response。
如果使用request.setAttribute傳遞一些屬性就需要用forward,如果想要跳轉(zhuǎn)到別的應(yīng)用的資源,就需要用sendRedirect。
5.無論是forward方法還是sendRedirect方法調(diào)用前面都不能有PrintWriter輸出到客戶端。
forward方法報錯: Java.lang.IllegalStateException: Cannot forward after response has been committed
sendRedirect報錯:java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
總結(jié)
以上所述是小編給大家介紹的java 中sendredirect()和forward()方法的區(qū)別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
spring中@RestController和@Controller的區(qū)別小結(jié)
@RestController和@Controller這兩個注解用于創(chuàng)建Web應(yīng)用程序的控制器類,那么這兩個注解有哪些區(qū)別,本文就來介紹一下,并用示例代碼說明,感興趣的可以了解一下2023-09-09Mybatis-Plus使用saveOrUpdate及問題解決方法
本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01SpringBoot + MapStruct 屬性映射工具的使用詳解
MapStruct 是一個代碼生成器,簡化了不同的 Java Bean 之間映射的處理,所謂的映射指的就是從一個實體變化成一個實體。接下來通過本文給大家介紹SpringBoot + MapStruct 屬性映射工具的使用,需要的朋友可以參考下2021-09-09詳解Java中多線程異常捕獲Runnable的實現(xiàn)
這篇文章主要介紹了詳解Java中多線程異常捕獲Runnable的實現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識,需要的朋友可以參考下2017-10-10一分鐘入門Java Spring Boot徹底解決SSM配置問題
Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力于在蓬勃發(fā)展的快速應(yīng)用開發(fā)領(lǐng)域成為領(lǐng)導(dǎo)者2021-10-10一文帶你深入理解Java?AbstractQueuedSynchronizer
在并發(fā)編程中,鎖是一種保證線程安全的方式,這篇文章主要為大家介紹了AbstractQueuedSynchronizer(AQS)的數(shù)據(jù)結(jié)構(gòu)及實現(xiàn)原理,感興趣的小伙伴可以了解一下2023-07-07