100_JavaWeb_Servlet3_HttpServletRequest_HttpServletResponse

举报
alexsully 发表于 2021/07/20 14:19:40 2021/07/20
【摘要】 HttpServletRequest_HttpServletResponse

HttpServletRequest 类作用
Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中然后传递到 service 方法(doGet 和 doPost),
可以通过 HttpServletRequest 对象,获取到所有请求的信息

HttpServletRequest 类的常用方法
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii. getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象

public class HttpServletRequestTest1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //   i.getRequestURI()					获取请求的资源路径
        System.out.println(request.getRequestURI()); //TomcatTest2/httpservletrequesttest1
        //   ii.getRequestURL()					获取请求的统一资源定位符(绝对路径)
        System.out.println(request.getRequestURL()); //http://localhost:8080/TomcatTest2/httpservletrequesttest1

        //   iv.getHeader()						获取请求头
        System.out.println(request.getHeader("User-agent"));
        //   vii.getMethod()					获取请求的方式GET或POST
        System.out.println(request.getMethod());

        //   iii.getRemoteHost()				获取客户端的ip地址
        System.out.println(request.getRemoteHost());

        /**
         * 在IDEA中,使用localhost访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在IDEA中,使用127.0.0.1访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在IDEA中,使用 真实ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
         */
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
        // 也要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        System.out.println("-------------doPost------------");

        // 获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(username); // 用户名
        System.out.println(password); // 密码
        System.out.println(Arrays.asList(hobbies)); // 选中的选项

    }
}


请求的转发 : 服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发
特点:
1 浏览器地址没有变化
2 他们是一次请求,共享Request域中的数据
3 可以转发到 WEB-INFO目录下,但是不能转发到工程以外的资源 (公网网站 NG)

public class Servlet1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设定字符集
        request.setCharacterEncoding("UTF-8");

        // 1 获取请求参数
        String username = request.getParameter("username");
        System.out.println("servlet1 的请求参数: " + username);

        // 2 打个标记
        request.setAttribute("key_servlet1", "alex");

        // 3 转发地址
        // RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/form2.html"); // 浏览器不能直接访问,请求转发可以访问
        //  RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com");  只能在工程内转发
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");

        // 4 转发
        requestDispatcher.forward(request, response);

    }
}
public class Servlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1 查看请求参数
        String username = request.getParameter("username");
        System.out.println("servlet2 的请求参数: " + username);

        // 2 查看 request 标记
        System.out.println(request.getAttribute("key_servlet1"));

        // 3 处理自身业务
        System.out.println("servlet2 自身业务");
    }
}

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/">  <!-- 如果有base标签浏览器会忽略掉当前浏览器地址, 同时资源名可以省略 -->
</head>
<body>
    这是a下的b下的c.html页面<br/>
    <a href="../../index.html">跳回首页</a><br/>
</body>
</html>


在javaWeb中,路径分为相对路径和绝对路径两种:
相对路径是:
.       表示当前目录
..      表示上一级目录
资源名  表示当前目录/资源名

绝对路径:
http://ip:port/工程路径/资源路径

web 中 / 是一种绝对路径;有不同意义 

/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/"> 斜杠 </a>

/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
<url-pattern>/servlet1</url-pattern>
servletContext.getRealPath(“/”);
request.getRequestDispatcher(“/”);

特殊情况重定向: response.sendRediect(“/”); 把斜杠发送给浏览器解析,得到 http://ip:port 


HttpServletResponse 类

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

b)两个输出流的说明。
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则就会报错

public class Servlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // System.out.println( resp.getCharacterEncoding() );//默认ISO-8859-1
        // 1 通过响应头,设置浏览器也使用UTF-8字符集
        response.setHeader("Content-Type", "text/html; charset=UTF-8");

        // 2 通过 setContentType 设置服务器和客户端都使用UTF-8字符集,还设置了响应头 此方法一定要在获取流对象之前调用才有效
        response.setContentType("text/html; charset=UTF-8");

        //3  回传
        PrintWriter writer = response.getWriter(); // 回传字符
//        ServletOutputStream outputStream = response.getOutputStream();  // 回传字节
        writer.write("alex-sully");
    }
}

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

 请求重定向的特点:
1 浏览器地址栏会发生变化
2 两次请求,不能共享request域中的数据
3 不能访问WEB-INFO下的资源,可以访问工程外的资源

请求重定向方案
// 1 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080")


//2 请求重定向的第二种方案(推荐使用):
resp.sendRedirect("http://localhost:8080")

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("曾到此一游 Response1 ");

        req.setAttribute("key1", "value1");

        // 设置响应状态码302 ,表示重定向,(已搬迁)
//        resp.setStatus(302);
        // 设置响应头,说明 新的地址在哪里
//        resp.setHeader("Location", "http://localhost:8080/07_servlet/response2");
//        resp.setHeader("Location", "http://localhost:8080");

        resp.sendRedirect("http://localhost:8080");
    }



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。