reqest、response

1 request和response简介

1.1 request和response介绍

服务器接收到来自浏览器的请求后,会调用Servlet的service方法处理请求,在调用service之前,会创建request对象(用于封装Http请求信息)和response对象(用于封装最后将要发送给浏览器的响应信息)

在执行service处理请求的过程中, 如果要获取任何请求相关的信息, 可以通过request(调用方法)来获取;

如果有任何数据要发送给浏览器, 可以通过response对象进行发送。

前端 response header设置 前端如何获取response参数_java

2 request对象

2.1 request对象的方法

前端 response header设置 前端如何获取response参数_数据_02

另,请求参数也属于请求信息,request也提供了方法获取,下面单独介绍。

2.2 获取请求参数

1、request获取请求参数的方法:

request.getParameter(String name) – 根据请求参数的名称获取参数值。
返回String类型的参数值。
例如,获取用户名:

String username = request.getParameter("username");

request.getParameterValues(String name) – 根据请求参数的名称获取多个值组成的数组。
返回String类型的数组。例如获取爱好:

String[] likes = request.getParameterValues("like");

2、在获取中文请求参数时,请求参数可能会有乱码问题,关于请求参数的乱码问题:
(1)如果请求方式为POST提交,必然会出现乱码,解决方式是在任何获取参数的代码之前,添加如下代码:

request.setCharacterEncoding("utf-8");

(2)如果请求方式为GET提交,tomcat8及之后的版本已经解决了中文参数乱码的问题,不需要处理,tomcat7及之前的版本只需要在 [tomcat]/conf/server.xml中添加如下配置也可以解决乱码问题。

前端 response header设置 前端如何获取response参数_java_03

2.3 请求方式

为什么区分请求方式

请求方式是客户端对话服务器时的说明,是区分请求种类的关键。
不同的请求方式不仅仅在数据传输时会有所不同,在表单提交及服务器端处理时都会采用不同的方式,而区分不同种类的请求方式会使得浏览器采用不同的环节方式处理后续请求,从而提升相应速度。获取请求参数值的方法

请求方式

作用

GET

请求指定的资源

POST

向指定的资源提交需要处理的数据

HEAD

要求响应与相应的GET一样,但没有响应体

PUT

上传指定资源

DELETE

删除指定资源

….

GET请求方式

当需要向服务器请求指定的资源时使用方法
它不应该用于一些会造成副作用的操作中(在网络应用中用它来提交请求是一种常见的错误用法)
什么情况浏览器发送Get请求
在地址栏输入一个地址
点击链接
表单默认提交

POST请求

向服务器提交需要处理的数据,这些数据写在请求的内容里,可以导致新资源的产生和已有资源的更新。
什么情况浏览器发送POST请求
设置表单method属性为POST

POST请求方式的特点

请求参数添加到实体内容中,可提交大量数据
不会将请求参数显示在浏览器地址栏,相对安全

区分GET和POST请求方式

使用工具抓取GET和POST两种请求方式的数据包,通过抓取的内容区分两种方式

2.4 为什么表单提交中文会出现乱码

为什么会产生乱码

当表单提交时,浏览器会对中文参数值进行编码(会使用打开表单所在的页面时的字符集进行编码)。Web服务器在默认情况下会使用iso-8859-1去解码
编码与解码方式不一致时,就会出现乱码

解决POST方式时的乱码问题

Step1:确保表单所在的页面按照指定字符集打开
Step2:在服务器端按照这个编码格式解码即可
request.setCharacterEncoding(“utf-8”)
添加在读取参数的前面
此方法指针对post请求有效

处理POST请求中的中文参数值

在表单中输入中文名字“女神”,使得页面能够输出“你好女神”。

解决GET方式时得乱码问题

Step1:使用meta确保表单所在页面按指定字符集打开
Step2:String username = request.getParameter(“”);
username = new String(username.getBytes(“ISO-8859-1”),“utf-8”);

2.3 请求转发、域对象

1、请求转发:是指定服务器中的某一个资源(Servlet或JSP)在处理请求的过程中,将请求转发给一个其他的资源,让其他资源来处理请求。
2、域对象:能够在指定的范围内, 利用自身的map实现数据的共享

3、请求转发和域对象经常配合着使用,实现从Servlet中带数据到JSP进行显示!!

前端 response header设置 前端如何获取response参数_定时刷新_04


