zoukankan      html  css  js  c++  java
  • java中的服务端跳转与客户端跳转区别与联系

    一般来说:
    1.
    resquest.getRequestDispatcher(String path).forward(request,response);这个是内部跳转,也就是说请求带上参数(上一个页面带过来的参数)

    2.
    response.sendRedirect(String location); 这个是外部跳转,也叫重定向。请求不带参数,重新连接一个url 

    forward是服务器内部转发
    标准流程如下:
        1.客户端浏览器发送HTTP request到服务器
        2.服务器在接收到客户端request之后,分别创建出HttpServletRequest对象和HttpServletResponse对象,然后调用所请求的servlet的 service方法,同时将HttpServletRequest对象和HttpServletResponse对象传递过去.
        3.当servlet,调用forward方法时,服务器根据forward转发的url找到对应的servlet,(如果forward jsp,则调用的是web container为jsp生成的java bean)
        服务器转发全程是没有客户端参与的,都在web container容器内部进行,没有任何服务器和客户端的通信,实际就是服务器内部的跳转
        4.注意这里,与1.的调用servlet不同:
         这次forward, 服务器没有构建HttpServletRequest对象和HttpServletResponse对象
         而是将原来的HttpServletRequest对象和HttpServletResponse对象传递给jsp过去


     sendRedirect是客户端转发
     1.当sendRedirect方法被执行,同时也意味着一次http request请求的结束
       此时,服务器会向客户端发送302状态码和新的url,告诉客户端重新发送request请求到新的url
    HTTP/1.1 302 Found
    Location: http://localhost:9080/AppIndex.jsp
    Content-Language: zh-CN
    Content-Length: 0
    Set-Cookie: JSESSIONID=00003FhtMbQNx1naY0MZ05XJeMz:-1; Path=/
    Date: Wed, 29 Aug 2007 16:37:31 GMT
    Server: WebSphere Application Server/6.1
    Expires: Thu, 01 Dec 1994 16:00:00 GMT
    Cache-Control: no-cache="set-cookie, set-cookie2"

     2.当客户端根据302状态码发送新的请求到到新的url的时候,新的请求-响应流程重新开始
     4.这时候服务器重新创建HttpServletRequest对象和HttpServletResponse对象
     5.此时两个请求已经不在一个线程了,更不用说request和response对象了
    所以此时在如果想把数据传递到新的servlet或新的jsp的request内,那么只能使用url?值/对的方式

    客户端跳转时用HttPservletResopse对象的sendRedirect函数实现,服务器端跳转是使用RequestDispather对象的forward方法实现的。这两者之间的区别主要体现在三个方面:

    1. 使用服务器端跳转时,客户浏览器的地址栏并不会显示目标地址的URL,而是用客户端跳转时,地址栏当中会显示目标资源的URL;

    2. 服务器端跳转是由客户端发送一个请求,请求一个服务器资源——如JSP和Servlet——,这个资源又将请求转到另一个服务器资源,然后再给客户端发送一个响应,也就是说服务器端跳转是客户端发送一次请求,服务器端给出一次响应;而客户端跳转的流程则不同。客户端同样是发送一个请求给服务器端资源,这个服务器资源会首先给客户端一个响应,客户端再根据这个响应当中所包含的地址,再次向服务器端发送一个请求,也就是说客户端跳转是两次请求,两次响应;

    3. 在进行客户端跳转和服务器端跳转时,都需要指定目标资源的URL,如果这个路径以“”开始。在客户端跳转当中“”代表的是应用服务器根目录,而在服务器端跳转当中代表的是应用程序根目录。

    page = 页面级别

    request = 请求级别(与服务器端跳转配合使用)

    session = 会话级别(客户端跳转(服务器端跳转也可,但是客户端跳转更加突出了session的作用范围))

    application = 应用级别

    客户端跳转:服务器端将请求结果返回给客户端,客户端向服务器发出另一次请求。在客户端跳转过程中是两次不同的请求。在地址栏中显示的是最后一次请求地址。

    客户端跳转可以进行站外跳转。

    1、链接跳转:<a href=””></a>

    2、表单提交

    3、Response.sendRedirect(“3.jsp”);

    4、<mata http-equiv=”refresh”, content=”3;2.jsp”/>

    5、response.setHeader(“refresh”,” 3;2.jsp”);

    6、客户端跳转“/”代表服务器跟路径webapps

    服务器端跳转(容器内跳转):能够自动的在服务器内部进行跳转,这种跳转对用户来说是透明的。两次跳转时同一个request,在地址栏中显示的事第一次页面地址。

    只能进行站点内跳转。

    1、<jsp:forward page=””/>

    2、pageContext.forward();

    3、 request.getRequestDispatcher("1.jsp").forward(request,response);

    3、服务器端跳转“/”代表站点根路径

    转载:http://blog.csdn.net/trialwalker/article/details/6958531

  • 相关阅读:
    文件夹对比工具
    删除eval key
    Mongodb Backup and Restore
    RabbitMQ Management界面中查看NaN的队列
    css文字描边
    网页适配 iPhoneX,就是这么简单
    VSCode 配置使用less转成.min.css压缩
    css3随着外层包裹的旋转里面的图标为正
    安装nginx+免费https证书
    在线微博数据可视化
  • 原文地址:https://www.cnblogs.com/lovelifeloveme/p/3221467.html
Copyright © 2011-2022 走看看