Java – Servlet – Request与Response

简介

在Http应用程序中,网页与服务器之间的互动需要产生数据传输,在Servlet中,提供ServletRequest和servletResponse接口。

 

ServletRequest

Request是浏览器向服务器请求数据时所包装的数据,我们可以通过获取Request获得浏览器向服务器请求的数据。

ServletRequest 是由Java提供的请求对象根接口,Java还提供了对Http协议封装的请求对象接口HttpServletRequest,该接口继承ServletRequest接口。

Tomcat通过定义实现类,对HttpServletRequest接口实现方法RequestFacade,Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中,request对象实现了HttpServletRequest接口的方法。

 

请求行

请求行指请求时的标准请求字串,由方法、URI、HTTP版本组成,如

GET /request/req1?username=zs HTTP/1.1

可通过以下方法获取信息

// 获取请求方式 => GET
String getMethod();

// 获取虚拟目录(项目访问路径) => request
String getContextPath();

// 获取URL => http://localhost:8080/request/req1
StringBuffer getRequestURL();

// 获取URI => /request-demo/req1
String getRequestURI();

// 获取请求参数(GET方式) => username=zs
String getQueryString();

 

请求头

对一个请求中的头信息,如

User-agent:Mozilla/5.0 Chrome/91.0.4472.106

可通过以下方法获取头信息

// 根据请求头名称,获取值
String getHeader(String name);

 

请求体(POST)

POST中的请求和GET不一样,GET中获取请求参数可使用 getQueryString() 方法获得,但因为POST具有数据多样性,它既可以传文本类型的数据,也可以传字节类型的数据,且数据量可以很大,因此需要使用另一种方法获取请求参数,POST使用数据流的方式进行数据获取。

// 获取字节输入流
ServletInputStream getInputStream()

// 获取字符输入流
BufferedReader getReader();

 

通用获取参数值

上面我们可知,我们可以通过getQueryString和getReader.readLine 来获取从浏览器端请求过来的参数,Servlet 其实为我们封装了一种更好的方法让我们获取。

我们知道,参数的结构由 key 和 value 组成,因此Servlet 则把请求参数以

Map<String,String[]> 集合的形式进行了封装。

获取所有参数Map集合
Map<String,String[]> getParameterMap();

Servlet会把参数的字段作为key,把参数字作为value,并保存在Map集合中

因为Map集合具有key唯一性的原因,如果Servlet遇到相同Key字段时,如

/req?username=zs&fav=1&fav=2&fav=3

Servlet 会把相同字段的值结合成一个数组,如

{
username=zs. 
fav = {1,2,3}
}

所以Map集合的value值泛型为String[]数组的原因。

 

另外,Servlet还支持通过key取得数组参数或单个非数组参数。

// 根据名称获取参数值(数组)
String[] getParameterValues(String name);

// 根据名称获取参数值(单个值)
String getParameter(String name)

 

中文参数乱码

产生原因:网页通常以UTF-8编码进行存储,所提交的数据也将编码成UTF-8,当传到Servlet时,Servlet则默认以【iso-8859-1】进行解码,导致乱码,在Tomcat8.0之后,已将GET请求乱码问题解决。

 

对于POST的数据而言,POST数据作为字节数据到达Servlet时,Servlet默认以【iso-8859-1】进行解码,可以通过自定义字符集进行解码

req.setCharacterEncoding("utf-8");

 

对于GET的数据而言,就比较特殊了。

因为GET 数据在URL上,所以中文数据会被url编码,如果网页是UTF-8,那么中文被url编码成UTF-8数据

以上图为例,UTF-8存储中文需要3个字节,因此【张三】被url编码后,则是6个字节,Servlet接收后却以【iso-8859-1】进行解码。

Servlet中对于GET方法传入的参数,没有自定义字符集解码的方法,但我们可以通过先把接收到的数据以【iso-8859-1】进行编码,再以【UTF-8】进行解码即可。

// 取得参数数据
String username = request.getParameter("username");
// 以iso-8859-1进行编码
byte[] data = username.getBytes(StandardCharsets.ISO_8895_1);
// 再以UTF-8进行解码
username = new String(data, StandardCharsets.UTF_8);

 

请求转发

Servlet 的 Request 可以在服务器内部进行跳转,把A对象接收到的Request转发给B对象进行处理。

// 把requset转发给 B
requset.getRequestDispatcher("资源B路径").forward(request,response);

同时A在转发requset给B之前,也可以进行一定的加工,类似于流水线那样,A处理一部分然后转发给B处理。

请求转发资源前,可以通过以下三种方法对requset里的数据进行变更

// 存储数据到 requset
void setAttribute(String name,Object o)

// 根据key,获取值
Object getAttribute(String name)

// 根据key 删除该值
void removeAttribute(String name)

注意:

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

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

3.一次请求,可以在转发的资源间使用requset共享数据。

 

ServletResponse

Response是浏览器向服务器请求数据时所包装的数据,我们可以通过设置Response数据向浏览器发回响应的数据。

ServletResponse 是由Java提供的请求对象根接口,Java还提供了对Http协议封装的请求对象接口HttpServletResponse,该接口继承ServletResponse接口。

Tomcat通过定义实现类,对HttpServletResponse接口实现方法ResponseFacade,Tomcat需要响应浏览器请求,封装为Response对象,并且创建Response对象传递到service方法中,Response对象实现了HttpServletResponse接口的方法。

 

响应行

响应行由三部分组成,分别是HTTP版本,状态码,和状态描述

HTTP/1.1 200 OK

可以通过设置状态码响应浏览器状态信息

void setStatus(int code)

 

 

响应头

就是响应中的头数据Header

Content-Type:text/html

通过使用以下方法设置头数据

void setHeader(String name, String value)

可以设置头中的任意字段数据

void setHeader(“Content-Type”, “text/html”)
void setHeader(“charset”, “utf-8”)

同时也可以通过封装方法直接设置

void setContentType(“text/html;charset=utf-8”)

 

响应体

对浏览器进行响应传回数据的方式,可通过字符流也可通过字节流。

通过response可以获取到流的对象

// 获取字符流对象
PrintWriter writer = response.getWriter();
// 对响应体写入字符
writer.write("xxx")
writer.write("<html>")

 

使用字节流写入数据

// 获取字节流对象
ServletOutputStream output = response.getOutputStream();

output.write(字节数据)  // 如图片或视频等等的数据,也可通过第三方包进行io流操作

 

注意:响应流不需要手动关闭流,因为响应流由Tomcat管理。

如果您喜欢本站,点击这儿不花一分钱捐赠本站

这些信息可能会帮助到你: 下载帮助 | 报毒说明 | 进站必看

修改版本安卓软件,加群提示为修改者自留,非本站信息,注意鉴别

THE END
分享
二维码
打赏
海报
Java – Servlet – Request与Response
简介 在Http应用程序中,网页与服务器之间的互动需要产生数据传输,在Servlet中,提供ServletRequest和servletResponse接口。   ServletRequest Request是浏览器向服务器请求数据时所包……
<<上一篇
下一篇>>