一篇让你了解Request和Response

Request&Response

第一章-Request

一、Request概述

什么是Request?

​ request这个对象不用事先声明,就可以在JSP网页中使用,在编译为Servlet之后,它会转换为javax.servlet.http.HttpServletRequest形态的对象,HttpServletRequest对象是有关于客户端所发出的请求的对象,只要是有关于客户端请求的信息,都可以藉由它来取得,例如请求标头、请求方法、请求参数、客户端IP,客户端浏览器等等信息。

HttpServletRequest类

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

常用方法
方法描述
getParameterNames()取得客户端所发出的请求参数名称
getParameter()可以让您指定请求参数名称,以取得对应的设定值
getServerName()获取请求的服务器
getProtocol()获取使用协议
getMethod()获取请求方式(GET/POST)
getServerPort()获取请求的端口号
getContextPath()获取Context路径
getServletPath()获取Servlet路径
getRequestURI()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getQueryString()获的请求参数
getRemoteAddr()获取使用者主机IP
getRemotePort()获取使用者使用的端口号
@WebServlet("/demo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request对象
        //获取请求行的信息:
        //获取请求方法
        String method = request.getMethod();
        System.out.println(method);

        //获取请求的客户端的IP地址
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);

        //获取请求的URI路径: 统一资源标识符,没有包含主机名
        String uri = request.getRequestURI();
        System.out.println(uri);

        //获取请求的url路径: 统一资源定位符,包含主机地址的
        String url = request.getRequestURL().toString();
        System.out.println(url);

        //获取项目的部署路径(虚拟路径)
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        
        //使用request获取请求头的信息: getHeader(name)
        //有一个请求头的key叫做user-agent: 客户端的信息
        String header = request.getHeader("user-agent");
        System.out.println(header);
    }
}

二、获得请求参数

方法
方法描述
String getParameter(String name)获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack
String[] getParameterValues(String name)获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码
Map<String,String[]> getParameterMap()获得所有的请求参数。key为参数名,value为key对应的所有的值。
代码
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用request获取请求参数:
        //根据一个参数名获取一个参数值
        String username = request.getParameter("username");
        System.out.println(username);

        //根据一个参数名获取多个参数值
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }

        //3. 使用一个方法获取所有的请求参数: 所有请求参数肯定就是多个键值对,
        //多个键值对肯定要存储在Map集合中,从集合中获取键和值
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> keys = parameterMap.keySet();
        for (String key : keys) {
            String[] values = parameterMap.get(key);
            for (String value : values) {
                System.out.println(key + ":" + value);
            }
        }
    }
}
请求参数乱码处理

我们在输入一些中文数据提交给服务器的时候,服务器解析显示出来的一堆无意义的字符,就是乱码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tla8gLUd-1606637520211)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129151830327.png)]

		//在获取请求参数之前解决post方式的中文乱码问题
        request.setCharacterEncoding("UTF-8");

三、请求转发

方法
request.getRequestDispatcher(url).forward(request, response);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eqF8k6a-1606637520213)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129154538833.png)]

特征
  • 跳转操作是由服务器执行的,所以客户端地址栏不会发生变化
  • 跳转操作不会发起新的请求
  • 可以跳转到WEB-INF中的资源,但是不能跳转到其它项目的资源
注意
  1. 如果在Servlet01中请求转发到Servlet02,那么在Servlet01中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由Servlet02来完成;如果是使用请求包含,那么没有这个限制
  2. 请求转发虽然不能输出响应体,但还是可以设置响应头的例如response.setContentType(”text/html;charset=utf-8”)
  3. 请求包含大多是应用在JSP页面中,完成多页面的合并
  4. 请求转发大多是应用在Servlet中,转发目标大多是JSP页面

四、作为域对象

概念

request对象作为域对象向存取数据,它的作用范围是一次请求中,和请求转发一起使用

方法
  1. setAttribute(name,value)往域对象中存数据
  2. getAttribute(name)从域对象中获取数据
  3. removeAttribute(String name) 从域对象中删除数据
代码
@WebServlet("/demo03")
public class Demo03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String nickname = "川建国";
        //使用request域对象将nickname存进去
        //request域对象的使用范围是:一次请求
        request.setAttribute("nickname",nickname);

        //请求转发跳转到Demo04
        request.getRequestDispatcher("/demo04").forward(request, response);
    }
}


@WebServlet("/demo04")
public class Demo04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //在Demo04中获取Demo03中的那个nickname
        //从request域对象中取出nickname
        String nickname = (String) request.getAttribute("nickname");
        System.out.println("获取的nickname的值是:" + nickname);
    }
}

第二章-Response

一、Response概述

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

二、操作响应行、头、体

操作响应行
  1. API:response.setStatus(int code);

  2. 常见的响应状态码:

    • 200 成功
    • 302 重定向
    • 304 读缓存
    • 404 客户端错误
    • 500 服务器错误
操作响应头
  1. API:setHeader(String name,String value);

  2. 常用的响应头 :

    Refresh: 定时跳转 (eg:服务器告诉浏览器5s之后跳转到百度)

    Location:重定向地址(eg: 服务器告诉浏览器跳转到xxx)

    Content-Disposition: 告诉浏览器下载

    Content-Type:设置响应内容的MIME类型(服务器告诉浏览器内容的类型)

操作响应体
1. API:
  - response.getWriter()获取字符输出流
  - response.getOutputStream()获取字节输出流
  - writer.write()/print()输出字符串解决响应数据的中文乱码:
  - response.setContentType("text/html;charset=UTF-8")

三、请求重定向

概念:

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端,我给你新的地址,你去新地址访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYdXOw7Z-1606637520215)(C:\Users\Linkin Park\AppData\Roaming\Typora\typora-user-images\image-20201129160415361.png)]

代码
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo05被访问了");

        req.setAttribute("key", "value");

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

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

四、重定向与请求转发的区别

重定向的特点:
  1. 重定向的跳转是由浏览器发起的,在这个过程中浏览器会发起两次请求
  2. 重定向跳转可以跳转到任意服务器的资源,但是无法跳转到WEB-INF中的资源
  3. 重定向跳转不能和request域对象一起使用
  4. 重定向跳转浏览器的地址栏中的地址会变成跳转到的路径
请求转发的特点:
  1. 请求转发的跳转是由服务器发起的,在这个过程中浏览器只会发起一次请求

  2. 请求转发只能跳转到本项目的资源,但是可以跳转到WEB-INF中的资源
    t(“http://localhost:8080”);
    }






### 四、重定向与请求转发的区别

#### 重定向的特点:

1. 重定向的跳转是由浏览器发起的,在这个过程中浏览器会发起两次请求
2. 重定向跳转可以跳转到任意服务器的资源,但是无法跳转到WEB-INF中的资源
3. 重定向跳转不能和request域对象一起使用
4. 重定向跳转浏览器的地址栏中的地址会变成跳转到的路径

#### 请求转发的特点:

1.  请求转发的跳转是由服务器发起的,在这个过程中浏览器只会发起一次请求

  2.  请求转发只能跳转到本项目的资源,但是可以跳转到WEB-INF中的资源
  3.  请求转发可以和request域对象一起使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值