RequestAndResponse

请求与响应

1. Request

代表请求的对象

1.1 继承结构

ServletRequest(顶级接口):提供了一个request对象的基本功能。
 其下子接口:HTTPServletRequest,在原基础上添加了一些和http相关的方法。

1.2 功能

  1. 获取客户端相关信息的功能
    getContextPath():动态获取当前web应用的访问名称,在写路径时,不能将web应用的路径写死,
    而是需要通过getContextPath方法获取。

  2. 获取请求头信息
    getHeader(String name): 可以根据请求头的key获取value。

  3. 获取请求参数
    getParameter(String name):根据参数的key获取value。
    getParameterValues(String name):根据参数的key返回多个value,返回值为数组。
    getparameterMap():将所有的请求参数放入map中,返回Map<String,String[]>

【中文乱码问题】
浏览器提交的数据是utf-8的编码,服务器默认使用的编码为iso8859-1,这个编码不支持中文。

如果是post提交,请求参数通过请求实体提交,可以设置请求实体内容的编码格式解决:
request.setCharacterEncoding("utf-8");

如果是get请求,可以通过手动编码解决,如:

byte[] bytes=username.getBytes("iso8859-1");
username=new String(bytes,"utf-8");

1.3 实现请求转发

请求转发可以实现资源的跳转,其特点有:

  • 一次请求,一次响应。
  • 地址栏不会发生变化。
  • 请求转发只能在同一个服务器中进行跳转。

代码如下:
request.getRequestDispatcher("request01").forward(request,response);

1.4 作为域对象

域对象:如果一个对象具有一个可以被看见的范围,利用该对象的map可以在整个范围内共享数据。

  • 生命周期:当一次请求开始时创建,一次请求结束时销毁。
  • 作用范围:整个请求链。
  • 功能: 在作用范围内共享数据。

域对象的API:

//想request对象中的map存入一对key-value
setAttribute(String name,Object value)

//根据key获取value
getAttribute(String name)

//根据key删除这个属性
removeAttribute(String name)

2. Response

代表响应的对象

2.1 继承结构

ServletResponse(顶级接口):提供了一个response对象的基本功能。
 其下子接口:HttPServletResponse,在原基础上添加了一些和http相关的方法。

2.2 功能

设置响应内容
- 设置状态码:setStatus(int statusCode);
- 设置响应头:setHeader(String name,String value);
- 设置响应实体内容:getWriter()//字符流 getOutputStream()//字节流

【响应乱码问题】
由于服务器发送的编码和浏览器的解码不一致,字符流服务器默认使用的是iso8859-1,
字节流发送数据时可以指定为utf-8,浏览器读取数据时,默认使用的是平台码,即gbk。
可以指定浏览器读取数据时,使用utf-8读取,同时使用utf-8发送数据即可:

//两者等价
response.setHeader("Content-Type","text/html;charset=utf-8");
response.setContentType("text/html;charset=utf-8");

2.3 请求重定向

请求重定向可以实现资源的跳转,其特点是:

  • 两次请求,两次响应。
  • 地址栏会发生变化。
  • 可以跳转到当前web应用之外的地方。
  • 重定向不能通过request对象共享数据。

代码:response.sendRedirect(request.getContextPath()+"/response01");

2.4 定时刷新

与重定向类似,不同之处是可以指定等待一段时间后跳转。
代码:response.setHeader("refresh","3;url="+request.getContextPath()+"/response01");

3. 资源跳转总结

  1. 请求转发

    • 一次请求,一次响应。
    • 地址栏不变。
    • 只能在web应用内跳转。
    • 可以共享request对象
  2. 请求重定向

    • 两次请求,两次响应。
    • 地址栏会改变。
    • 可以跳转到任意地方。
    • 不能共享request对象。
  3. 定时刷新

    • 两次请求,两次响应。
    • 地址栏会改变。
    • 可以跳转到任意地方。
    • 不能共享request对象。
    • 跳转前会维系一段时间

【一般而言】

  • 在同一个web应用内跳转,需要通过request对象携带数据到目的地-->请求转发。
  • 在同一个web应用内部跳转,地址栏不能发生变化 --> 请求转发。
  • 需要跳转到其他web应用 --> 重定向或者定时刷新,根据是否需要指定多长时间跳转决定。
  • 如果在同一个web应用跳转,没有其他需求,可以选用任意方式跳转。
原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12766759.html