gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-02-11 14:35:51 27 4
gpt4 key购买 nike

本文主要讲述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项目中的" / "的不同含义; 。

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

  。

最后此篇关于javaWeb03-请求转发和请求重定向【包含编码格式与路径问题】的文章就讲到这里了,如果你想了解更多关于javaWeb03-请求转发和请求重定向【包含编码格式与路径问题】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com