zoukankan      html  css  js  c++  java
  • 一个request穿越多个jsp(servlet)页面的情况的讨论

    request一般用于客户端提交数据,大部分时候,它的生存周期很短,只是从c1->s1两个页面之间传递的时候存在,一旦s1完成response,这个请求就被销毁了。

    这是从服务器执行的角度来看的,如果从编码角度看呢。request是可以在多个页面使用的。


    1,include,在主页面声明以下代码,

    <jsp:include page="included.jsp">
    <jsp:param name="User" value="HiFi King" />
    </jsp:include>

    即可在included。jsp页面中使用该request,include标签类似于把included.jsp的代码直接嵌入在include.jsp声明标签的位置。

    这点可以在客户端查看页面源代码,included.jsp的代码出现在了页面中。同时,因为是嵌入,所以include。JSP页面后面的代码仍然是可以执行的。


    2,forward 

    在主页面声明以下代码

    <body>
    <%request.setAttribute("name1", "test1") ;%>
    <jsp:forward page="forwardTo.jsp">
    <jsp:param name="userName" value="riso" />
    <jsp:param value="name2" name="test2"/>
    </jsp:forward>
    <%request.setAttribute("name3", "test3") ;%>
    <%System.out.println("code after forward"); %>
    this is forward.jsp code after “forward” tag
    </body>

    forwardto.jsp页面则打印三个参数,name1,2,3. 

    实验可知,n1和n2分别用getParameter和getAttribute可以得到数据,而n3则没有。

    原因是,代码执行的时候,到forward标签这里就转进去了, </jsp:forward>forward结束之后的所有语句都不会得到执行。

    同时,和include不同,用户停留的页面不是主页面,而是forward指向的页面,查看源代码,也只能看见指向页面的源代码。


    3,请求转发和重定向

    先说重定向,看这个的代码 response.sendRedirect("myResult.jsp"); 

     前面也说过了,服务端一旦对请求作出响应(response)那么表示这个请求已经完成了,这个请求马上就会被销毁。

    所以这个时候发生的事情是response.sendRedirect("myResult.jsp");被执行,用户的请求已经完成了,同时告知客户端重使用get方式新向新的目标发起请求。

    如果用浏览器的网络监听工具如firebug(傲游的开发者工具也可以)监听网络请求,可以发现,有两个请求产生,一个是用户主动发出的,一个是用户被服务器端告知需要重定向自动发出的。

    下面摘录一段http://aixiangct.blog.163.com/blog/static/91522461201123111443587/的内容说明下重定向与forward的相似和不同。

    forward跳转:<jsp:forward page="跳转页面地址" />:a.服务器端跳转,地址栏不改变;b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源);c.request设置的属性在跳转后的页面仍可以使用;d.使用<jsp:param name="参数名" value="参数值" />传递参数。
     
    sendRedirect跳转:response.sendRedirect("跳转页面地址"):a.客户端跳转,地址栏改变;b.所有代码执行完毕后跳转;c.跳转后的页面不能使用上一个页面的request属性;d.使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。

    Response.sendRedirect是两个不同的request,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
     
    JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味
     
    JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味
     
     
    使用forward时,由于只是发送一次request请求,request设置的属性(setAttribute)依然能保留在下一个页面。
    使用sendRedirect时,由于发送两次request请求,所以在下一个不能获取request属性。但可以通过重写URL的方式


    RequestDispatcher  是请求转发,
    RequestDispatcher  的实例化对象有两种转发手段,forward和include,其实就是对应前面说的jsp的两种标签
    请求转发,全程只有一个request,它是在服务器端完成的转向,和客户端无关,所以用户在浏览器的地址还是第一次请求的地址。




  • 相关阅读:
    [原创]软件性能测试培训
    100w条记录分页,可以有多快?—— DataReader分页与SQL语句分页的对比测试(在线演示)
    【自然框架】注册会员活动——第一份代码的修改建议(第一版)
    加班有几种情况?兼谈讨论的方式。
    衔着树枝飞跃太平洋的傻鸟!(童话版)
    参加活动的好处。
    【自然框架】开源社区活动,会员注册的第一份代码!
    【自然框架】数据访问之精雕细琢(一)存储过程的参数
    自然框架开发系列(一):自然框架 和 AgileEAS.NET 合作,开发b/s的药店系统!
    自然框架开源社区的第一次活动——实现会员注册
  • 原文地址:https://www.cnblogs.com/suijing/p/3379400.html
Copyright © 2011-2022 走看看