• 一个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,它是在服务器端完成的转向,和客户端无关,所以用户在浏览器的地址还是第一次请求的地址。




  • 相关阅读:
    android listview 添加数据
    Android 打开其他程序
    Android 自定义ListView Item侧滑删除
    Intent 传递对象
    openfire Android学习(六)----总结
    openfire Android学习(五)------连接断开重连
    openfire Android 学习(四)----单人聊天和多人聊天(发送消息、接收消息)
    openfire Android学习(三)----会议室创建、加入以及查询会议室中所有成员等
    openfire Android学习(二)----对分组、好友和头像等一些操作
    openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
  • 原文地址:https://www.cnblogs.com/suijing/p/3379400.html
Copyright © 2020-2023  润新知