ServletContext、ServletContext的作用范围 & 生命周期、Response(响应)、解决Properties文件中文乱码问题、ServletContext应用 :登录次数统计

版权声明:非经本人允许,禁止转载 https://blog.csdn.net/Kfie66/article/details/82346880

一、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的作用(域对象)

    1. 存取数据

    • 存数据的方法setAttribute("key",value);

    • 取数据的方发getAttribute("key")

    1. 获取全局初始化参数

    • 在配置文件web.xml中设置初始化参数的方法 在<web-app>标签里,写入<context-param>标签,在<context-param>标签中可写入<param-name>和<param-value>标签分别用于放参数名和参数值。

    • 使用servletContext对象调用getInitParameter("参数名")获得相对应的参数值

    • 使用ServletContext对象调用getInitParameterNames()方法,获得所有的参数名

    1. 获取项目资源的真实路径

    • 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的作用

    1. 设置响应行:setStatus(302),重定向相应行包含:状态码 状态码描述 http协议版本设置相应行,其实主要就是设置状态码response.setStatus(int ); 掌握这个方法即可

    1. 设置响应头设置响应头的方法很多,但是咱们常用的一般就是以下几个:

    • setHeader("name",value); 此处的name是http响应头的key部分

    • addHeader("name",value),添加响应头

    • setContentType("text/html;charset=UTF-8");该方法能一步解决response乱码的问题

    • setCharacterEncoding(String charset); //用于设置输出的内容是什么编码 ,一般不使用该方法了,因为上面的setContentType 已经包含这个方法的作用。

    1. 设置响应体(最重要)响应体其实就是服务器,想要传给客户端用于展示得数据。

    服务器以什么形式将数据给客户端呢?------>以流的形式 两种方式:

    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编码​

 

猜你喜欢

转载自blog.csdn.net/Kfie66/article/details/82346880