笔记

一、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是咱们学习的第一个域对象,而且,ServletContext中存放的数据是所有用户共享的

ServletContext的作用(是咱们学的第一个域对象)

    1. 存取数据(重点掌握)
      • 存数据的方法setAttribute(“key”,value);
      • 取数据的方发getAttribute(“key”)
    1. 获取全局初始化参数(了解即可)
      • 在配置文件web.xml中设置初始化参数的方法
        在标签里,写入标签,在标签中可写入和标签分别用于放参数名和参数值。
      • 使用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应用 : 登录成功人次案例(非常重要)

icon

二、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编码

最低要求

1.掌握使用servletContext存取数据

2.掌握ServletContext的生命周期及作用范围

3.掌握Response的作用:设置状态码、设置响应头、设置响应体(重点)

4.掌握解决response的中文乱码问题。

5.完成统计登录成功次数的案例(一定要完成)

6.下载案例(1.使用输入流和输出流完成下载的基本操作,能完成图片和文本的下载,2.能够解决响应的中文乱码问题,针对bb.txt解决乱码 3.能够解决中文文件名乱码的问题,也就是完成黑马.png的下载(最好能完成))

作业

1.完成统计登录次数的案例。(每个人必须完成!!!!)
2.完成文件下载(使用超链接和自定义Servlet两种方式完成)(尽量完成)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值