request的请求转发
一、重定向
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的请求转发的更多相关文章
- request实现请求转发
ServletContext可以实现请求转发,request也可以. 在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常 在forwar ...
- javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别
先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...
- Request对象实现请求转发区别
servlet请求转发与重定向的区别: request.setAttribute("test","hello"); request.getRequestDisp ...
- servlet中请求转发(forword)与重定向(sendredirect)的区别
摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂 servlet请求转发与重定向的区别: request.s ...
- 20160326 javaweb 请求转发和请求包含
(1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...
- HttpServletRequest对象请求转发和HttpServletResponse对象请求重定向之间的区别
HttpServletRequest对象request代表浏览器请求对象,HttpServletResponse对象代表服务器响应对象,当用浏览器访问web服务器,发出请求时,Servlet调用ser ...
- 7.java的请求转发和请求重定向
1.请求重定向:是客户端的行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变,一次新的转发. 2.请求转发:是服务器的行 ...
- servlet中请求转发(forword)与重定向(sendredirect)
请求转发和重定向 request.setAttribute("test","hello"); request.getRequestDispacther(&quo ...
- 04_web基础(六)之请求转发与重定向
1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...
随机推荐
- 在centos6系列vps装Tomcat8.0
In the following tutorial you will learn how to install and set-up Apache Tomcat 8 on your CentOS 6 ...
- 【记忆化搜索】掷骰子 hpuoj
B. 掷骰子 单点时限: 2.0 sec 内存限制: 512 MB 骰子,中国传统民间娱乐用来投掷的博具,早在战国时期就已经被发明. 现在给你 n 个骰子,求 n 个骰子掷出点数之和为 a 的概率是多 ...
- neural_transfer风格迁移
ContentLoss 首先是要定义一个内容差异损失函数,这里直接调用functional.mse_loss(input,self.target)就可以计算出其内容差异损失. 注意这里一般是定义一个网 ...
- 网页如何设置favicon.ico
1.首先制作ico图,并命名favicon.ico 2.将文件放在项目的根目录下
- ubuntu16.04安装Ros(kinetic版本)【亲测好用】
准备 1.ubuntu16.04 64位桌面版 ps:关于系统的下载和安装这里不做介绍,请自行百度,不是介绍重点 2.更改源 图上的几个勾默认是选上的,如果没有选上,选成上图这样(如果修改过勾,点击关 ...
- spring-boot-plus集成Spring Boot Admin管理和监控应用(十一)
spring-boot-plus集成Spring Boot Admin管理和监控应用 spring boot admin Spring Boot Admin用来管理和监控Spring Boot应用程序 ...
- net core Webapi基础工程搭建(七)——小试AOP及常规测试_Part 2
目录 前言 引入 自定义属性 测试 小结 前言 前一篇讲到了中间层的使用,可能不是那么AOP,今天主要来说下一个轻量级的AOP第三方类库AspectoCore. 简单介绍下这个类库,AspectCor ...
- python+Selenium-字符运行报错问题
最近开始接触自动化测试,在写一个简单的查询脚本时,遇到编码无法识别的问题 SyntaxError: Non-ASCII character '\xe5' in file F:/soft_Test/py ...
- go 学习笔记之详细说一说封装是怎么回事
关注公众号[雪之梦技术驿站]查看上篇文章 猜猜看go是不是面向对象语言?能不能面向对象编程? 虽然在上篇文章中,我们通过尝试性学习探索了 Go 语言中关于面向对象的相关概念,更确切的说是关于封装的基本 ...
- LiteORM-For-DotNet,我的第一个开源库
这是一个DotNet轻量级ORM框架,解决C#.Net开发过程中重复繁琐的数据库CURD操作. 前言 因工作中接手的.net项目,源码里面都用了动软代码生成的源码做为数据库操作类库.其中,有些根本就没 ...