本文主要讲述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. Java继承Frame画一个窗口显示图片

    将图片显示到窗口上. 在工程目录下准备好图片5.png 运行代码: import javax.imageio.ImageIO; import java.awt.*; import java.awt.e ...

  2. 5、有一行电文,译码规律为: a ——> z b——> y c ——> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变

    /* 有一行电文,译码规律为: a --> z b--> y c --> x. 即把第一个字母变成第26个字母, 第i个字母变成第(26-i+1)个字母, 非字母字符不变 */ #i ...

  3. 【云原生 · Docker】Docker虚拟化技术

    1.Docker入门简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化. 容器是完全使用沙箱 ...

  4. 原来用 MySQL 也可以做全文检索

    我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 有朋友聊到他们的系统中要接入全 ...

  5. layui的table数据匹配问题

    <script> layui.use('table', function () { var table = layui.table; //第一个实例 table.render({ elem ...

  6. C# Math 中的常用的数学运算

    〇.动态库 System.Math.dll 引入动态库 using System.Math;   Math 为通用数学函数.对数函数.三角函数等提供常数和静态方法,使用起来非常方便,下边简单列一下常用 ...

  7. json与字符串的互转

    在spring框架中当ajax请求需要返回json数据时,我们只需要在@RequestMapping后面加上@ResponseBody,即可为我们返回想要的json. 下面我们讲解json与字符串的互 ...

  8. Blazor和Vue对比学习(进阶.路由导航一):基本使用

    Blazor和Vue都是单文件组件SPA,路由的实现逻辑非常相似,页面路径的改变都是组件的切换,但因为各自语言的特性,在实现方式上有较大差异. 一.安装 1.Vue:Router是Vue的一个插件.如 ...

  9. Java学习中实现的功能trick

    1.注册时,不用确认就可以知道用户名是否存在 技术:json+ajax 章节:javaweb->day22json&ajax 2.不常变化的导航栏.城市等信息存入数据库,通过redis做 ...

  10. 【大数据课程】高途课程实践-Day02:利用Hive SQL编写离线数仓实现可视化展示

    〇.概述 1.实现内容 使用Hive SQL编程,构造分层离线数仓 并可以通过Quick Bi进行展示 2.过程 (1)数据接⼊到ODS层 (2)进⾏ODS到DWD层数据开发 (3)进⾏ODS到DIM ...