• Servlet续(HttpServletRequest类和HttpServletResponse类)


    一、HttpServletRequest 类

    1.1、HttpServletRequest 类有什么作用

    每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

    1.2、HttpServletRequest 类的常用方法

    getRequestURI(): 获取请求的资源路径

    getRequestURL() :获取请求的统一资源定位符(绝对路径)

    getRemoteHost() :获取客户端的 ip 地址

    getHeader() :获取请求头

    getParameter() :获取请求的参数

    getParameterValues() :获取请求的参数(多个值的时候使用)

    getMethod() :获取请求的方式 GET 或 POST

    setAttribute(key, value):设置域数据

    getAttribute(key):获取域数据

    getRequestDispatcher() :获取请求转发对象

    表单:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="http://localhost:9090/testServlet2/parameterServlet" method="get">
            用户名:<input type="text" name="username"><br/>
            密码:<input type="password" name="password"><br/>
            兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
            <input type="checkbox" name="hobby" value="java">Java
            <input type="checkbox" name="hobby" value="js">JavaScript<br/>
            <input type="submit">
        </form>
    </body>
    </html>
    

    java 代码:

    public class ParameterServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取请求参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String hobby = req.getParameter("hobby");
    //        String[] hobbies = req.getParameterValues("hobby");
    
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
            System.out.println("兴趣爱好:" + hobby);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置请求体的字符集为UTF-8 ,从而解决post请求的中文乱码问题
            //只有在获取参数前使用才有效,即使是先获取密码也不行
            req.setCharacterEncoding("UTF-8");
            //获取请求参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String hobby = req.getParameter("hobby");
    //        String[] hobbies = req.getParameterValues("hobby");
    
            System.out.println("用户名:" + username);
            System.out.println("密码:" + password);
            System.out.println("兴趣爱好:" + hobby);
        }
    }
    

    1.3、请求的转发

    什么是请求的转发?

    请求转发是指,服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发。

    Servlet1 的代码:

    public class Servlet1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.
            String username = req.getParameter("username");
            System.out.println("在Servlet中查看参数:" + username);
    
            //2.
            req.setAttribute("key", "Servlet操作过");
    
            //3.
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
    
            //4.
            requestDispatcher.forward(req, resp);
        }
    }
    

    Servlet2 的代码:

    public class Servlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.
            String username = req.getParameter("username");
            System.out.println("在Servlet2中查看参数:" + username);
    
            //2.
            Object key = req.getAttribute("key");
            System.out.println("Servlet1是否操作:" + key);
    
            //3.
            System.out.println("Servlet2处理……");
        }
    }
    

    1.4、base 标签

    <!DOCTYPE html>
    <html lang="zh_CN">
    <head>
        <meta charset="UTF-8">
        <title>Title</title> 
        <!--base标签设置页面相对路径工作时参照的地址href属性就是参数的地址值 -->
        <base href="http://localhost:8080/07_servlet/a/b/">
    </head>
    <body>
        这是a下的b下的c.html页面<br/>
        <a href="../../index.html">跳回首页</a><br/>
    </body>
    </html>
    

    1.5、Web 中的相对路径和绝对路径

    在 javaWeb 中,路径分为相对路径和绝对路径两种:

    相对路径:

    • .     表示当前目录
    • ..     表示上一级目录
    • 资源名     表示当前目录/资源名

    绝对路径:

    在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。

    1、绝对路径

    2、base+相对

    1.6、web 中 / 斜杠的不同意义

    在 web 中 / 斜杠 是一种绝对路径。

    / 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/

    1. <a href="/">斜杠</a>
      

    / 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径

    1. <url-pattern>/servlet1</url-pattern> 
      
    2. servletContext.getRealPath("/"); 
      
    3. request.getRequestDispatcher("/");
      

    二、HttpServletResponse 类

    2.1、HttpServletResponse 类的作用

    HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置。

    2.2、两个输出流的说明

    字节流 getOutputStream():常用于下载(传递二进制数据)

    字符流 getWriter():常用于回传字符串(常用)

    两个流同时只能使用一个。

    使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。

    2.3、如何往客户端回传数据

    要求 : 往客户端回传字符串、数据。

    public class Response extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //往客户端回传数据
            PrintWriter writer = resp.getWriter();
            writer.write("我爱祖国");
        }
    }
    

    2.4、响应的乱码问题

    第一种方案(不推荐使用):

    第二种方案:

    public class Response extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置服务器字符集为UTF-8
    //        resp.setCharacterEncoding("UTF-8");
            //通过响应头,设置浏览器也使用UTF-8
    //        resp.setHeader("Content-Type", "text/html; charset=UTF-8");
    
            //它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
            //此方法一定要在获取流对象之前调用才能有效
            resp.setContentType("text/html; charset=UTF-8");
    
            //往客户端回传数据
            PrintWriter writer = resp.getWriter();
            writer.write("我爱祖国");
        }
    }
    

    2.5、请求重定向

    请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。

    请求重定向的第一种方案:

    请求重定向的第二种方案:

    public class Response1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置响应状态码302,表示重定向(已搬迁了)
    //        resp.setStatus(302);
            //设置响应头,说明新的地址在哪里
    //        resp.setHeader("Location", "http://www.baidu.com");
            resp.sendRedirect("http://www.baidu.com");
        }
    }
    
  • 相关阅读:
    Emacs for OIer 的一些配置
    CF1336E Chiori and Doll Picking 【线性代数,组合计数】
    CF605E Intergalaxy Trips 【贪心,动态规划,期望】
    Luogu6329 【模板】点分树 | 震波
    [SDOI2014]数表
    [BZOJ4403]序列统计
    [BZOJ5099]Pionek
    SP1812 LCS2
    SA & SAM
    [HAOI2016]找相同字符
  • 原文地址:https://www.cnblogs.com/xiaoran991/p/12661364.html
Copyright © 2020-2023  润新知