zoukankan      html  css  js  c++  java
  • Servlet总结02——请求转发

    我们很多时候要对请求进行转发,例如:

    1.servlet处理完相关业务后,将请求转发到一个jsp页面;

    2.基于mvc模式,定义一个servlet充当控制器,将请求转发个特定servlet或jsp;

    在Servlet中我们可以使用javax.servlet.RequestDispatcher来处理请求转发。

    (一)RequestDispatcher

    requestDispatcher对象由servlet容器创建,用于封装一个由路径所标识的服务器资源。

    转发的动作包括:

    1) public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;

    该方法必须在响应被提交给客户端之前调用,否则抛出IllegalStateException异常。forward进入后,原先的Servlet将终止执行。

    2) public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;

    include进入被调用的对象后,执行完相关操作后仍然会继续原先的servlet。

    note:注意forward和include的区别。

    (二)获得RequestDispatcher对象。

    从ServletRequest对象获取:

    public RequestDispatcher getRequestDispatcher(String path);

    从ServletContext对象获取:

    public RequestDispatcher getRequestDispatcher(String path);

    public RequestDispatcher getNamedDispatcher(String name);

    note:servletRequest和servletContext有同样的方法:getRequestDispatcher,那么区别是什么?

    区别:

    servletRequest的getRequestDispatcher方法,参数path可以以斜杠(/)开头,代表当前上下文根的路径。

    如果不用斜杠开头,则相对于当前Servlet的路径。

    servletContext的getRequestDispatcher方法,参数path必须要以斜杠(/)开头。

    (三)sendRedirect和forward的区别

    sendRedirect是HttpServletResponse的方法。他的工作原理是:

    关键点:调用sendRedirect方法,会在响应中设置locaction响应报头,它告诉浏览器再访问一次directory的新资源。

    这对于用户来说是透明的,一切都是有浏览器完成的。用户只是发现地址栏发生了变化。

    整个过程有两次请求。

    而forward的原理如下:

    关键点:这个过程对于用户而言更透明,他并不知道服务端内部是哪个servlet处理了请求,甚至地址栏都没有任何变化。

    这个过程只有一次请求。

  • 相关阅读:
    hdu 4135 Co-prime (容斥定理)
    hdu 1509 Windows Message Queue (优先队列)
    poj 2104 K-th Number (划分树)
    hdu 1556 Color the ball (树状数组)
    海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践
    使用MaxCompute Java SDK运行安全相关命令
    使用MaxCompute Java SDK 执行任务卡住了,怎么办?
    老代码多=过度耦合=if else?阿里巴巴工程师这样捋直老代码
    日志服务Python消费组实战(三):实时跨域监测多日志库数据
    如何限制用户仅通过HTTPS方式访问OSS?
  • 原文地址:https://www.cnblogs.com/huangfox/p/2220132.html
Copyright © 2011-2022 走看看