提示:

(1)请求转发是一次请求,一次响应

(2)转发前后地址栏地址不会发生变化

4、实例:利用请求转发、域对象实现(模拟)查询个人信息功能

UserServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//1.查询个人信息(模拟)
	String name = "王海涛";
	String age = "18";
	//2.将数据存入request对象的map中
	request.setAttribute("name", name);
	request.setAttribute("age", age);
	//3.通过转发讲request对象(及其中的数据)带到JSP进行显示
	request.getRequestDispatcher("/show.jsp").forward(request, response);
}

show.jsp

<body>
	<p>姓名:<%= request.getAttribute("name") %></p>
	<p>年龄:<%= request.getAttribute("age") %></p>
</body>

3 response对象

3.1 response对象的方法

前端 response header设置 前端如何获取response参数_定时刷新_05

3.2 向客户端发送数据

向浏览器客户端发送响应数据, 可以通过两个流进行:
response.getOutputStream() – 字节流
response.getWriter() – 字符流

在通过字符流发送文本数据时可能会有乱码问题

为什么返回的页面会有乱码

编码:将Unicode字符集对应得字符数组转换成某种本地字符集(如UTF-8)对应的字节数组。
字节码:将某种本地字符集对应的字节数组转换为Unicode字符集对应的字节数组
编码和解码使用的字符集不一致就产生了乱码问题。

如何解决输出内容的乱码

在获取WriteOut对象及调用out方法之前调用setContentType方法
response.setContentType(“text/html;charset= utf-8”);
作用:
通知容器,在调用out.println方法输出时,使用指定的字符集
生成消息头中content-type的值,通知浏览器,服务器返回的数据类型和字符集。

/* 0.通知服务器使用utf-8发送数据给浏览器
 * 同时通知浏览器也使用utf-8接收服务器发送过来的数据 */
response.setContentType("text/html;charset=utf-8");

//1.获取字符流
PrintWriter pw = response.getWriter();
pw.write("哈喽");

3.3 实现重定向、实现定时刷新

转发只能在同一个Web应用内部的两个资源之间进行跳转, 不可以是不同的Web应用或者不同的服务器中进行跳转
1、重定向:是指当用户浏览某个网址时,将其导向到另一个网址的技术。
http://localhost/day03/ResponseDemo2 http://localhost/day03/index.html

例如,在注册或登录成功后,浏览器地址栏地址将会跳转到首页。
实现重定向:(模拟登录成功后跳转到首页)

response.sendRedirect("/LoginServlet/index.html");

2、定时刷新:和重定向很相似,唯一的区别在于,定时刷新可以指定在多少秒之后再跳转。例如,在注册之后,往往会提示:“恭喜您注册成功, 3秒之后将会跳转到首页…”
实现定时刷新:(模拟登录成功后跳转到首页)

response.setHeader("Refresh", "3;url=/LoginServlet/index.html");

提示:
(1)重定向和定时刷新都是两次请求两次响应
(2)重定向和定时刷新前后,地址栏地址都会发生变化。

注册成功之后定时刷新首页

//2.定时刷新: 和重新不同的时, 在跳转之前可以做一个提示
// (模拟注册成功之后跳转到首页, 在跳转之前,提示用户"恭喜您注册成功,3秒之后将会跳转到首页..")
response.setContentType( "text/html;charset=utf-8");
response.getWriter().write("恭喜您注册成功,10秒之后将会跳转到首页...");
response.setHeader("Refresh", "10;url=/day03/index.html");

总结:
(1) 定时刷新和重定向不同的是, 重定向是立即跳转, 中间没有时间间隔, 而定时刷新可以指定多少秒之后再进行跳转, 在跳转之前, 可以输出内容到浏览器, 提示用户。
(2) 定时刷新和重定向都是两次请求, 两次响应
(3) 定时刷新和重定向跳转前后, 地址栏地址都会发生变化。
(4) 定时刷新和重定向在跳转时没有限制, 既可以在同一个Web应用内部的资源之间进行跳转, 也可以在不同的Web应用或者不同的主机之间进行跳转

4. 员工信息管理v1

设计一个页面,addEmp.html添加员工
三个表单域,姓名,薪水,年龄,点击提交后到达addEmpServlet。Servlet只做一件事情,读取员工信息并显示,以及能够支持中文输入。