springmvc請(qǐng)求轉(zhuǎn)發(fā)和重定向問(wèn)題(攜帶參數(shù)和不攜帶參數(shù))
請(qǐng)求轉(zhuǎn)發(fā)的三種方式
SpringMVC請(qǐng)求轉(zhuǎn)發(fā)區(qū)別于重定向,請(qǐng)求轉(zhuǎn)發(fā)地址欄不會(huì)發(fā)生改變、只發(fā)送一次請(qǐng)求、能攜帶原有的參數(shù),但只可以在同一個(gè)服務(wù)器中進(jìn)行轉(zhuǎn)發(fā)。
1、傳統(tǒng)的請(qǐng)求轉(zhuǎn)發(fā)
@RequestMapping("/forwardCommon") public ?forwardCommon(HttpServletRequest request,HttpServletResponse response){ ? request.getServletDispatcher("/WEBINF/pages/success.jsp").forward(request,response); }
2、SpringMVC中不經(jīng)過(guò)視圖解析器的請(qǐng)求轉(zhuǎn)發(fā)
@RequestMapping("/forwardView") public String forwardView(){ ?? ?return "forward:/WEB_INF/pages/success.jsp"; }
@RequestMapping("/forwardView") public String forwardView(){ ?? ?ModelAndView mv=new ModelAndView(); ? ? mv.setViewName("forward:/WEB_INF/pages/success.jsp"); }
3、請(qǐng)求轉(zhuǎn)發(fā)經(jīng)過(guò)視圖解析器
其實(shí)很多人并不知道經(jīng)過(guò)視圖解析器的路由轉(zhuǎn)發(fā)也是請(qǐng)求轉(zhuǎn)發(fā)
@RequestMapping("/shopmanagement") private String shopManagement(Model model) { ?? ?return "shop/shopmanagement"; }
@RequestMapping("/shopmanagement") private ModelAndView shopManagement(Model model) { ?? ?ModelAndView mv=new ModelAndView(); ? ? mv.setViewName("shop/shopmanagement");//也是請(qǐng)求轉(zhuǎn)發(fā),會(huì)經(jīng)過(guò)視圖解析器 ? ? return mv; }
上面的請(qǐng)求轉(zhuǎn)發(fā)只要在瀏覽器地址欄中輸入localhost:8080/o2o/shopadmin/shopmanagement?shopId=53,就可以訪(fǎng)問(wèn)shopmanagement.html這個(gè)頁(yè)面,并且我們可以嘗試在該頁(yè)面中引入一個(gè)js文件,試圖查看請(qǐng)求轉(zhuǎn)發(fā)后的地址。
$(function(){ ?? ?var shopId=getQueryString("shopId");//獲取url中的參數(shù) ?? ?var url=window.location.href;//獲得請(qǐng)求url }) function getQueryString(name){ ?? ?var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)"); ?? ?var r=window.location.search.substr(1).match(reg); ?? ?if(r!=null){ ?? ??? ?return decodeURIComponent(r[2]); ?? ?} ?? ?return null; }
我們可以發(fā)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)后的地址和第一次請(qǐng)求的地址一樣, 連地址后面攜帶的參數(shù)都一樣。所以請(qǐng)求轉(zhuǎn)發(fā)不僅可以在請(qǐng)求體中攜帶參數(shù)(POST請(qǐng)求),也可以在地址欄中攜帶參數(shù)(GET請(qǐng)求),最后都可以在轉(zhuǎn)發(fā)后的頁(yè)面中獲得該參數(shù)的值。
重定向
傳統(tǒng)的重定向請(qǐng)求地址會(huì)改變(兩次請(qǐng)求)、不能傳遞參數(shù),但是利用SpringMVC的重定向可以攜帶和傳遞參數(shù)。
重定向相比于請(qǐng)求轉(zhuǎn)發(fā)可以跨服,但是不能直接重定向訪(fǎng)問(wèn)WEB-INF下的資源(可重定向后再進(jìn)行一次請(qǐng)求轉(zhuǎn)發(fā))。
1、傳統(tǒng)的重定向
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public void testredirect(HttpServletResponse response){ response.sendRedirect("/index"); }
2、SpringMVC中不帶參數(shù)的重定向
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public String testredirect(){ return "redirect:/index"; }
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public ModelAndView testredirect(){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/index"); return mv; }
3、SpringMVC中帶參數(shù)的重定向
redirectAttributes.addAttributie("prama",value);
這種方法相當(dāng)于在重定向鏈接地址上追加傳遞的參數(shù)
@RequestMapping("/test") private String shopList(RedirectAttributes ra) { ?? ?ra.addAttribute("param", 1); ?? ?return "redirect:/shopadmin/shoplist"; } //相當(dāng)于請(qǐng)求 http://localhost:8080/o2o/shopadmin/shoplist?param=1
redirectAttributes.addFlashAttributie("prama",value);
這種方法是隱藏了參數(shù),鏈接地址上不直接暴露,用(@ModelAttribute(value = "prama")String prama)的方式獲取參數(shù)。
@RequestMapping("/test") private String shopList(RedirectAttributes ra) { ?? ?ra.addFlashAttribute("param", 1); ?? ?return "redirect:/shopadmin/shoplist"; }
接收參數(shù)
@RequestMapping("/shoplist") private String shopList(@ModelAttribute("param") String param) { ?? ?System.out.println(param);//輸出1 ?? ?return "shop/shoplist"; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Springboot中攔截GET請(qǐng)求獲取請(qǐng)求參數(shù)驗(yàn)證合法性核心方法
- SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案
- Spring?RestTemplate如何利用攔截器打印請(qǐng)求參數(shù)和返回狀態(tài)
- springboot如何設(shè)置請(qǐng)求參數(shù)長(zhǎng)度和文件大小限制
- 解讀SpringBoot接收List<Bean>參數(shù)問(wèn)題(POST請(qǐng)求方式)
- Spring?MVC實(shí)現(xiàn)GET請(qǐng)求接收Date類(lèi)型參數(shù)
- Spring請(qǐng)求傳遞參數(shù)的解決方案
相關(guān)文章
Netty分布式高性能工具類(lèi)同線(xiàn)程下回收對(duì)象解析
這篇文章主要為大家介紹了Netty分布式高性能工具類(lèi)同線(xiàn)程下回收對(duì)象解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot整合Elasticsearch游標(biāo)查詢(xún)的示例代碼(scroll)
這篇文章主要介紹了SpringBoot整合Elasticsearch游標(biāo)查詢(xún)(scroll),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10MybatisPlus自動(dòng)填充創(chuàng)建(更新)時(shí)間問(wèn)題
在開(kāi)發(fā)數(shù)據(jù)庫(kù)相關(guān)應(yīng)用時(shí),手動(dòng)設(shè)置創(chuàng)建和更新時(shí)間會(huì)導(dǎo)致代碼冗余,MybatisPlus提供了自動(dòng)填充功能,通過(guò)實(shí)現(xiàn)MetaObjectHandler接口并重寫(xiě)insertFill、updateFill方法,可以自動(dòng)維護(hù)創(chuàng)建時(shí)間、更新時(shí)間等字段,極大簡(jiǎn)化了代碼,這不僅提高了開(kāi)發(fā)效率,也保證了數(shù)據(jù)的可追溯性2024-09-09Java基于注解實(shí)現(xiàn)的鎖實(shí)例解析
這篇文章主要介紹了Java基于注解實(shí)現(xiàn)的鎖實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02詳解如何給Sprintboot應(yīng)用添加插件機(jī)制
這篇文章主要為大家介紹了如何給 Sprintboot 應(yīng)用添加插件機(jī)制,文中有詳細(xì)的解決方案及示例代碼,具有一定的參考價(jià)值,需要的朋友可以參考下2023-08-08Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實(shí)現(xiàn)
本文主要介紹了Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08使用Spring Expression Language (SpEL)全面解析表達(dá)式
這篇文章主要介紹了使用Spring Expression Language (SpEL)全面解析表達(dá)式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02