javaWeb03-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】
本文主要讲述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-请求转发和请求重定向【包含浏览器与响应编码格式不一致的解决方法】的更多相关文章
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- 20160326 javaweb 请求转发和请求包含
(1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...
- 请求转发 和 URL 重定向
五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...
- getRequestDispatcher 中请求转发和请求包含的使用说明
getRequestDispatcher() getRequestDispatcher() 包含两个方法,分别是请求转发和请求包含. RequestDispatcher rd = request.ge ...
- Servlet(10)—请求转发和请求重定向
请求转发与请求重定向 ①区别: 本质区别:请求转发只发出一次请求,请求重定向则发出两次请求. 请求转发:地址栏是初次发出请求的地址在最终的Servlet中,request对象和中转的那个request ...
- JSTL、请求转发和URL重定向
JSTL 为什么要使用JSTL? 因为在JSP中写JAVA代码很麻烦,而JSTL可以简化在JSp中写JAva代码的流程 如何使用JSTL? 准备工作: ①将JSTL依赖的jar包导入工程的WEB-IN ...
- iphone 浏览器自动解析数字为号码解决方法
iphone 浏览器自动解析数字为号码解决方法 www.MyException.Cn 网友分享于:2015-10-09 浏览:0次 iphone 浏览器自动解析数字为号码解决办法 在工作中遇到 ...
- javaWeb中request请求转发和response重定向
1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的&q ...
- struts2 中请求转发与请求重定向方法
本文转自:http://blog.csdn.net/a327736051/article/details/50240491 一.Chain Result:这个result调用另外的一个action,连 ...
- JavaWeb中请求转发和请求重定向的区别
针对于JavaWeb中请求与重定向的一个cheatsheep: 1.转发 1)完成一次转发,用户浏览器发送一次请求 2)转发之后,浏览器URL地址栏不改变(服务器帮忙完成) 3)请求域中数据不丢失 4 ...
随机推荐
- 安卓APP和小程序渗透测试技巧总结
安卓APP和小程序渗透测试技巧总结 免责声明: 安卓7以上抓取https流量包 证书信任 首先安装OpenSSL,此步骤不再赘述,可以参考百度. 然后安装模拟器(我使用的是夜神模拟器). 导出需要的证 ...
- SPPS完整版下载安装教程【博主亲测】
SPSS全称Statistical Product and Service Solutions,是一款优秀的数据分析软件,旨在为用户提供专业的统计产品与服务解决方案.SPSS面向行业应用人员所设,被广 ...
- vim-瞬间移动打发
一,常用基本命令 set rnu 显示相对行号 1.ctrl+F 将屏幕向下滚动一屏 2.ctrl+u pageUp,ctrl+d pageDown 3.行内移动:W,b在单词间移动,ge向上跳,f ...
- 关于 Windows6.1-KB2999226-x64.msu 此更新不适用你的计算机解决办法
前言 今天被这个破问题坑了很长时间,网上一大堆扯跳过那个检查,通过提取 cab 文件然后直接用命令安装,我可以明确的告诉你不是那样的解决的,因为我实际用命令装过也装不上(这里我吐槽一下,我猜你最初的问 ...
- 将 Vue.js 项目部署至静态网站托管,并开启 Gzip 压缩
摘要:关于使用 Nginx 开启静态网站 Gzip 压缩的教程已经有很多了,但是好像没几个讲怎么在对象存储的静态网站中开启 Gzip 压缩.其实也不复杂,我们一起来看下~ 本文分享自华为云社区< ...
- CyclicBarrier循环屏障源码解析(基于jdk11)
目录 CyclicBarrier循环屏障源码解析(基于jdk11) 1.1 CyclicBarrier概述 1.2 CyclicBarrier原理 1.2.1 基本结构(jdk11) 1.2.2 aw ...
- 聚焦技术,锐意创新,GaussDB给世界一个更优选择
摘要:从整个行业应用层面来看,现在,数据库的国产化时代已经到来. 本文分享自华为云社区<聚焦技术,锐意创新,GaussDB给世界一个更优选择>,作者: GaussDB数据库. 今天,以&q ...
- MongoDB - 模式设计
注意事项 模式设计,即在文档中表示数据的方式,对于数据表示来说时非常关键的. 为 MongoDB 做模式设计时,在性能.可伸缩性和简单性方面是重中之重,也需要考虑一些特别的注意事项. 限制条件 与常见 ...
- APICloud AVM框架列表组件list-view的使用、flex布局教程
avm.js 是APICloud 推出的多端开发框架.使用 avm.js 一个技术栈可同时开发 Android & iOS 原生 App.小程序和 iOS 轻 App,且多端渲染效果统一:全新 ...
- 聊一聊 SQLSERVER 的行不能跨页
一:背景 1. 讲故事 相信有很多朋友在学习 SQLSERVER 的时候都听说过这句话,但大多都是记忆为主,最近在研究 SQLSERVER,所以我们从 底层存储 的角度来深入理解下. 二:理解数据页 ...