一、重定向

1、重定向的概念

重定向就是在访问一个Servlet时,没有得到资源,只能去找另外一个Servlet去获取资源,状态码为302。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet(name = "MyServlet")
public class MyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(302);
response.setHeader("Location", "https://start.firefoxchina.cn/");
}
}

在服务器执行该程序的时候,状态码被设置为302(重定向),并且告诉了服务器的访问地址。

在通过Http协议访问MyServlet时,http地址由http://localhost:8080/MyServlet_war_exploded/abc自动变为火狐的网址。因为状态码已经告诉服务器http://localhost:8080/MyServlet_war_exploded/abc这条路走不通了,并且告诉它了一条新路。

2、重定向的应用

response.sendRedirect(request.getContextPath()+"/ListLinkManServlet");

这行代码的背景是,处理完添加操作后要显示全部的信息,显然,要执行一次查询,当前servlet已经不能完成此操作,只能把它交给另外一个servlet。但是,以前的request对象中存储的数据将会全部丢失,因为,这是两次不同的请求。

二、请求转发

1、request请求转发

需要建立两个Servlet:

注意事项:配置文件(两个Servlet):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>MyServletname</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletname</servlet-name>
<url-pattern>/abc</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MyServletname1</servlet-name>
<servlet-class>Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletname1</servlet-name>
<url-pattern>/abc1</url-pattern>
</servlet-mapping>
</web-app>

定义Servlet1:MyServlet:(直接访问的是这个Servlet)

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
response.getWriter().write("MyServlet");
RequestDispatcher dispatcher=request.getRequestDispatcher("/abc1");//获取转发器
dispatcher.forward(request,response); }

定义Servlet2:请求转发后跳转到此Servlet:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Servlet2");
}

虽然访问的是MyServlet的地址,但是显示的结果表示Servlet2被访问了,但是地址并不会改变。这也是请求转发与重定向的区别。

三、请求转发和重定向的区别

1、重定向:

(1)解决了表单重复提交(因为用户在请求转发前后访问的是同一个地址,而重定向执行后地址改变,只能提交一次数据)和servlet无法处理当前请求(如淘宝付款时需要请求转发到支付宝)的问题。

(2)重定向的时候因为是两次请求,因此,数据不能存储在request中,可以存储在Cookie中

response.sendRedirect(request.getContextPath() + "/admin/products/list.jsp");

服务器返回给客户端一个响应,告诉客户端必须重新发送一个请求,两次请求之间相互独立。

(3)URL地址会发生改变

2、 请求转发

(1)可以看出,请求转发只需要发起一次请求,与重定向不同,请求转发发生在服务器内部。请求转发后浏览器的地址不会改变。

(2)request可以封装数据

 request.getRequestDispatcher("/admin/products/list.jsp").forward(request,response);

请求转发的时候,数据可以存储在request中。上述代码中可以把request域中的数据请求转发到list.jsp,request域中的数据可以被jsp取出来,从而实现了数据从Servlet到jsp的流动。

request的请求转发的更多相关文章

  1. request实现请求转发

    ServletContext可以实现请求转发,request也可以. 在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常 在forwar ...

  2. javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别

    先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...

  3. Request对象实现请求转发区别

    servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDisp ...

  4. servlet中请求转发(forword)与重定向(sendredirect)的区别

    摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂 servlet请求转发与重定向的区别: request.s ...

  5. 20160326 javaweb 请求转发和请求包含

    (1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...

  6. HttpServletRequest对象请求转发和HttpServletResponse对象请求重定向之间的区别

    HttpServletRequest对象request代表浏览器请求对象,HttpServletResponse对象代表服务器响应对象,当用浏览器访问web服务器,发出请求时,Servlet调用ser ...

  7. 7.java的请求转发和请求重定向

    1.请求重定向:是客户端的行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变,一次新的转发. 2.请求转发:是服务器的行 ...

  8. servlet中请求转发(forword)与重定向(sendredirect)

    请求转发和重定向 request.setAttribute("test","hello"); request.getRequestDispacther(&quo ...

  9. 04_web基础(六)之请求转发与重定向

    1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...

随机推荐

  1. 【Isabella Message】 【SPOJ - ISAB】【模拟】【矩阵的旋转】

    思路 题目链接 题意:题目中先给了一个N阶矩阵样子的字符,后给了一个mask,然后又给出你应该认识的一些单词,最后是让你输出最终字典序最小的一句话. 思路:根据题目要求模拟即可.这里会用到string ...

  2. MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件

    问题引出 ASP.NET Core 默认将 Web.config移除了,将配置文件统一放在了 xxx.json 格式的文件中. 有Web.config时,我们需要读到配置文件时,一般是这样的: var ...

  3. jmeter学习笔记-----第一天

    环境简介:apache-jmeter-3.3    win10系统 一.Jmeter录制操作步骤: 1.工作台---添加HTTP代理服务器: 2.为自己笔记本的浏览器设置相同代理: 3.测试计划下-s ...

  4. Java String引起的常量池、String类型传参、“==”、“equals”、“hashCode”问题 细节分析

    在学习javase的过程中,总是会遇到关于String的各种细节问题,而这些问题往往会出现在Java攻城狮面试中,今天想写一篇随笔,简单记录下我的一些想法.话不多说,直接进入正题. 1.String常 ...

  5. 《Java 8 in Action》Chapter 1:为什么要关心Java 8

    自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(199 ...

  6. Python: 转换文本编码

    最近在做周报的时候,需要把csv文本中的数据提取出来制作表格后生产图表. 在获取csv文本内容的时候,基本上都是用with open(filename, encoding ='UTF-8') as f ...

  7. python requests接口测试系列:连接mysql,获取mysql查询的值作为接口的入参

    主要思路: 连接mysql数据库,这里数据库需要使用Proxifier来设置代理,然后才能正常连接 获取mysql数据库中某一数据,作为接口的参数信息 将接口返回结果保存至csv数据表中 # -*- ...

  8. net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...

  9. JVM中class文件探索与解析

    一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正. 废话不多说,一起来看看JVM中类文件是如何 ...

  10. 牛客暑假多校第二场 K carpet

    题意:给你一个n*m的矩阵 ,每个位置都有一个字符并且都有一个值,现在需要找到一个p*q的子矩阵, 原来的矩阵可以由现在这个矩阵无限复制然后截取其中的一部分得到,并且要求 子矩阵里最大的值 * (p+ ...