请求的方式
1.在浏览器地址栏直接输入要访问的地址即可,此种方式可以看做是访问服务
器的起始操作。
http://ip:port/path
2. 超链接
使用超链接也可以向服务器发出请求
尚学堂
3. Form 表单
当需要向服务器发送请求,并且传输一些用户输入的数据时,我们优先选择
form 表单的方式发起请求。
4. ajax
通过 ajax 发起的请求,属于异步请求,能实现局部刷新的效果,是一种比
较常用的请求方式。
通过 jQuery 中的 ajax(),get(),post(),getJSON()等方法都能发送请求
5. 请求转发
通过服务器内部将请求进行一次转发,可以请求到其他资源(后面讲)
6. 重定向
服务器通过给定一个新资源的地址,响应会客户端后,客户端自动再次发送
一个请求到新资源的地址处。
HttpServletRequest 对象
service()方法中
形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在
HTTP 协议上,该对象是由 Tomcat 封装好传递过来
HttpServletRequest 是 ServletRequest 的子接口,ServletRequest 只有一个
子接口,就是 HttpServletRequest。
1.常用方法
2.获取请求头
3.获取客户端请求参数
解决请求乱码
Tomcat8及以上版本
POST请求 乱码 处理 request.setCharacterEncoding(“UTF-8”);
GET请求 不乱码,不处理
Tomcat7及以下版本
POST请求 乱码 处理 request.setCharacterEncoding(“UTF-8”);
GET new String(request.getParameter(“uname”).getBytes(“IS0-8859-1”),“UTF-8”)
乱码原因:
由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码。
主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。
解决方案:
要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。
设置服务器解析编码 request.setCharacterEncoding("UTF-8");
只针对POST请求有效,GET请求无任何影响
或者在接收到乱码数据以后,再通过相应的编码格式还原。
接收乱码数据,再转换编码格式 new String(request.getParameter("uname").getBytes("IS0-8859-1"),"UTF-8")
无论是GET请求还是POST请求,都有效.
请求转发
服务器的行为,当客户端请求到达后,服务器进行转发,
此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服
务器端再将响应发送给客户端,从始至终只有一个请求发出。
实现:
request.getRequestDispatcher(“跳转的路径”).forward(request, response)
特点:
1、服务端行为,服务端跳转
2、地址栏不会发生改变
3、request对象共享
Request 作为域对象
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即
服务器跳转有效。
request.setAttribute():设置域对象内容;request.getAttribute(String name):
获取域对象内容;request.removeAttribute(String name): 删除域对象内容。
request 域对象中的数据在一次请求中有效,则经过请求转发,request 域
中的数据依然 存在,则在请求转发的过程中可以通过 request 来传输/共享数据。
HttpServletResponse 对象
Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用
于代表请求的 request 对象和代表响应的 response 对象。
request 和 response 对象代表请求和响应:获取客户端数据,需要通过
request 对象;向客户端输出数据,需要通过 response 对象。
常用方法
刷新和页面自动跳转
所有头信息都是随着请求和回应自动发送到服务器端(客户端),在
response 中一个比 较常用的头信息就是刷新的指令,可以完成定时刷新的功能。
resp.setHeader(“refresh”,“2”);
对于刷新的头信息,除了定时的功能外,还具备了定时跳转的功能,可以让
一个页面定时跳转到一个指定的页面。(已经注册成功,两秒后跳转到登陆页面)
response.setHeader(“refresh”,“3;URL=ok.html”);
但是这种跳转不是万能的,有时候根本就无法进行跳转操作,返回后刷新不
会跳转;对于这种定时跳转的头信息,也可以采用 HTML 的方式进行设置,HTML
本身也可以设 置头信息
数据响应
getWriter()获取字符流(只能响应回字符);
getOutputStream()获取字节流(能响应一切数据)。
响应回的数据到客户端被浏览器解析。
注意:两者不能同时使用。
java.lang.IllegalStateException: getWriter() has already been called for this response
乱码解决
乱码原因:
服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。
getWriter()的字符乱码
响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
解决方案:
1、设置服务端编码为UTF-8
response.setCharacterEncoding(“UTF-8”);
2、设置客户端的编码
response.setHeader(“content-type”, “text/html;charset=utf-8”);
总结:设置服务端与客户端的编码一致,且都支持中文 (这一句可代替上面两句设置)
response.setContentType(“text/html;charset=utf-8”);
getOutputStream()字节乱码
对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示.
当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。
响应图片
1、获取项目存放在服务器中的真实路径 request.getServletContext().getRealPath("/");
2、获取图片的路径
3、通过路径得到file对象
4、判断file对象是否存在,且是一个标准文件
5、得到文件的输入流
6、得到字节输出流
7、输出文件
8、关闭资源
重定向跳转
重定向
重定向是一种服务器指导,客户端的行为。
客户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect(“url”);),当客户端接收到响应后,立刻、马上、自动根据服务器 给的地址进行请求的发送第二个请求,服务器接收请求并作出响应,重定向完成。
特点:
1、客户端跳转
2、地址栏会发生改变
3、request对象不共享
请求转发和重定向
1、请求转发是服务端跳转,重定向是客户端跳转
2、请求转发时地址栏不发生改变,重定向时地址栏发生改变
3、请求转发时request对象共享,重定向时request对象不共享
4、请求转发的地址只能在当前站点下,重定向的地址可以是任意路径
5、请求转发时request作用域有效,重定向时request域对象无效
绝对路径和相对路径
相对路径:相对当前资源的路径
绝对路径:
以http://开头的路径,已经跨域,可以访问任意地址 (只有客户端跳转才可使用)
以/开头
请求转发
"/“代表的是"http://localhost:8080/站点名/”
重定向
"/“代表的是"http://localhost:8080/”
Cookie
Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客
户端.
Cookie 的创建和发送
Cookie的获取
getCookies()的方法用来获取客户端回传的所有 cookie 组成的一个数组,
如果需要获取单个 cookie 则需要通过遍历,
getName()获取 Cookie 的名称,getValue()获取 Cookie 的值。
Cookie到期时间的设定
到期时间,到期时间用来指定该 cookie 何时失效。
默认为当前浏览器关闭即失效。
设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int time);方法设定 cookie 的最大有效时间,以秒为单位。
maxAge
默认-1.表示只在当前浏览器中存活,关闭浏览器后失效
正整数:
表示存活指定秒数。无论是关闭浏览器还是电脑,都会存活。
负整数:
表示只在当前浏览器中存活,关闭浏览器后失效
零:
表示即刻删除
Cookie的注意点
1、不跨浏览器和电脑
2、不能存中文
Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。
3、如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。
Cookie的路径
只要访问的路径中包含path的值,就可访问到对应的cookie
"/" 表示表示只要在当前服务器下的所有项目都可访问
默认的路径都是在站点名下面的
当访问的路径包含了 cookie 的路径时,则该请求将带上该 cookie;如果访
问路径不包含 cookie 路径,则该请求不会携带该 cookie.