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");
    }
}
posted @ 2020-04-08 17:34  小燃、  阅读(392)  评论(0编辑  收藏  举报