Head out!http请求重定向和转发的区别

来源:互联网 发布:jpg转换成pdf mac 编辑:程序博客网 时间:2024/06/03 18:56

    很多年前就开始阅读的CSDN的文章,包括现在也经常在这里查找技术链接之类的东东,心里一直都想着有一天建一个自己的blog也挺好。但是呢,各种各样的原因,一直都没准备好,总感觉手指敲击键盘的画面不符合我一贯自以为是的风格,文笔不似旧时少年,而倔强,一如从前。

    接触java开发差不多两年时间了,一直都在三天打鱼两天晒网中前行,虽然一直以软件工程师自居,但正儿八经完完全全独立完成的项目几乎没有,一大堆技术和框架接触了不少,但一直没时间沉下心来整理(之前老觉得java这种东西没难度,稍微花点时间研究下就可以,可遗憾的是自己一直告诉自己过一段再说),最近我真的是忍不了我自己了,上周五处理个小问题搞了4个钟头没搞完,被旁边的人搞了10分钟不到就弄完了,我也是醉了呀!我一直以为我比他厉害,虽然这个问题他答出来了我没答出来敲打,哎,算了,那就算他厉害吧,反正不管怎么样,我是下决心要把所有底层技术细节弄个清清楚楚,为了督促自己完成这项可爱的工程,加上心里一直以来的一点点遗憾,我还是以一边复习一边分享的方式来进行吧!微笑

    额,该交代都交代了,不瞎BB了,虽然是第一天,但也不想只扯着没用的,这周重新看了一遍servlet基础,以前学的时候一直没搞明白HttpServletResponse的请求重定向和HttpServletRequest的请求转发的区别,我整理一下哈,思路如下:

    1、通常该问题出现的一个常见的场景是:在页面之间的参数传递中,在doGet方法中以request.setParameter()来传递,如果下个页面的转向方式是不带参数的response.sendRedirect(请求重定向),那么下一个页面接收不到参数值,如果转向方式是request.getRequestDispatcher(xx).forward(请求转发),则下一个页面可接收到参数值;

    2、搞清楚该原因之前,先要明白基于浏览器和Web服务器之间的请求和响应是基于http协议以及servlet的生命周期原理,这个有时间真的要好好读一下,这里简而言之来讲呢,每次当你在浏览器中输入一行URL然后回车时,相当于是让浏览器去向Web服务器请求一个网页资源,假设浏览器是小b,Web服务器是小w,他们大概会这样聊天:

-----------------------万能的分割线--------------------

小b:小w,我要看XX上有什么电影,赶紧把地址发给我

小w:小b呀,要找XX资源你直接在地址栏输入http://xx1,然后我会派servlet1把相关资源发给你

小b:已经进去了,但是里面好多东东,我想找YY系列的要去哪儿找?

小w:原来你是要看yy系列呀,可以在登陆首页的搜索栏输入“yy",然后我会可能提供给你两种方式来找到你想要的

小b:额,,第一种是神马?

小w:你重新在地址栏输入http://xx1?参数名=yy,然后就可以看到了微笑请求重定向

小b:生气我去,你大爷呀,那你干嘛不第一次就告诉我这个地址,我一次不就搞定了

小w:嘻嘻!你一开始又没说你要看XX上的YY的,你只是说了要找XX上的啊

小b:难过,那第二种呢?

小w:第二种方法没那么麻烦,刚才这个XX页面我是让servlet1帮忙的,但你要看其中的YY系列servlet1帮不上忙,我再派另外一个servlet2帮你搞定就可以啦!(请求转发

小b:骂人,你又不早说,以后这种问题不要问我,全部默认选第二种,听到没!!!

小w:呵呵,你想多了,我只是告诉你会有这两种方法,又没让你选,具体选哪种方式都是程序员GG说了算喔大笑

小b:。。。

-----------------------万能的分割线--------------------

    3、基础的http请求和响应就类似上面这种情形了,回到开始的主题,还有最后一个要点,为什么重定向方式传数据不带参数时下个页面无法接收(即对话场景中小b既然已经在搜索栏输入了yy,表示小w也已经收到了参数值,为什么重新输入URL时还要带上?参数名=yy),这个原理后来查了下,这个涉及到了request域的概念(其实还有其它的域)request的setParameter方法中保存的变量信息全部被封装在当前的http请求产生的request中,当浏览器第二次发起请求时,第一次请求中产生的request对象已经被Web服务器给释放了,因此当浏览器第二次发请求时必须带参数;相对应的,如果是重定向方式,当前保存的变量仍然在当前请求过程的request对象中,所以小b就不用重发请求。

    4、基本上就这些了,如果有刚接触servlet的同学我再提一个小问题算是一点补充了,通过上面的对话,小b现在已经知道可以用第一种方式(即重定向)来获取资源,那么假如下次小b想要获取XX页面上的zz资源,是否可以用重定向的方式只输入一次就获取到?答案很简单,但个人感觉这个问题本身有值得思考的地方。

    好了,第一次就这些吧,写技术文也真是累,另外我也不太愿意把这类东西写得太理性,鉴于行业内外有一些对程序设计工作的偏见和误解,我是努力想让自己开心一点,还是以稍微轻松点地方式去学习和生活吧。

    以上。





    

0 0