一,Request
1.1 概述
概念:request 对象是由服务器创建的封装了所有客户端提交信息的对象,我们可以直接使用它,通过它API中相关的方法获取客户端请求时所封装在请求对象中的数据。
request 的体系结构:
RequestFacade实现类 -> HttpServletRequest接口 -> SevletRequest接口
1.2 request 的功能
1.2.1 获取请求消息
获取请求行
getMethod():获取请求方式:POST、GET
getContextPath():获取虚拟目录:http://ip:端口/xxxx/index.html 中的 xxxx
getServletPath():获取Servlet路径:获取的就是 url-pattern 标签体中的内容
getQueryString():获取以get方法提交的请求参数:key1=value1&key2=value2
getProtocol():获取协议/版本:HTTP/1.1
getRequestURI():获取请求的URI
getRequestURL():获取请求的URL
注:
- URL:统一资源定位符,例如:http://localhost/虚拟目录/资源名
- URI:统一资源标识符,例如:/虚拟目录/资源名
获取请求头
- getHeader(String name):通过请求头的名称获取请求头对应的值
- getHeaderNames():获取所有请求头的名称
获取请求体:只有以POST方式请求,才有请求体,在请求体中封装了提交的数据
- getReader():获取字符串输入流,只能操作字符流数据
- getInputStream():获取字节输入流,可以操作所有文件类型的数据
1.2.2 获取请求参数的通用方法
无论是以GET方法还是以POST方法都可以通过以下通用方法来获取提交的数据
- getParameter(String name):根据指定的参数名获取对应的参数值
- getParameterValues(String name):根据指定的参数名获取对应的参数值组成的数组
- getParameterNames():获取所有参数名
- getParameterMap():获取所有参数名及其对应的参数值组成的Map集合
注:中文乱码问题,tomcat 服务器默认的编码格式是 iso8859-1,这种编码格式中不含中文,所以当提交的内容有中文时会出现乱码
get
// 在接收数据后,将接收到的数据改成指定的编码 name = new String(name.getBytes("iso8859-1"),"utf-8");
post
// 在接收数据前,设置接收数据的编码 request.setCharacterEncoding("utf-8");
1.2.3 请求转发
概念:请求转发是一种在服务器内部实现资源跳转的方式
步骤:
通过 request 对象获取请求转发器对象,并明确转发到的目标地址
请求转发的地址写法:由于请求转发是从服务器的一个资源跳转到这个服务器的另一个资源,是内部资源的跳转,因此路径的写法是不需要明确项目名的,也就无需写上虚拟路径,直接写要访问的资源名即可
RequestDispatcher dispatcher = request.getRequestDispatcher(String path);
- 执行转发
dispatcher.forward(request,response);
特点:
- 浏览器地址栏不发生变化
- 请求转发只执行了一次请求
- 只能访问当前服务器的内部资源
1.2.4 共享数据
域对象:一个有作用范围的对象,可以在指定范围内实现数据的共享
request域:它的作用范围是一次请求,一般用于在请求转发的多个资源中实现共享数据
域对象的方法:
- setAttribute(String name,Object o)
- getAttribute(String name)
- removeAttribute(String name)
二,Response
2.1 概述
概念:response 对象是由服务器创建的能够针对用户的请求做出响应的对象,我们可以直接使用它,通过它API中相关的方法对客户端做出响应。
2.2 response的功能
设置响应行
- setStatus(int code):设置状态码
- 302:表示重定向
设置响应头:
setHeader(String name,String value)
完成重定向
重定向地址的写法:由于重定向执行了两次请求,第二次请求是从客户端重新发起了请求,因此,在客户端向服务器发起请求时必须明确访问的是服务器中的哪一个项目,所以要加上虚拟路径。
response.setStatus(302); response.setHeader("location", "/day42_02_response/t2"); // 简单的重定向方法 response.sendRedirect("/day42_02_response/t2");
设置编码格式
response.setHeader("content-type","text/html;charset=utf-8"); // 简单的设置方法 response.setContentType("text/html;charset=utf-8");
设置响应体
- getWriter():获取字符输出流
- getOutputStream():获取字节输出流
请求转发和重定向:
请求转发的特点:
- 地址栏不发生变化
- 只执行了一次请求
- 只能访问当前服务器的内部资源
重定向的特点:
- 地址栏发生变化
- 执行了两次请求
- 可以访问其他服务器的资源
请求转发和重定向的区别:
请求转发的地址不变,重定向的地址会变
请求转发只执行一次请求,重定向执行两次请求
请求转发不能访问其他服务器的资源,重定向可以访问其他服务器的资源
请求转发后的页面可以获取域中数据(实现数据共享),重定向不可以
注:请求转发后的页面只能获取存储在request域对象中的数据,存储在request域对象中的数据在重定向后的页面中无法获取。那么使用重定向如何获取前一个页面传递的数据呢?
- 通过使用范围更大的域对象来存储(Session、ServletContext)
- 将要传递的数据拼接在重定向地址后
请求转发的性能优于重定向
请求转发只有在Java中有
三,ServletContext
3.1 概述
概念:表示整个Web应用
它的生命周期:从部署了该项目的服务器开启到服务器关闭或者该项目从服务器中卸载
获取 ServletContext 对象的方法:
通过 request 获取
request.getServletContext();
通过 HttpServlet 获取
this.getServletContext();
3.2 ServletContext的功能
3.2.1 获取全局初始化参数
- getInitParameter(String name)
- getInitParameterNames()
获取的数据需要配置在web.xml
<context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param> <context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param>
3.2.2 共享数据
域对象:一个有作用范围的对象,可以在指定范围内实现数据的共享
ServletContext域:它的作用范围是整个web应用,从调用 setAttribute() 开始到服务器关闭或者项目从服务器中卸载或者调用了 removeAttribute()
域对象的方法:
- setAttribute(String name,Object o)
- getAttribute(String name)
- removeAttribute(String name)
3.3.3 获取服务器内文件的绝对路径
方法:getRealPath(String path),通过相对路径获取文件在服务器中的真实路径
四,文件下载案例
分析:
准备工作
- 下载的页面
- 下载的文件
- 处理下载的 Servlet
以附件形式打开而非直接打开
对于不同内核、版本的浏览器来说,解析能力不同,对于能解析的文件,会直接在浏览器中打开,不能解析的文件会以附件形式提示是否要下载。要完成下载功能,无论该文件是否可以被浏览器解析都不应该允许浏览器执行解析功能。因此需要设置指定的响应头。
如何明确点击的内容就是要下载的资源
可以通过超链接中的href属性来找到要下载的资源