Response & ServletContext
案例目标
- 制作图片下载Servlet
- 统计某Servlet的访问次数
第一部分 HTTP 响应
1 组成
-
响应行
HTTP/1.1 200 OK
-
响应头
Server: Apache/2.4.18(Ubuntu) Content-Encoding: gzip Content-Length: 4028 Connection: Keep-Alive Content-Type: text/html
-
响应体
<!DOCTYPE html SYSTEM "about:legacy-compat"> <html lang="en"> <head> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="res/css/tomcat.css" rel="stylesheet" type="text/css"> <link href="res/css/fonts/fonts.css" rel="stylesheet" type="text/css"> <title>Apache Tomcat® - Welcome!</title> <meta name="author" content="Apache Tomcat Project"> <meta name="google-site-verification" content="nA9F0GvGNjVCU9W7HBziONQVx6FehvgQglI1X7WPfRw"> </head> ...
2 响应行
HTTP/1.1 200 OK
- 协议/版本
- 状态码及状态信息
常见的状态码
状态码 | 状态信息 | 说明 |
---|---|---|
200 | OK | 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态 |
302 | Move temporarily | 重定向,请求的资源临时从不同的 URI 响应请求 |
403 | Forbidden | 服务器已经理解请求,但是拒绝执行它 |
404 | Not Found | 请求资源不存在。通常是用户路径编写错误,也可能是服务器资源已删除 |
405 | Method Not Allowed | 请求行中指定的请求方法不能被用于请求相应的资源 |
500 | Internal Server Error | 服务器内部错误,通常程序抛异常 |
3 响应头
Server: Apache/2.4.18(Ubuntu)
Content-Encoding: gzip
Content-Length: 4028
Connection: Keep-Alive
Content-Type: text/html
常见的响应头
状态头 | 说明 |
---|---|
Server | 描述服务器信息,包含Web容器信息、服务器系统信息 |
Content-Length | 描述响应体的长度(字符数) |
Content-Type | 请求体的编码格式,以及超文本类型。常见的有text/html, application/xml,application/json |
Location | 指定响应的路径,需要与状态码302配合使用,完成跳转 |
Refresh | 3;url=www.itcast.cn 。 |
Content-Disposition | attachment; filename=1.gif 常用于文件下载,attachment指定,被访问的资源是一个下载(attachment)的资源,下载所使用的文件名为(1.gif) |
4 响应体
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="res/css/tomcat.css" rel="stylesheet" type="text/css">
<link href="res/css/fonts/fonts.css" rel="stylesheet" type="text/css">
<title>Apache Tomcat® - Welcome!</title>
<meta name="author" content="Apache Tomcat Project">
<meta name="google-site-verification" content="nA9F0GvGNjVCU9W7HBziONQVx6FehvgQglI1X7WPfRw">
</head>
...
服务器发送给浏览器的内容。可以是字符流,也可以是字节流。
5 Chrome查看响应信息
6 小结
-
HTTP由哪两部分组成:
请求request:浏览器发送给服务器
响应response:服务器发送给浏览器
-
响应由哪三部分组成
-
行
HTTP/1.1 码 信息
200 OK
404 Not Found
500 Internal Server Error
-
头
Refresh:时间;跳转的地址
-
体
服务器发送给浏览器的内容
字符流/字节流
HTML
第二部分 Response对象
HTTP响应:包括行头体,服务端发给浏览器。请求内容放在request对象。服务器发给浏览器的信息放在response对象。
1 响应行相关API
-
void setStatus(int statusCode)
设置响应行-状态码,Tomcat不会协助添加错误信息
-
void sendError(int errorCode, String msg)
设置状态码(errorCode),并且Tomcat会协助添加错误信息(msg)
案例
- 通过设置状态码,观察浏览器信息
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/response_line")
public class ResponseLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置状态码(没有信息)
response.setStatus(500);
// 设置状态码(有信息,并且多一个"messgae")
response.sendError(500, "你吃了吗");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2 响应头相关API
-
void setHeader(String name, String value)
在响应头中,设置一个Header。Header所对应的名字(name),以及Header所对应的值(value)
-
void setContentType(String type)[重点]
在响应头中,设置一个Header。Header所对应的名字为Content-Type,Header所对应的值为(value)
案例
- 过3秒跳转到另一个网站
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 过3秒跳到百度
@WebServlet("/refresh_sample")
public class RefreshSampleServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 过3秒跳到百度
response.setHeader("Refresh", "3;url=https://www.baidu.com");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
案例
- 利用302状态码,以及Location响应头,完成浏览器端页面跳转
- 浏览器两次请求
- 在浏览器完成的跳转
- 浏览器地址会变
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/redirect_sample")
public class RedirectSampleServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 手动重定向
// 设置状态码为302,Location为跳转的地址
response.setStatus(302);
response.setHeader("Location", request.getContextPath() + "/hello");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
浏览器跳转技术 - 重定向
- void sendRedirect(String location)
案例
- 利用sendRedirect,完成浏览器端页面跳转
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/redirect_sample")
public class RedirectSampleServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.setStatus(302);
// response.setHeader("Location", request.getContextPath() + "/hello");
// 不需要手动设置302以及Location了
response.sendRedirect(request.getContextPath() + "/hello");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
重定向与转发的区别【重点】
request.getRequestDispatcher("/资源路径").forward(request, response)
response.sendRedirect("/资源路径/地址")
-
请求次数
- 转发: 1次
- 重定向: 2次
-
浏览器地址
- 转发: 不变
- 重定向: 变
-
跳转的位置
- 转发: 服务器
- 重定向: 浏览器
-
转发
request.getRequestDispatcher("/bservlet").forward(request, response);
-
重定向
response.sendRedirect(request.getContextPath() + "/bservlet");
转发 | 重定向 |
---|---|
地址不变 | 地址改变 |
服务器内部跳转 | 浏览器完成跳转 |
一次请求 | 二次请求 |
3 响应体相关API【重点】
-
PrintWriter getWriter()
获取字符输出流(输出到浏览器)
-
OutputStream getOutputStream()
获取字节输出流(输出到浏览器,一般下载时或展示的是一个纯图片时使用)
案例
- 利用getWriter,编写动态资源
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取字符输出流
PrintWriter writer = response.getWriter();
// 向字符输出流中,输出HTML内容
writer.println("<HTML>");
writer.println("<HEAD>");
writer.println("</HEAD>");
writer.println("<BODY>");
writer.println("<H1>Hello Servlet!</H1>");
writer.println("</BODY>");
writer.println("</HTML>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
案例
- 利用getWriter,编写中文动态资源
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取字符输出流
PrintWriter writer = response.getWriter();
// 可以选择write/print/println
// 向字符输出流中,输出HTML内容
writer.println("<HTML>");
writer.println("<HEAD>");
writer.println("</HEAD>");
writer.println("<BODY>");
writer.println("<H1>你好,Servlet!</H1>");
writer.println("</BODY>");
writer.println("</HTML>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
响应体乱码解决
-
response.setCharacterEncoding(“字符集”)
响应体使用指定的字符集传输
-
response.setContentType(“text/html; charset=utf-8”)
setCharacterEncoding用于设置传输字符集,但是浏览器仍然不清楚页面所采用的字符编码。可以在Content-Type头给出。 如果在Content-Type头部指定了字符编码,则setCharacterEncoding可以省略。
package com.itheima.day09;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 在未设置字符编码之前,打印默认的字符编码
System.out.println(response.getCharacterEncoding());
// 服务器需要告诉浏览器我发送的响应体是什么字符编码
// 如果同时设置了Content-Type的编码,和response的characterENcoding的话,只需要写一个Content-Type即可
// response.setCharacterEncoding("utf-8");
// response.setHeader("Content-Type", "text/html; charset=utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter writer = response.getWriter();
// 可以选择write/print/println
writer.println("<HTML>");
writer.println("<HEAD>");
writer.println("</HEAD>");
writer.println("<BODY>");
// 输出中文
writer.println("<H1>你好, Servlet!</H1>");
writer.println("</BODY>");
writer.println("</HTML>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
案例
- 利用getOutputStream,制作图片下载Servlet
package com.itheima.day09;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 告诉浏览器,这是一个附件,要下载,下载的文件名是download.gif
response.setHeader("Content-Disposition", "attachment; filename=download.gif");
// 获取浏览器字节输出流以及文件输入流
OutputStream out = response.getOutputStream();
InputStream in = new FileInputStream("/Users/LEAF/download.gif");
// 从输出流读取,写入到输出流
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
// 关闭流对象
in.close();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
4 IOUtils 工具包
- commons-io-2.1.jar
相关API
-
static int copy(InputStream input, OutputStream output)
从输入流当中,读取数据,输出到输出流当中 返回值: the number of bytes copied, or -1 if > Integer.MAX_VALUE 被拷贝了多少个字节,如果发生错误的是,返回是-1 如果超过了2GB的话,返回值是Inter.MAX_VALUE
案例
- 利用IOUtils,改进图片下载Servlet
实现
package com.itheima.day09;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 告诉浏览器,这是一个附件,要下载,下载的文件名是download.gif
response.setHeader("Content-Disposition", "attachment; filename=download.gif");
// 获取浏览器字节输出流以及文件输入流
OutputStream out = response.getOutputStream();
InputStream in = new FileInputStream("/Users/LEAF/download.gif");
// IOUtils读取、写入
IOUtils.copy(in, out);
// 关闭流对象
in.close();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
5 小结
-
响应行
setStatus(int status)
sendError(500):会有错误信息
-
响应头
response.setHeader(String key, String value)
response.setContentType(String value)
sendRedirect(“url地址”)
转发:
1次请求
地址不变
服务器内部进行跳转
重定向:
2次请求
地址改变变
浏览器内部跳转
-
响应体
字节输出流
OutputStream getOutputStream()
字符输出流
PrintWriter getWriter()
-
乱码
请求
request.setCharacterEncoding(“utf-8”)
响应
setContentType(“text/html; charset=utf-8”)
-
IOUtils
IOUtils.copy()
第三部分 ServletContext
1 ServletContext是什么
Servlet用于与Web容器(Tomcat)通信的一组方法,对于每个Java虚拟机、每个Web应用都有一个上下文
2 ServletContext的获取方式
-
Servlet.getServletContext()
this为GenericServlet的派生类
-
request.getServletContext()
3 ServletContext的作用
获得Web应用资源下的文件路径【重点】
相关API
-
String getRealPath(String path)
获取真实路径
如果path当中的文件,不存在的话,还是会返回
-
InputStream getResourceAsStream(String path)
从资源当中获取一个输入流
如果path当中的文件,不存在的话,返回值是null
案例
- 利用getRealPath及getResourceAsStream,改进文件下载Servlet
实现
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>Servlet Download</h2>
<a href="download_sample?filename=file.txt">file.txt</a><br>
<a href="download_sample?filename=file.zip">file.zip</a><br>
<a href="download_sample?filename=搞笑.gif">搞笑.gif</a><br>
</body>
</html>
- DownloadServlet.java
package com.itheima.day09;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/download_sample")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取前端发过来的文件名参数
String filename = request.getParameter("filename");
// 告诉浏览器下载文件的文件名
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
// 获取字节输出流
OutputStream out = response.getOutputStream();
// 获取文件的输入流对象
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/" + filename);
System.out.println("Download:");
System.out.println(this.getServletContext().getRealPath("/WEB-INF/" + filename));
System.out.println();
// 利用IOUtils进行读取、写入
IOUtils.copy(in, out);
// 关闭流对象
in.close();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
下载中文文件错误解决
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("中文", "utf-8") + ".gif");
小结
-
String getRealPath(String path)
获取文件的绝对路径
获取真实路径
坑:只是单纯的字符串拼接,不做"文件是否存在"的检查
-
InputStream getResourceAsStream(String path)
获取资源作为流(输入流)
获得Web应用的全局初始化参数【了解】
参数设置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 设置参数 -->
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>pwd</param-value>
</context-param>
</web-app>
相关API
- String getInitParameter(String name)
- Enumeration getInitParameterNames()
实现
package com.itheima.day09;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "InitParamServlet")
public class InitParamServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 读取参数
ServletContext servletContext = this.getServletContext();
System.out.println("username: " + servletContext.getInitParameter("username"));
System.out.println("password: " + servletContext.getInitParameter("password"));
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
小结
-
设置全局初始化参数
在web.xml,
-
获取全局初始化参数
String(value) getInitParameter(String name)
【扩展】Servlet获取初始化参数
参数设置
- web.xml
<servlet>
<servlet-name>InitParamServlet</servlet-name>
<servlet-class>com.itheima.web.InitParamServlet</servlet-class>
<!-- Servlet初始化参数配置 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>13</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>InitParamServlet</servlet-name>
<url-pattern>/init_param</url-pattern>
</servlet-mapping>
相关API
- String getInitParameter(String name)
- Enumeration getInitParameterNames()
实现
- InitParamServlet
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
// 初始化参数相关的Servlet
public class InitParamServlet implements Servlet {
private ServletConfig config = null;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
config = servletConfig;
String name = servletConfig.getInitParameter("name");
String age = servletConfig.getInitParameter("age");
System.out.println(name);
System.out.println(age);
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("InitParamServlet被调用了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- InitParamServlet
// 初始化参数相关的Servlet
public class InitParamServlet implements HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = getInitParameter("name");
String age = getInitParameter("age");
System.out.println(name);
System.out.println(age);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
【重点】ServletContext是一个域对象
相关API
- setAttribute(String key, Object obj)
- Object getAttribute(String key)
- removeAttribute(String key)
案例
- 统计某Servlet的访问次数
实现
package com.itheima.day09;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/count_sample")
public class CountServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 统计这个Servlet的访问次数
// 把"访问次数"输出到浏览器
// 字符输出流当中有中文,设置编码
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
// 先获取上下文域对象
ServletContext context = getServletContext();
// 规定:"访问次数"的域 对象的名字:accessCount
// 规定:"accessCount"是整型
// 1. 如果第1次访问的,根本就没存,所以需要做判断
Integer accessCount = (Integer) context.getAttribute("accessCount");
if (accessCount == null) {
// 因为一次还要再加1,所以先给一个0
// 因为一会再加1之后,还需要设置回去,也就是调用setAttribute,所以,一起设置
accessCount = 0;
}
// 2. 每一次访问,"访问次数"取出来,加1,再存回去
accessCount ++;
// 3. 要统计的,把"访问次数"找个地方存
// 把这个数据存放的地方,定为服务器内部
// 选择域对象进行存储
// 在请求域和上下文域当中,做出选择
// 请求域:因为请求域使用的是request对象,request对象在每一次受浏览器访问时,都会创建一份新的
// 所以放到请求域当中,永远都是1
// 上下文域:在项目启动时创建,在项目卸载时销毁,有且只有1个
// 既然有且只有1个的话,那么这个数据,就可以放到上下文域当中
context.setAttribute("accessCount", accessCount);
out.write("<h1>此Servlet被访问了" + accessCount + "次</h1>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
4 ServletContext与Request域的对比
Context:上下文
ServletContext
上下文域
Request(HttpServletRequest)
请求域
上下文域,在Web应用被Web容器加载的时候被创建,在Web程序被卸载的时候被销毁。在Web应用程序内部有效
请求域 | 上下文域 | |
---|---|---|
创建 | 每一次被浏览器访问时创建 | 项目加载/启动/部署时 |
销毁 | 响应结束时 | 项目卸载/结束时 |
作用范围 | 1个用户的1个请求 | 所有用户的所有请求 |
5 小结
-
ServletContext的获取方式
getServletContext(); request.getServletContext();
-
ServletContext的作用
-
获得Web应用资源下的文件路径
String getRealPath("path"); InputStream getResourceAsStream("path")
-
获得Web应用的全局初始化参数
-
设置
param-name
param-value
-
获取
getInitParameter()
-
-
ServletContext是一个域对象【重点】
- Object getAttribute(String name)
- setAttribute(String key, Object object)
- removeAttribute(String key)
-
-
ServletContext的生命周期
项目启动
项目卸载
所有用户的所有请求
第四部分 学习目标总结
-
能够理解HTTP协议的响应部分
行
头
setHeader(String key, String value)
setContentType(String contentType)
sendRedirect(“url”)
体
getWriter
getOutputStream
-
能够应用Response对象的方法
response.setHeader(“Content-Type”, “text/html”)
response.setContentType(“text/html;charset=utf-8”)
sendRedirect(“资源地址”)
-
能够应用Response对象处理中文乱码
response.setContentType(“text/html; charset=utf-8”)
-
能够应用转发和重定向的方法
**转发:**request.getRequestDispatcher(“路径”).forward(request, response)
**重定向:**response.sendRedirect(“重定向的地址”)
-
能够应用Response对象完成文件下载代码
setHeader(“Content-Disposition”, “attachment; filename=1.gif”)
把中文转换成url广泛使用的一种英文
URLEncoder.encode(“中文字符串”, “utf-8”)
**完整写法:**setHeader(“Content-Disposition”,"attachment;filement= " + URLEncoder.encode(“下载”,“utf-8”) + “.jpg”)
-
【重点】能够使用ServletContext域对象
getServletContext()
setAttribute
getAttribute
removeAttribute()