一、ServletContext
ServletContext 是什么?
是服务器在启动的时候,为它(服务器)所托管的每一个项目都创建这个类(ServletContext)的实例, 并且整个项目中只有一个实例。 每一个应用只有一个ServletContext实例
获取ServletContext实例的方法
1.获取ServletContext的对象,有好多种方式
//方式1:直接在Servlet中写getServletContext();
ServletContext servletContext = getServletContext();
//方法2:
//ServletContext servletContext = getServletConfig().getServletContext();
//方法3:
//ServletContext servletContext = request.getServletContext();
ServletContext是咱们学习的第一个域对象,而且,ServletContext中存放的数据是所有用户共享的
ServletContext的作用(域对象)
-
-
存取数据
-
存数据的方法setAttribute("key",value);
-
取数据的方发getAttribute("key")
-
-
-
获取全局初始化参数
-
在配置文件web.xml中设置初始化参数的方法 在<web-app>标签里,写入<context-param>标签,在<context-param>标签中可写入<param-name>和<param-value>标签分别用于放参数名和参数值。
-
使用servletContext对象调用getInitParameter("参数名")获得相对应的参数值
-
使用ServletContext对象调用getInitParameterNames()方法,获得所有的参数名
-
-
-
获取项目资源的真实路径
-
servletContext对象调用getRealPath("路径")方法,可以获得文件的真实路径 getRealPath()获取的默认路径是tomcat安装路径下的webApps目录下的项目路径,然后找到该项目的WEB-INF目录,里面有个classes文件夹,src下的文件变异后全部放在该文件夹中。
-
-
4.将资源文件转换成流(重要)
-
getResourceAsStream("路径") 该方法类似classLoader的getResourceAsStream("路径")方法,但是该文件路径注意 ,必须写"/WEB-INF/classes/",因为它不会自动去编译后的文件目录中去找。
-
解决Properties文件中文乱码问题
-
解决properties文件编写时的中文乱码问题:修改properties文件的默认编码----window-->prefrences-->general-->content types-->text-->java properties file
-
解决读取properties文件时中文乱码问题:使用该行代码加载配置文件properties.load(new InpuStreamReader(当前类名.class.getClassLoader().getResourceAsStream(realPath), "UTF-8")))
ClassLoader(类加载器)
类加载器的作用是把类的字节码加载到java虚拟机里面去。所以我们可以通过类加载器去加载classes目录中的资源(该目录中的文件是编译后的文件) ,转化成输入流
getResourceAsStream("文件路径")方法,可以将编译后的classes目录中的文件转换成流。
此处的文件路径注意,不用写"/WEB-INF/classes/",因为类加载器默认就是去编译后的文件目录中去找。
ServletContext的作用范围 & 生命周期
作用范围(整个项目中所有用户共享的一个对象)
整个项目(可以理解成ServletContext在该项目中是个单例对象),但是A项目不能是用B项目的servletContext。 只能使用自己的。
生命周期
-
何时创建:服务器启动的时候创建
-
何时销毁: 关闭服务器的时候 或者 移除项目的时候
应用场景
用于所有用户共享数据。
ServletContext应用 : 登录成功人次案例(重要)
二、Response(响应)
Response的定义
响应对象,专门用于响应数据给客户端
响应对象的组成部分
-
响应行:协议版本、状态码、状态码的描述
-
200
-
302
-
403
-
404
-
500
-
-
响应头:有特别多,以键值对的形式存在的
-
ContentType:表示响应体的内容的类型
-
Location:重定向到的地址
-
-
响应体:给到用户显示或者下载的东西。------>通过流的形式将这些数据给客户端
Response的作用
-
-
设置响应行:setStatus(302),重定向相应行包含:状态码 状态码描述 http协议版本设置相应行,其实主要就是设置状态码response.setStatus(int ); 掌握这个方法即可
-
-
-
设置响应头设置响应头的方法很多,但是咱们常用的一般就是以下几个:
-
setHeader("name",value); 此处的name是http响应头的key部分
-
addHeader("name",value),添加响应头
-
setContentType("text/html;charset=UTF-8");该方法能一步解决response乱码的问题
-
setCharacterEncoding(String charset); //用于设置输出的内容是什么编码 ,一般不使用该方法了,因为上面的setContentType 已经包含这个方法的作用。
-
-
-
设置响应体(最重要)响应体其实就是服务器,想要传给客户端用于展示得数据。
服务器以什么形式将数据给客户端呢?------>以流的形式 两种方式:
1.response.getOutputStream(); 字节输出流:可以用于输出字符串、二进制数据等等 2.response.getWrite(); // 字符输出流:可以用于输出字符串
字节输出流和字符输出流的区别:字符输出流用于字符串!!!字节输出流用于写文件
-
解决response中文乱码问题:(重点)
-
方法一:分两步完成 //1.设置服务器响应给客户端的数据,使用什么编码 response.setCharacterEncoding("UTF-8");
//2.告诉浏览器,服务器送过来的是数据类型是什么,然后告诉浏览器,使用什么编码来查看。 response.setHeader("Content-Type", "text/html;charset=utf-8");
-
方法二:一步到位 //一步直接设置response的编码以及告诉浏览器以相同的编码来查看 response.setContentType("text/html;charset=utf-8");
下载文件
方法一:使用超链接进行下载,实际上就是Tomcat内部的内置Servlet帮助我们实现下载功能
服务器上的资源,放在webContet文件夹中。
直接将文件路径,放到超链接标签的href属性中。
它背后其实也是由Tomcat中内置的一个Servlet去实现的它内部的IO读写 操作,这个Servlet就是DefaultServlet
方法二:自己写Servlet然后以流的形式,将文件读取成输入流,然后再以输出流的形式写给客户端
读写流的操作代码:
//获取客户端传过来的参数
String filename = req.getParameter("filename");
resp.setContentType("text/html;charset=utf-8");
有一些文件是无法直接展示得,需要下载,那么需要给用户一个友好的提示,到底是打开还是下载呢?
response.setHeader("Content-Disposition" , "attachment; filename="文件名");
//获得文件名之后,将文件转换成输入流
InputStream inputStream = getServletContext().getResourceAsStream("/download/"+filename);
//然后边读边写,将该输入流写给客户端
ServletOutputStream outputStream = resp.getOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while((len = inputStream.read(buffer)) != -1){
outputStream.write(buffer, 0, len);
}
中文文件名处理(request中的中文乱码问题)
-
第一步:先将获得到的中文文件名字符串,转换成字节数组(以ISO8859-1编码),filename.getBytes("ISO8859-1");
-
第二步:再将字节数组以UTF-8编码转换成字符串new String(bytes,"UTF-8");这样就得到了utf-8编码的文件名。
-
第三步:如果是文件下载,才有第三步,要分浏览器进行处理,如果浏览器是火狐浏览器:那么需要对文件名使用Base64进行编码;如果是其它浏览器:那么需要对该文件名使用urlEncoder编码