• HttpServlet RequestDispatcher sendredirect和forward


    Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http。 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口和类,在javax.servlet.http包中定义了采用HTTP通信协议的HttpServlet类。
    Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了5个方法,其中有3个方法代表了Servlet的生命周期:
    init方法,负责初始化Servlet对象
    service方法,负责响应客户的请求
    destroy方法,当Servlet对象退出生命周期时,负责释放占有的资源
    Servlet被设计成请求驱动的.Servlet的请求可能包含多个数据项,当Web容器接收到某个Servlet请求时,Web容器把请求封装成一个HttpServletRequest对象,然后把对象传给Servlet的对应的服务方法.
    HTTP的请求方式包括DELETE,GET,OPTIONS,POST,PUT和TRACE,在HttpServlet类中分别提供了相应的服务方法,它们是,doDelete(),doGet(),doOptions(),doPost(), doPut()和doTrace().
    HttpServlet容器响应Web客户请求流程如下:
    1)Web客户向Servlet容器发出Http请求
    2)Servlet容器解析Web客户的Http请求;
    3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
    4)Servlet容器创建一个HttpResponse对象;
    5)Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
    6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
    7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
    8)Servlet容器把HttpServlet的响应结果传给Web客户。
     
    servlet 服务方法介绍如下
     
    1. doGet() :调用服务器的资源,并将其作为响应返回给客户端.doGet()调用在URL里显示正在传送给Servlet的数据,这在系统的安全方面可能带来一些问题,比如说,用户登录时,表单里的用户名和密码需要发送到服务器端,doGet()调用会在浏览器的URL里显示用户名和密码.
    2. doPost() :它用于把客户端的数据传给服务端,使用它可以以隐藏方式给服务器端发送数据.Post适合发送大量数据.
    3. doPut() :调用和doPost()相似,并且它允许客户端把真正的文件存放在服务器上,而不仅仅是传送数据.
    4. doDelete() :它允许客户端删除服务器端的文件或者Web页面.它的使用非常少.
    5. doHead() :它用于处理客户端的Head调用,并且返回一个response.当客户端只需要响应的Header时,它就发出一个Header请求.这种情况下客户端往往关心响应的长度和响应的MIME类型.
    6. doOptions():它用于处理客户端的Options调用,通过这个调用,客户端可以获得此Servlet支持的方法.如果Servlet覆盖了doPost()方法,那么将返回:
     
     
     
     
     
     
    RequestDispatcher:
     

    RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法:include/forward

    由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。我们需要把<jsp:include>翻译为Java code – RequestDispatcher.include();

    用法:

    <% request.getRequestDispatcher(filename).include(request, response); />

    服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.

    HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http: //Java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置 HTTP响应头信息的实现。

    RequestDispatcher.forward()方法将当前的request和response重定向到该 RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。

    注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。

    简单用法:

    RequestDispatcher rd;
           rd = getServletContext().getRequestDispatcher("/Expired.jsp");
           rd.forward(request,response); 

    SendRedirect 和 forward 区别

    SendRedirectForward
    不同的request 不同的对象,但是可以取到上一个页面的内容
    send后面的语句会继续执行,除非return Forward后面的语句不会继续发送给客户端
    速度慢 速度快
    需要到客户端的往返,可以跳转到任何页面 服务器内部转换
    地址栏有变化 地址栏没有变化
    可以传参数,直接写在URL后面 可以传参数

     “/” 代表的是http://127.0.0.0/


    <%response.sendRedirect();%>
    <form action="/test/ServletToJSP">
    <a href="/test/ServletToJSP">test</a>

     “/”  代表的是 http://127.0.0.1/test


    this.getServletContext().getRequestDispatcher
    ("/servlet_jsp/ServletUseJSP.jsp").forward
    (req,resp); 并且只能以 / 开头

















    -

    ITeye sendRedirect和forward原理及区别总结
    ITeye  forward与sendRedirect区别
    CSDN  forward和sendRedirect的区别

    HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源。

    sendRedirect实现请求重定向,forward实现的是请求转发。

    在web服务器内部的处理机制也是不一样的。

    1.forward方法只能转发给同一个web站点的资源,而sendRedirect方法还可以定位到同一个web站点的其他应用,甚至可以通过传入绝对路径定位到别的web站点,这事forward的方法所不能比拟的优势。

    可以看到这两种方法的用法,如果传给RequestDispatcher 的参数以"/"开头,则访问的是当前web应用的根目录

    加入当前web的根目录是myweb。如果传给sendRedirect方法以"/"开头,访问的是整个web站点的根目录。

    1. RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");  
    2.         rd.forward(request, response);  
    3.   
    4.         response.sendRedirect("/index.jsp");  


    2.forward重定向后,浏览器url地址不变,sendRedirect转发后,浏览器url地址变为目的url地址。

    3. 使用forward重定向的过程,是浏览器先向目的Servlet发送一次Request请求,然后再服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。浏览器和服务器一次请求响应。

        使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应。

    4. forward方法的调用者与被调用者之间共享Request和Response

        sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。

        如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。

    5.无论是forward方法还是sendRedirect方法调用前面都不能有PrintWriter输出到客户端。

       forward方法报错: Java.lang.IllegalStateException: Cannot forward after response has been committed

       sendRedirect报错:java.lang.IllegalStateException
     at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)

    ----------------------------------------------------------------------------------------------------------------------------------------------
    SendRedirect() 与 Forward() 区别

    Respose.sendRedirect()  
    Request.getRequestDispacher().forward()
    sendRedirece() Forward()
    属于不同的请求 属于同一请求
    重定向后地址栏发生变化 重定向后地址栏不变
    重定向可转到本WEB程序以外 重定向只能在本WEB程序内
    “/”:表示服务器根目录 “/”:web程序根目录

    网路摘录:
    1.sendRedirect 和forward的区别
        简而言之,sendRedirect()相当于做一次客户端跳转,而forward则是服务端跳转。
        sendRedirect是由浏览器来做的事情。当调用sendRedirect,服务端返回一个response,里面包含了跳转的内容,由浏览器获得后,进行跳转,我们可以看到浏览器中的URL是改变的。而forward则是在服务端直接做的事情,浏览器并不知道,这也就是为什么forward后浏览器的URL还是保持不变的原因。

    2.实现页面跳转的方法
    方式1: <jsp:forward>
    jsp:forward 是一种JSP动作,使用语法如下:
                        CODESTYLE:<jsp:forward page="Relative URL">
    在使用此动作时,主页不可以有任何的输出,它所起到的作用与SERVLET中使用的RequestDispatcher方法的作用是一致的.这种跳转是由服务器执行的,因此跳转的页面可以放在WEB-INF目录中,提高程序的安全性.

    方式2  response.sendRedirect()
    用此方法做跳转其实是向浏览器发送一个特殊的HEADER,然后又浏览器来做转向,装到指定的页面.所以用此方法时,浏览器上的地址栏里可以明显看到地址的变化.这与方式1动作不同,它是由服务器来做转向的.因此,使用sendRedirect做转向时,转向的页面不能放在WEB-INF下.

    方式3  使用页面自动刷新
    代码如下:      CODESTYLE:<meta http-equiv="Refresh" content="秒数";url="跳转的文件或者地址">

    方式4 请求转发与重定向
    jsp:forword 是转发请求,所以在转发过程中,请求作用域的参数在转发页面是有效的response.sendRedirect 和页面刷新实际上都是重定向,所以请求作用域的参数在转到下一页面时回失效.

  • 相关阅读:
    css小技巧: select的css控制
    js中不存在exit函数,程序的运行中断停止,可使用return
    转载: WebCore渲染之一:基础
    转载: WEB架构师成长系列索引
    js:<form></form>中有<a>按钮时不能跳转?
    小心得:前台与后台的数据传递
    php session和cookie使用说明
    css 字体使用
    转载: PHP引用(&)使用详解
    三层架构下的增删改查 荣
  • 原文地址:https://www.cnblogs.com/ouyangping/p/6371545.html
Copyright © 2020-2023  润新知