本文主要讲述javaWeb的请求转发和请求重定向的区别

一. 请求转发

1. 图解

2. 代码示例

  Servlet1的代码示例如下

public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet1收到请求");
req.setAttribute("key","Servlet1盖的章");
req.getRequestDispatcher("/servlet2").forward(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  Servlet2的代码示例如下

public class Servlet2 extends HttpServlet {
@Override
// 请求转发,处理的是同一个请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key = req.getAttribute("key");
System.out.println("Servlet2收到了" + key);
resp.getWriter().write("Servlet2响应的内容");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  浏览器收到响应,显示结果如下

  思考1

  响应response没有设置编码规则,导致默认的编码规则不支持中文字符,验证如下

public class Servlet2 extends HttpServlet {
@Override
// 请求转发,处理的是同一个请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key = req.getAttribute("key");
System.out.println("Servlet2收到了" + key);
System.out.println(resp.getCharacterEncoding());
resp.getWriter().write("Servlet2响应的内容");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  tomcat日志如下

Servlet1收到请求
Servlet2收到了Servlet1盖的章
ISO-8859-1

  由此看出,字符集是ISO-8859-1应该不支持中文字符

  将resp的字符集设置为utf-8,声明如下

resp.setCharacterEncoding("utf-8");

  浏览器收到响应,显示结果如下,仍是乱码

  思考2

  resp响应设置了字符集utf-8,但是浏览器编码格式不是utf-8,而是windos-1252。字符集不相同,导致乱码

  由思考和思考2,引出问题:如何保证浏览器和响应resp的字符集相同呢?

  首先介绍Content-Type

  解决方法

  Servlet2声明如下

public class Servlet2 extends HttpServlet {
@Override
// 请求转发,处理的是同一个请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key = req.getAttribute("key");
System.out.println("Servlet2收到了" + key);
// 解决浏览器与resp响应的编码格式不一致问题:
// 方式一:
resp.setHeader("Content-Type","text/html;charset=utf-8");
// 方式二:
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("Servlet2响应的内容");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

3. 总结

  ① 请求转发,一直是同一个请求【请求的数据可以共享】

  ② 在resp响应浏览器内容时,如果有中文字符,则在响应之前,需要设置content-type,即 resp.setContentType("text/html;charset=utf-8");

二. 请求重定向

1. 图解

2. 代码示例

  Servlet1的代码示例如下

public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet1收到请求");
System.out.println("Servlet1请求重定向给Servlet2");
resp.sendRedirect("/servlet2");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  Servlet2的代码示例如下

public class Servlet2 extends HttpServlet {
@Override
// 请求转发,处理的是同一个请求
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet2收到请求");
System.out.println("请求路径为: ");
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  浏览器收到响应,结果如下

  思考

  请求重定向的路径写的不对,下面解释一下 " / "

  在浏览器中," / "是指 http://localhost:8080,即http://ip地址:端口号

  在web项目中," / "是指http://localhost:8080/javaWeb03,即http://ip地址:端口号/项目名称 

  解决方法

  Servlet1声明如下

public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet1收到请求");
System.out.println("Servlet1请求重定向给Servlet2");// 解决方式1:相对路径
resp.sendRedirect("/javaWeb02/servlet2");
// 解决方式2:绝对路径
resp.sendRedirect("http://localhost:8080/javaWeb02/servlet2");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}

  tomcat日志结果如下

Servlet1收到请求
Servlet1请求重定向给Servlet2
Servlet2收到请求
请求路径为:
http://localhost:8080/javaWeb02/servlet2

3. 总结

  ① 注意浏览器和web项目中的" / "的不同含义;

  ② 请求重定向是浏览器向服务器发了两次请求

  

javaWeb03-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】的更多相关文章

  1. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

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

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

  3. 请求转发 和 URL 重定向

    五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...

  4. getRequestDispatcher 中请求转发和请求包含的使用说明

    getRequestDispatcher() getRequestDispatcher() 包含两个方法,分别是请求转发和请求包含. RequestDispatcher rd = request.ge ...

  5. Servlet(10)—请求转发和请求重定向

    请求转发与请求重定向 ①区别: 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求. 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request ...

  6. JSTL、请求转发和URL重定向

    JSTL 为什么要使用JSTL? 因为在JSP中写JAVA代码很麻烦,而JSTL可以简化在JSp中写JAva代码的流程 如何使用JSTL? 准备工作: ①将JSTL依赖的jar包导入工程的WEB-IN ...

  7. iphone 浏览器自动解析数字为号码解决方法

    iphone 浏览器自动解析数字为号码解决方法 www.MyException.Cn  网友分享于:2015-10-09  浏览:0次   iphone 浏览器自动解析数字为号码解决办法 在工作中遇到 ...

  8. javaWeb中request请求转发和response重定向

    1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL.  2.request.get Forward代码中的&q ...

  9. struts2 中请求转发与请求重定向方法

    本文转自:http://blog.csdn.net/a327736051/article/details/50240491 一.Chain Result:这个result调用另外的一个action,连 ...

  10. JavaWeb中请求转发和请求重定向的区别

    针对于JavaWeb中请求与重定向的一个cheatsheep: 1.转发 1)完成一次转发,用户浏览器发送一次请求 2)转发之后,浏览器URL地址栏不改变(服务器帮忙完成) 3)请求域中数据不丢失 4 ...

随机推荐

  1. PEP8语法规范解释说明

    PEP8规范解析 内容概要: 1.PEP8规范是什么? 2.PEP8相关内容 1.PEP8规范是什么 PEP是Python Enhancement Proposal的缩写,翻译为:"Pyth ...

  2. 关于解决scapy.error.Scapy_Exception: tcpdump is not available. Cannot use filter !报错

    解决办法 sudo apt install tcpdump 后续 我特意没写到我的 arp 攻击那篇文章里面,就是为了水一片文章

  3. C++编程笔记(通信)(win32平台)

    目录 一.初始化网络库 二.socket套接字 2.1服务端 2.2客户端 三.发送.接收数据 3.1发送 3.2接收数据 四.自定义的结构体 4.1 发送端 4.2接收端 IPV6版本套接字的创建 ...

  4. 【Java SE】Day04 IDEA、方法*

    一.IDEA 1.快捷键 Ctrl+Alt+L/Ctrl+Alt+Shift+4:格式化代码 Alt+Insert:自动生成代码 修改快捷键:File->Settings->keymap- ...

  5. 【重难点总结】DMA与kafka零拷贝机制之间的关系

    一.DMA介绍 1.概念 DMA(Direct Memory Access,直接存储器访问) 是一种内存访问技术,独立于CPU, 直接读.写系统存储器.外设等 主存与I/0设备之间使用DMA控制器控制 ...

  6. bug处理记录:com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9)): has to be escaped using backslash to be included in string value at [Source:

    1. 报错: com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 9 ...

  7. 跟我学Python图像处理丨带你入门OpenGL

    摘要:介绍Python和OpenGL的入门知识,包括安装.语法.基本图形绘制等. 本文分享自华为云社区<[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)>,作者:ea ...

  8. linux常用命令精讲

    一.虚拟机三种网卡模式 1 桥接 相当于虚拟机和真机之间架了一座桥 2 NAT 虚拟系统借助 NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网(常用vm8) 3 仅主机 虚拟机和物理机在一 ...

  9. 【运维笔录】局域网实现项目的CI/CD,Docker+Gitea+Drone搭建轻量级自动化部署平台

    一.安装Docker 1.1 安装excpet $ apt-get -f install expect 1.2 编写执行Docker安装脚本 编写docker_dep.exp脚本 #!/usr/bin ...

  10. SAP-FI模块 如何处理自动生成会计凭证增强

    一. 相关问题概览 1. 固定资产业务过渡科目摘要增强功能-F-02     需用表BKPF.BSEG.T001.通过BUKRS.BELNR.GJAHR三个字段相等关联BKPF与BSEG.通过BKPF ...