首页 > 编程语言 >javaWeb03-请求转发和请求重定向【包含编码格式与路径问题】

javaWeb03-请求转发和请求重定向【包含编码格式与路径问题】

时间:2023-02-11 12:22:58浏览次数:48  
标签:Servlet2 请求 ServletException Servlet1 resp req 转发 javaWeb03

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

一. 请求转发

1. 图解

vip

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 {

    }
}

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

vip

 

  思考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");

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

vip

  思考2

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

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

  首先介绍Content-Type

vip

  解决方法

  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. 图解

vip

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 {

    }
}

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

vip

  思考

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

  在浏览器中," / "是指 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项目中的" / "的不同含义;

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

  

 

标签:Servlet2,请求,ServletException,Servlet1,resp,req,转发,javaWeb03
From: https://www.cnblogs.com/zwgitOne123/p/17111194.html

相关文章

  • L8_用日语请求对方慢一点
    概述对方日语表达比较快,可以采用下面的句子让对方慢下来:ゆっくり話してください说话慢一点动画会话隣いい?え?はいありがとう。留学(りゅうがくせい)なの?す......
  • Promise封装AJAX请求
         复制可用//接口地址:http://poetry.apiopen.top/sentences(随机获取一句诗词)//新建一个Promise对象constPro=newPromise(......
  • 手写一个带拦截器的ajax请求
    ajax<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewpor......
  • vue 开启socket请求
    https://blog.csdn.net/sumikk/article/details/126454676?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-......
  • java防止频繁请求、重复提交(防抖动)
    在客户端网络慢或者服务器响应慢时,用户有时是会频繁刷新页面或重复提交表单的,这样是会给服务器造成不小的负担的,同时在添加数据时有可能造成不必要的麻烦。自定义注解/......
  • SpringMVC获取请求参数
    目录通过ServletAPI获取通过控制器方法的形参获取请求参数@RequestParam@RequestHeader@CookieValue通过POJO获取请求参数解决获取请求参数的乱码问题通过ServletAPI获取......
  • 解决 413 Request Entity Too Large(请求实体太大)
    一、问题在上传视频时,接口报错 413RequestEntityTooLarge  二、原因分析Nginx默认最大能够上传1MB文件,大于1MB的文件自然无法上传,打开nginx.conf,在http{}中......
  • Spring Cloud Zuul 获取当前请求的路由信息和路由后端的服务节点信息
    基本思路参考spring-cloud-zuul-ratelimit开源项目,在过滤器中根据当前的请求路径,判断当前的路由信息,当取得路由信息后,可以对服务的调用次数做统计等操作。具体实现创建......
  • vue课程75 axios是只专注于网络请求的库
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"conte......
  • 76、路径映射和转发(forward)的注意事项
    当我们使用路径映射时packagecom.gulimall.authserver.config;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servl......