1.向服务器发送请求的几种方式
1.1 地址栏输入
在浏览器地址栏直接输入要访问的地址,此方式可以看做是访问服务器的起始操作. http://ip:port/path
1.2 超链接
使用超链接也可以向服务器发送请求 <a href="www.baidu.com">百度</a>
1.3 表单
当需要向服务器发送请求,并且传输一些用户输入的数据时,我们优先选择form表单的方式发起请求
1.4 异步请求ajax
1.5 请求转发
通过服务器内部将请求进行一次转发
1.6 重定向
服务器通过给定一个新资源的地址,响应客户端后,客户端自动再次发送一个请求到新资源的地址处
2.HttpServletRequest对象
2.1 介绍
主要作用是接收客户端发送过来的请求信息
2.2 常用方法
获取客户端请求参数(客户端提交的数据)
| 方法 | 作用 |
|---|---|
| getParameter(name) | 获取指定名称的参数 |
| getParameterValues(String name) | 获取指定名称参数的所有值 |
| getParameterNames() | 获取一个包含请求消息中的所有参数名的Enumeration对象 |
| getParameterMap() | 返回一个保存了请求消息中的所有参数名称和值的Map对象 |
2.3 请求乱码解决
因为在使用request接收客户端传来的数据后,在解析的过程中使用的编码方式为ISO-8859-1,这个编码格式不支持中文,所以接收的中文在解析时就会出现乱码,而解决乱码有两种方式:
方式1:
request.setCharacterEncoding("UTF-8");
此方法值针对post有效,且需要在接收所有数据前设定
2.4 请求转发
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请 求对象进行保存,地址栏中的URL 地址不会改变,得到响应后,服务器端再将响应发送给 客户端,从始至终只有一个请求发出,达到多个资源协同响应的效果
格式:
request.getRequestDispatcher("地址").forword(request,response);
特点:
- 服务端行为,服务端跳转
- 浏览器的地址不会改变
- 从始至终只有一个请求
- 请求转发时,数据可以共享(request对象共享)
2.5 request作为域对象
通过request对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效
| 方法 | 作用 |
|---|---|
| request.setAttribute("限域变量名","域变量的值"); | 设置域对象内容 |
| request.getAttribute("限域变量名"); | 获取域对象内容 |
| request.removeAttribute("限域变量名"); | 删除域对象内容 |
3.HTTPServletResponse对象
3.1 介绍
Web 服务器收到客户端的http 请求,会针对每一次请求,分别创建一个用于代表请求 的request 对象和代表响应的response 对象.
获取客户端数据,需要通过request对象;向客户端输出数据,需要通过response对象
HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将Web 服 务器处理后的结果返回给客户端.
3.2 常用方法
| 方法名 | 作用 |
|---|---|
| setContentType(String ContentType) | 设置响应的MIME类型 |
| getWriter() | 获取输出字符流(只能响应回字符) |
| getOutputStream() | 获取输出字节流(可以响应回任何数据) |
3.3 响应乱码解决
3.3.1 getWriter()字符乱码
对于getWriter()获取到的字符流,响应中文必定出乱码
由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文.
3.3.2 getOutputStream()字节乱码
对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示.
当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码.
3.3.3 解决方案
解决步骤:
- 设置服务端的响应编码格式: response.setCharacterEncoding("UTF-8");
- 设置客户端的额编码格式: reponse.setHeader("content-type","text/html;charset=UTF-8"); 总结:保证发送端与接收端的编码格式一致;设置客户端与服务端的编码格式一致,且都支持中文
其实还可以同时设置客户端与服务端的编码: response.setContentType("text/html;charset=utf-8");
3.4 重定向
重定向是一种服务器指导,客户端的行为.客户端发出第一个请求,被服务器接收,经 过处理服务器进行响应, 与此同时, 服务器给客户端一个地址( 下次请求的地址 resp.sendRedirect("url");),当客户端接收到响应后,立刻.马上.自动根据服务器给的 地址进行请求的发送第二个请求,服务器接收请求并作出响应,重定向完成.
可以看出重定向过程中有两个请求,并且呼吁客户端行为
特点:
- 客户端跳转
- 存在两次请求
- 地址栏会发生改变
- 数据不共享(request对象不共享)
请求转发与重定向的区别:
- 请求转发是服务端跳转,重定向是客户端跳转
- 请求转发时地址栏不发生改变,重定向时地址栏发生改变
- 请求转发时从始至终只有一次请求,重定向时存在两次请求
- 请求转发时数据可以共享(request对象和域对象),重定向时数据不共享
- 请 求转发时地址只能定位到当前站点下(不能跨域),重定向时地址可以是任意地址
4.Cookie对象
4.1 Cookie的创建和发送
通过new Cookie(“key”,”value”);来创建一个Cookie 对象,要想将Cookie 随 响应发送到客户端,需要先添加到response 对象中,resp.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端.在浏览器上可以看见.
例:
response.setContentType("text/html;charset=utf-8");
Cookie cook=new Cookie("A","a");
response.add(cook);
4.2 Cookie的获取
在服务器端只提供了一个getCookies()的方法用来获取客户端回传的所有cookie 组成的一个数组,如果需要获取单个cookie 则需要通过遍历,getName()获取Cookie 的名称,getValue()获取Cookie 的值.
例:
Cookie[]cooks=request.getCookies();
if((cooks!=null)&&(cooks.length!=0)){
for(Cookie cookie:cooks){
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
4.3 Cookie到期时间的设定
除了Cookie 的名称和内容外,我们还需要关心一个信息,到期时间,到期时间用来 指定该cookie 何时失效.默认为当前浏览器关闭即失效.我们可以手动设定cookie 的 有效时间(通过到期时间计算),通过setMaxAge(int time);方法设定cookie 的最大有 效时间,以秒为单位.
大于0 的整数,表示存储的秒数;
若为负数,则表示不存储该cookie;
若为0,则删除该cookie.