咨询热线:

0898-08982569

当前位置: 首页 > 育儿知识 > 饮食营养

JavaWEB必知必会-Request(请求)和Response(响应)

目录

  1. HttpResponse
  2. HttpRequest

1 HttpServletResonpse

1.1 HttpServletResonpse概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

1.2 response常用方法

1.2.1 Http状态码的设置

1.2.1.1 setStatus
  • 方法说明

  • 代码演示

  • 测试效果

1.2.1.2 sendError
  • 方法说明

  • 代码演示1

  • 测试效果1

  • 代码演示2

  • 测试效果2

1.2.2 响应头设置setHeader

1.2.2.1 302重定向
访问demo4,重定向到demo3,显示404状态.
  • 代码演示

  • 测试效果


  • 特别说明

response.sendRedirect()底层就是使用该种方式进行重定向.

1.2.2.2 定时刷新
访问一个servlet,每隔3秒刷新页面

1.2.2.3 定时跳转页面
  • 代码演示

  • 测试效果

1.2.3 响应体设置

使用最多的就是设置响应体文本:getWriter.write();

getWriter方法获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

  • 代码演示

  • 测试结果

1.2.4 响应乱码

1.2.4.1 乱码原因

response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码.
但我们发现客户端还是不能正常显示文字. 是因为我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以在代码中指定浏览器解析页面的编码方式.

1.2.4.2 解决方案


通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8
response.setContentType(“text/html;charset=UTF-8”);
上面的代码不仅可以指定浏览器解析页面时的编码,同时也包含setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType(“text/html;charset=UTF-8”);就可以解决页面输出中文乱码问题。

2 HttpServletRequest

2.1 HttpServletRequest概述

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大.

2.2 request常用方法

2.2.1 获取客户端的IP

  • 方法说明

这个方法是ServletRequest的方法

  • 代码演示

如果是本机访问,注意别用localhost,否则会被转为IPV6地址.可以通过127.0.0.1或者本机的IP访问. 这里我们以封IP为例演示这个方法的作用.

  • 测试效果

本机访问 127.0.0.1

其他IP访问

2.2.2 获取请求头

  • 方法说明

2.2.2.1 识别用户系统及浏览器信息
当我们浏览网站的时候,有时会提示我们最好使用XX浏览器, 或者当我们下载某软件的时候,会自动根据我们的系统进行匹配.那服务器是如何知道我们的操作系统以及浏览器?其实是我们发出的请求的请求头中,出卖了我们的信息.
  • 代码演示

  • 测试结果

2.2.2.2 防盗链
某些网站的资源,我们只能通过该网站的链接进入,通过其他网站的连接,哪怕url地址一致,都无法获取.这是因为服务器对该资源进行了防盗链处理. 

如果请求不是通过本站的超链接发出的,发送错误代码404 —Referer这个请求头,表示请求的来源.

  • 测试效果

在桌面上创建一个index.html.点击链接后.


请求头中没有referer相关的信息

通过项目中的index.html页面点击

请求头中含有Referer的信息

2.2.3 获取请求URL相关信息

以这个完整的URL为例,说明一下方法
http://localhost:8080/hello/oneServlet?name=zhangSan

  • String getScheme():获取协议名 —> http
  • String getServerName():获取主机名 —>localhost
  • String getServerPort():获取服务器端口 —>8080
  • String getContextPath():获取项目名称 —> /hello
  • String getServletPath():获取Servlet路径 —> /oneServlet
  • String getQueryString():获取参数部分,即?之后的部分name=zhangSan
  • String getRequestURI():获取请求URI,即项目名+Servlet路径:

—> /hello/oneServlet

  • String getRequsetURL():获取请求的URL,即不包含参数的完整请求路径:

—> http://localhost:8080/hello/oneServlet

2.2.4 获取请求参数

2.2.4.1 单个获取


获取单个参数,返回字符串.

2.2.4.2 获取多个


获取多个参数,并将他们放置到一个Map中.

2.2.4.3 将Map转换为JavaBean
我们在Servlet中接收多个表单参数后,最常做的事情,就是将参数封装为一个对象.手动声明对象,然后挨个属性的接收和封装过于麻烦,通常情况,我们都会借助Apache Commons组件中的BeanUtils工具包,帮我们完成数据的封装.
核心方法就是BeanUtils工具类的静态方法:populate.使用该方法切记表单提交的键必须和对象的属性名一致,否则无法进行属性的封装.

  • 代码演示

User实体

页面表单

Servlet

  • 测试结果

2.2.5请求乱码

2.2.5.1 POST乱码

通常浏览器往服务器发送的数据,都是utf-8编码的.因此在我们使用requset.
getParameter()方法之前,调用request.setCharacterEncoding(“utf-8”)即可防止POST请求乱码.

2.2.5.2 GET乱码
但是GET请求的编码方式不让设置,所以我们只能将错就错,拿到错误字符,然后通过ISO-8859-1编码反编译回去,再使用UTF-8重新编码.

2.2.6 请求转发

  • 方法说明

首先获取请求转发器,传入转发的路径.注意该路径不需要写项目名.

然后调用转发器的forword方法进行请求的转发

  • 转发与重定向的区别
  1. 请求转发是一个请求一次响应,而重定向是两次请求两次响应
  2. 请求转发地址栏不会变化,而重定向会显示后一个请求的地址
  3. 请求转发只能转发到本项目的其他Servlet,而重定向还能定向到其他项目的Servlet
  4. 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名

2.2.7 域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

  1. setAttribute(String name, Object o)
  2. getAttribute(String name)
  3. removeAttribute(String name)

注意:request域的作用范围:一次请求中

  • 代码演示


  • 测试结果