300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Request(请求)和 Response(响应)

Request(请求)和 Response(响应)

时间:2023-01-03 00:14:29

相关推荐

Request(请求)和 Response(响应)

Request:获取请求数据Respone:设置响应数据

Request

Request 继承体系

1.Tomcat 需要解析请求数据,封装为 request 对象 ,并且创建 request 对象传递到service对象方法中。

2.使用 request 对象,查阅 JavaEE API文档的 HttpServletRequest 接口。

Request 获取请求数据

请求数据分为 3 部分

1.请求行:

获取请求方式:GET

String getMethod()

获取虚拟目录(项目访问路径):/request-demo

String getContextPath()

获取URL(统一资源定位符):http://localhost:8080/request-demo/req1

StringBuffer getRequestURL()

获取URI(统一资源标识符):/request-demo/req1

String getRequestURI()

获取请求参数(GET方式):username=zhangsan&password=123

String getQueryString()

2.请求头

所以根据请求头名称获取对应值的方法为:

String getHeader(String name)

3.请求体

对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:

获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法

ServletInputStream getInputStream()该方法可以获取字节

获取字符输入流,如果前端发送的是纯文本数据,则使用该方法

BufferedReader getReader()

Request 通过方式获取请求数据

GET 方式

String getQueryString()

POST 方式

BufferedReader getReader()

思考:GET 请求方式和 POST 请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet 和doPost 方法内

request对象为我们提供了如下方法:

获取所有参数Map集合

Map<String,String[]> getParameterMap()

根据名称获取参数值(数组)

String[] getParameterValues(String name)

根据名称获取参数值(单个值)

String getParameter(String name)

使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义如下格式:

不管是GET还是POST请求,在发送的请求参数中如果有中文,在后台接收的时候,都会出现中文乱码的问题。

解决方案:

POST:设置输入流的编码

req.setCharacterEncoding("UTF-8");

通用方式(GET/POST):先编码,再解码

new String(username.getBytes("ISO-8859-1"),"UTF-8");

/*** 中文乱码问题解决方案*/@WebServlet("/req4")public class RequestDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解决乱码:POST,getReader()//request.setCharacterEncoding("UTF-8");//设置字符输入流的编码//2. 获取usernameString username = request.getParameter("username");System.out.println("解决乱码前:"+username);//3. GET,获取参数的方式:getQueryString// 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1/* //3.1 先对乱码数据进行编码:转为字节数组byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);//3.2 字节数组解码username = new String(bytes, StandardCharsets.UTF_8);*/username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);System.out.println("解决乱码后:"+username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

另外需要说明一点的是Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8

请求转发

请求转发(forward):一种在服务器内部的资源跳转方式。

实现方式:

req.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发资源间共享数据:使用 Request 对象

此处主要解决的问题是把请求从/req5转发到/req6的时候,如何传递数据给/req6

需要使用request对象提供的三个方法:

1.存储数据到request域[范围,数据是存储在request对象]中

void setAttribute(String name,Object o);

2.根据key获取值

Object getAttribute(String name);

3.根据key删除该键值对

void removeAttribute(String name);

请求转发的特点

浏览器地址栏路径不发生变化

虽然后台从/req5转发到/req6,但是浏览器的地址一直是/req5,未发生变化

只能转发到当前服务器的内部资源

不能从一个服务器通过转发访问另一台服务器

一次请求,可以在转发资源间使用request共享数据

虽然后台从/req5转发到/req6,但是这个只有一次请求

Respone

Respone 设置相应数据功能介绍

相应数据分为3部分:

1.相应行:

对于响应头,比较常用的就是设置响应状态码:

void setStatus(int sc);

2.相应头:

设置响应头键值对:

void setHeader(String name,String value);

3.响应体:

对于响应体,是通过字符、字节输出流的方式往浏览器写,

获取字符输出流:

PrintWriter getWriter();

获取字节输出流

ServletOutputStream getOutputStream();

Respone完成重定向

重定向(Redirect):一种资源跳转方式

实现方式:

resp.setStatus(302);resp.setHeader("location","资源B的访问路径");//简化重定向方法response.sendRedirect("资源B的访问路径");

重定向的特点:

浏览器地址栏路径发送变化可以重定向到任何位置的资源(服务内容、外部均可)两次请求,不能在多个资源使用request共享数据

路径问题

问题1:明确路径谁实用

浏览器使用:需要加虚拟目录(项目访问路径)服务端使用:不需要加虚拟目录

练习:

<a href='路劲'><form action='路径'>req.getRequestDispatcher(“路径”)resp.sendRedirect(“路径”)

答案:

1.超链接,从浏览器发送,需要加2.表单,从浏览器发送,需要加3.转发,是从服务器内部跳转,不需要加4.重定向,是由浏览器进行跳转,需要加。

动态获取虚拟目录

String contextPath = request.getContextPath();response.sendRedirect(contextPath+"/resp2");

Response 响应字符数据

使用:

通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();通过字符输出流写数据: writer.write("aaa");

注意:

该流不需要关闭,随着相应结束,response对象销毁,该服务器关闭。中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1

resp.setContentType("text/html;charset=utf-8");

Response 响应字符数据

使用:

通过Response对象获取字节输出流: ServletOutputStream outputStream = resp.getOutputStream();通过字节输出流写数据: outputStream.write(字节数据);

IOUtils 工具类使用

1.导入坐标

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>

2.使用

//fis:输入流//os:输出流IOUtils.copy(fis,os);

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。