JavaWeb的小结02
第2章-第2节
一、知识点
HttpServletRequest请求对象、HttpServletResponse响应对象、响应内容类型Content-Type、请求转发、重定向、ServletContext对象。
二、目标
-
深刻理解HttpServletRequest对象的作用。
-
深刻理解HttpServletResponse对象的作用。
-
掌握HttpServletRequest获取参数的常用方法。
-
掌握HttpServletResponse响应内容的方法。
-
理解响应内容类型Content-Type。
-
理解请求转发和重定向的区别。
-
掌握ServletContext对象的使用。
三、内容分析
-
重点
-
HttpServletRequest对象的作用。
-
HttpServletRequest对象获取客户端参数的方法。
-
HttpServletResponse对象的作用。
-
HttpServletResponse响应数据给客户端。
-
理解请求转发和重定向的区别。
-
-
难点
-
请求与响应的理解。
-
响应内容类型Content-Type的理解。
-
四、内容
1、HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
一个完整的HTTP请求包括:请求行、请求头、请求体。
我们可以通过浏览器,【开发者工具】-【Network】-【Name】-【Headers】看到请求信息。
1.1 获取请求行信息
假设使用请求 http://localhost:8080/web/test?name=张三&age=18 测试以下方法,结果展示在示例结果列。
方法名 | 说明 | 示例结果 |
---|---|---|
getMethod() | 获取请求方式。 | GET |
getRequestURL() | 获取完整路径。 | http://localhost:8080/web/test |
getRequestURI() | 获取除了域名或者IP部分的路径。 | /web/test |
getServletPath() | 获取Servlet路径。 | /test |
getContextPath() | 获取虚拟目录。 | /web |
getQueryString() | 获取参数,键=值,即?号后面的部分。 | name=%E5%BC%A0%E4%B8%89&age=18 |
getProtocol() | 获取协议及版本。 | HTTP/1.1 |
getRemoteAddr() | 返回IP地址。 | 0:0:0:0:0:0:0:1(属于ipv6,服务器和客户端都在同一台电脑上会出现) |
1.2 获取请求头信息
请求头包含许多有关的前端环境和请求正文的有用信息。
请求头存在的主要意义是: 将前端的一些信息告诉后端。
方法名 | 说明 |
---|---|
String getHeader(String name) | 根据请求头名字获取对应的请求头值。 |
Enumeration<string> getHeaderNames() | 获取所有的请求头名字。 |
//获取请求头
String accept = req.getHeader("Accept");
//迭代请求头信息
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {String name = headerNames.nextElement();String value = request.getHeader(name);System.out.println(value);
}
1.3 获取请求体信息
请求体主要包含前端发送给后端的数据(参数)。
对于GET请求, 一般不需要请求体, 因为GET参数直接体现在URL上。
对于POST请求, 需要请求体, 请求体里保存POST参数。
方法名 | 说明 |
---|---|
BufferedReader getReader() | 获取字符输入流,只能操作字符数据。 |
ServletInputStream getInputStream() | 获取字节输入流,可以操作所有类型的数据(文件上传)。 |
String getParameter(String name) | 根据参数名获取参数值,get、post通用。 |
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("name");System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// post请求中文会乱码req.setCharacterEncoding("utf8");
String name = req.getParameter("name");System.out.println(name);
}
1.4 请求转发
一种服务器内部资源跳转的方法,servlet之间的跳转。(可以理解为函数之间的互相调用)
-
使用步骤
-
通过request请求对象获取请求转发器对象。
-
通过RequestDispatcher对象进行转发。
request.getRequestDispatcher("转发路径").forward(request, response)
-
-
特点
-
浏览器地址路径不发生变化。
-
转发是一次请求。
-
只能转发到服务器内部资源。
-
-
共享数据
请求转发中涉及到的多个servlet,可以共享数据。
setAttribute(String name, Object object) // 存储数据 getAttribute(String name) // 通过键获取数据 removeAttribute(String name) // 通过键移除数据
2、HttpServletResponse
当客户端通过HTTP协议访问服务器时,如果服务器要给客户端一些相响应的信息,就可以使用HttpServletResponse提供的方法进行设置。
1.1 核心方法
方法 | 说明 |
---|---|
void setStatus(int sc) | 设置响应状态码 |
void setHeader(String name,String value) | 设置一个带有给定的名称和值的Header ,如果name 已经存在,则覆盖旧的值 |
void setContentType(String type) | 设置被发送到客户端的响应的内容类型 |
PrintWriter getWriter() | 用于往 body 中写入文本格式数据 |
响应状态码:服务器告诉客户端浏览器本次请求响应的一个状态,都是三位数。
-
1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送1xx状态码
-
2xx:成功,200
-
3xx:重定向。302重定向,304访问缓存
-
4xx:客户端错误。404找不到后端地址,401缺少权限,403权限认证失败
-
5xx:服务器端错误。500服务器内部错误
1.2 重定向
resp.sendRedirect("www.baidu.com")
特点:
-
地址栏发生变化。
-
重定向是两次请求,不能使用request对象来共享数据。
-
重定向可以访问其他站点的资源。
3、ServletContext
ServletContext官方叫Servlet上下文。服务器会为每一个工程创建一个ServletContext对象。这个对象全局唯一,工程内所有的servlet都共享这个对象。所以叫全局应用程序共享对象。
3.1 获取方式
-
req.getServletContext()
-
this.getServletContext()
3.2 核心方法
方法 | 说明 |
---|---|
setAttribute(name, value) | 添加数据 |
getArrtibute(name) | 获取数据 |
removeAttribute(name) | 删除数据 |
3.3 获取MIME类型
在互联网通信过程中定义的一种文件数据类型。
String filename = "a.jpg";
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);