WHCSRL 技术网

黑马JavaWeb学习笔记(二)

图片下载案例

  1. 获取请求参数,文件名称

    String filename = request.getParameter("filename")
    
    • 1
  2. 使用字节输入流加载文件进内存

    1. 找到文件服务器路径

      ServletContext servletContext = this.getServletContext()
      Sring realPath = servletContext.getRealPath("/img/"+filename)
      
      • 1
      • 2
    2. 用字节流关联

      FileInputStream fis = new FileInputSream(realPath);
      
      • 1
  3. 设置response响应头

    1. 设置响应头类型 content-type

      String mimeType = servletContext.getMimeType(filename);
      response.setHeader("content-type",mimeType)
      
      • 1
      • 2
    2. 设置响应头打开方式 Content-disposition

      response.setHeader("content-disposition","attachment;filename=" + filename)
      
      • 1
  4. 将输入流的数据写到输出流

    ServletOutputStream sos = response.getOuputStream();
    byte[] buff = new byte[1024*8]
    int len = 0;
    while((len = fis.read(buff)) != -1){
    	sos.write(buff,0,len);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

会话技术

  1. 会话:一次会话中包含多次请求和响应
    • 一次会话:浏览器第一次给服务器资源发送请求,服务器给浏览器进行一次回应
  2. 功能:再一次会话的范围内的多次请求间,共享数据
  3. 方式:
    1. 客户端会话技术:Cookie
    2. 服务器端会话技术:Session

客户端会话技术:Cookie

  1. 概念:客户端会话技术,将数据保存在客户端
  2. 使用步骤:
    1. 创建Cookie对象,绑定数据
      • new Cookie(name,value)
    2. 发送Cookie对象
      • response.addCookie(Cookie cookie)
    3. 接收Cookie对象,拿到数据
      • Cookie[] getCookies()
      • getName
      • getValue
  3. 实现原理
    • 基于响应头ser-cookie和请求头cookie实现
  4. cookie的细节
    1. 一次可不可以发送多个cookie
      • 可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可
    2. cookie在浏览器中保存多长时间
      1. 默认情况下,浏览器关闭会被销毁
      2. 持久化存储
        • setMaxAge(int seconds)
          1. 整数:将Cookie写到硬盘文件。持久化存储,存活时间
          2. 负数:默认,关闭就没
          3. 零:删除cookie信息
    3. cookie能不能存中文
      • tomcat 8 之前,cookie中不能直接存储中文数据
        • 需要将中文数据转码,一般采用URL编码
      • 在tomcat 8 之后,cookie支持中文数据,不支持特殊字符,需要用URL编码存储、解析
    4. cookie的共享问题
      1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目长cookie能不能共享
        • 默认情况不能共享
        • setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
          • 如果要共享,则可以将path设置为"/"
      2. 不同的tomcat服务器间cookie共享
        • serDomain(String path):如果设置一级域名相同,那么多个服务器间,cookie可以共享
    5. Cookie的特点和作用
      1. cookie存储数据在客户端浏览器
      2. 浏览器对于单个cookie的大小有限制,对同一域名下的cookie总数也有限制
      3. cookie一般用于存储少量不敏感的数据
      4. 在不登陆的情况下,完成服务器对客户端的身份识别

JSP(被淘汰了,不过了解一下还是对用框架有一定帮助)

概念:Java Server Pagers:java服务器端页面

  • 可以理解为一个特殊的页面,既可以写html标签也可以写java代码
  • 用于简化书写

原理:本质上就是一个Servlet

JSP脚本:JSP定义Java的方式

  • <%%%% 代码 %%%%>:定义Java代码,在service方法中。service方法中定义什么,该脚本就可以定义什么
  • <%%%%! 代码 %%%%>:定义java代码,定义成员(尽量不用,用的很少)
  • <%%%%= 代码 %%%%>:定义的java代码,会输出到页面上,输出语句中可以定义什么。

Session:服务器端会话技术

  1. 概念:服务器端会话技术,在一次会话中多次请求间共享数据,将数据保存在服务器对象中。HttpSession

  2. HttpSession

    • 获取session对象

      HttpSession session = request.getSeesion()
      
      • 1
    • 存储数据,使用对象

      Object msg = session.getAttribute(name)
      void setAttribute(name,value)
      void removeAttribute(name)
      
      • 1
      • 2
      • 3
  3. 原理:

    1. 客户端不关闭,服务器不关闭时,依赖于Cookie,通过生成Cookie保证多次获取的session为同一个

    2. 客户端不关闭,服务器关闭时,两次获取是session不是同一个

      • session的钝化:

        在服务器正常关闭之前,将session对象系列化到硬盘(写出)

      • session的活化:

        在服务器启动之后,将session文件转化到内存中的session对象即可(读入)

    3. session的失效时间

      1. 服务器关闭
      2. session对象调用自杀方法invalidate()
      3. session默认失效时间30分组,可以改
  4. 特点:

    1. session用于存储一次会话的多次请求数据,存储在服务器端
    2. session可以存储任意类型,大小的数据
    • session和cookie的区别
      1. session存在服务器端,cookie存在客户端
      2. session没有数据大小限制,cookie有
      3. session数据安全,cookie相对不安全

MVC开发模式

  1. 演变历史
    1. 早期只有servlet,没有jsp只能使用response输出标签数据,非常麻烦
    2. 后来有jsp,简化了Servlet开发,过度使用的话很难维护,分工
    3. 后来Javaweb开发借助MVC开发模式,使得程序的设计更加合理性
  2. MVC:
    1. M:Model,模型 JSP
      1. 业务逻辑操作
    2. V:View,视图 JavaBean
      1. 展示数据
    3. C:controller,控制器 Servlet
      1. 获取客户端输入
      2. 调用模型
      3. 将数据交给视图禅师
  3. 优缺点:
    1. 优点:耦合性低,利于维护,利于分工合作,重用性高
    2. 缺点:使得项目架构变得复杂,对开发人员要求高

EL表达式

  1. 概念:Expression Language 表达式语言

  2. 作用:替换和简化jsp页面中Java代码的编写

  3. 语法:${表达式}

    1. ${域名.键值}:从指定域中获取指定键的值

      • 域名称:
        1. pageScope --> pageContext
        2. requestScope --> request
        3. sessionScope --> session
        4. applicationScope -->application(ServletContext)
    2. ${域名}:表示依次从最小的域中获取值

    3. 获取对象、List集合、Map集合的值

      1. 对象:${域名.键名.属性值}

        本质上会调用对象的getter方法

      2. List集合:${域名.键名[索引]}

      3. Map集合:

        ${域名.键名.key名}

        ${域名.键名[“key名”]}

三层架构:软件设计架构

  1. 界面层(表示层/web层):用户看的界面。用户可以通过界面上的组件和服务器交互
    1. 控制器:Servlet,封装后调用业务逻辑层,再将数据返回给视图
  2. 业务逻辑层(service层):处理业务逻辑的
    1. 接受界面层的请求,到数据访问层获取数据返回
  3. 数据访问层(dao层,Data Access Object):操作数据存储文件
    1. 定义最基本的增删改查操作

Filter:过滤器

当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能

过滤器的作用:

  • 一般用于完成通用的操作。如:登录验证,编码统一处理、敏感字符过滤…

步骤:

  1. 定义一个类,实现接口Fileter
  2. 复写方法
  3. 配置拦截路径
    1. web.xml
    2. 注解

细节:

  1. web.xml配置
  2. 过滤器执行流程
    1. 执行过滤器
    2. 执行放行后的资源
    3. 回来执行过滤器的放行代码下边的代码
  3. 过滤器生命周期
    1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,用于加载资源(类似于C++的构造函数)
    2. doFilter:每一次请求被拦截资源时,会执行。执行多次
    3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,用于释放资源。(类似于C++的析构函数)
  4. 过滤器配置详解
    • 拦截路径配置:
      1. 具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
      2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
      3. 后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
      4. 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
    • 拦截方式配置:资源被访问到的方式
      1. 注解配置,设置dispatcherTypes属性
        1. REQUEST:默认值。浏览器直接请求资源
        2. FORWARD:转发访问资源
        3. INCLUDE:包含访问资源
        4. ERROR:错误跳转资源
        5. ASYNC:异步访问资源
      2. web.xml配置
  5. 过滤器链(配置多个过滤器)
    1. 执行顺序:如果有两个过滤器,过滤器1和过滤器2
      1. 过滤器1
      2. 过滤器2
      3. 资源执行
      4. 过滤器2
      5. 过滤器1
    2. 过滤器先后顺序的问题
      1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
        • 如:AFilter 和 BFilter,AFilter就先执行
      2. web.xml配置
  6. 增强对象的功能
    1. 装饰模式
    2. 代理模式
      • 概念:
        1. 真实对象:被代理的对象
        2. 代理对象:
        3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
      • 实现方法:
        1. 静态代理:有一个类文件描述代理模式
        2. 动态代理:在内存中形成代理类
          • 实现步骤:
            1. 代理对象和真实对象实现相同的接口
            2. 代理对象 = Proxy.newProxyInstace()
            3. 使用代理对象调用方法
            4. 增强方法
          • 增强方式:
            1. 增强参数列表
            2. 增强返回值类型
            3. 增强方法体执行逻辑

Listener监听器

web的三大组件之一

  • 事件监听机制
    • 事件:一件事情
    • 事件源:事件发生的地方
    • 监听器:一个对象
    • 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
  • ServletContextLinser:监听servletContext对象的创建和销毁
    • void contextDestroy(ServletContextEvent sce):ServletContext对象被销毁之前调用该方法
    • void contextInitialized(ServletContextEvent sce):ServletContext对象创建后会调用该方法

AJAX:

  1. 概念:ASynchronous Javascript And XML 异步的Javascript 和XML

    1. 异步和同步:客户端和服务器端

      • 同步:客户端必须等待服务器端的响应,在等待响应期间客户端不能做其他操作
      • 异步:客户端不需要等待服务器端的响应,在等待响应期间客户端可以做其他操作

      AJAX是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术

      通过在后端与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整个页面的情况下,对页面的某部分进行更新。

  2. 实现方式:

    1. 原生JS实现方式
    2. JQuery实现方式
      1. $.ajax()
        • 语法:$ajax({键值对});
        • url 地址
        • type 默认GET
        • data 传参,JSON格式
        • success
        • error
        • dataType:返回格式
      2. $.get()
        • 语法:$get(url。[data],[callback],[type])
      3. $.post()

JSON

  1. 概念:Javascript Object Notation Javascript对象表示法

    用于模拟对象对于数据的封装

    • json现在多用于存储和交换文本信息,进行信息传输
    • 比xml更小,传输更快,更易解析
  2. 语法:

    1. 基本规则
      • 数据在名称/值对中:json数据由键值对构成
      • 数据用逗号分隔
      • 花括号保存对象
      • 方括号保存数组
    2. 获取数据
      1. json对象.键名
      2. json对象[“键名”]
      3. 数组对象[索引]
  3. JSON数据和Java对象的互相转换

    • JSON解析器:
      • 常见的解析器:Jsonlib,Gson,fastjson,jackson
    1. JSON转为Java对象

      mapper.readValue(json,class)

    2. Java对象转换为JSON字符串

      1. 导入jackon的相关jar包

      2. 创建Jackson核心对象 ObjectMapper

      3. 转换

        writeValue(参数1:obj)

        • File:将obj对象转换为JSON字符串,并保存到指定的文件中
        • Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
        • OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中

        writeValueAsString(obj):将对象转换为json字符串

      4. 注解:

        1. @JsonIgnore:排除属性
        2. @JsonFormat:属性值的格式化
      5. 复杂对象转换

        1. List:数组
        2. Map:对象格式一致

Redis:数据库软件

  1. 概念:redis是一款高性能的NOSQL的非关系型数据库

    1. 数据之间没有关联关系
    2. 数据存储在内存中
    3. 一般将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据
  2. 命令操作

    1. redis的数据结构
      • redis存储的是:key,value格式的数据,键值对
        1. value的数据结构:
          1. 字符串 String
          2. 哈希类型 hash:map格式
          3. 列表类型 list 数据允许重复
          4. 集合类型 set 数据不允许重复
          5. 有序集合类型 sortedset 数据不允许重复,会自动排序
    2. 字符串类型 string
      1. 存储:set key value
      2. 获取:get key
      3. 删除:del key
    3. 哈希类型 hash map类型
      1. 存储:hset key field value
      2. 获取:
        • hget key field:获取指定的field对应的值
        • hgetall key:获取所有的field和value
      3. 删除:hedl key field
    4. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部(右边)
      1. 添加:
        1. lpush key value:将元素加入列表左表
        2. rpush key value:将元素加入列表右表
      2. 获取:
        • lrange key start end:范围获取
      3. 删除:
        • lpop key:删除列表最左边的元素,并将元素返回
        • rpop key:删除列表最右边的元素,并将元素返回
    5. 集合类型 set: 不允许重复
      1. 存储:sadd key value
      2. 获取:smembers key:获取set集合所有元素
      3. 删除:srem key value:删除set集合中的某个元素
    6. 有序集合类型 sortedset:不允许重复元素,且元素有顺序
      1. 存储:zadd key score value:
      2. 获取:zrange key start end
      3. 删除:zrem key value
    7. 通用命令
      1. keys *:查询所有的键
      2. type key:获取键对应的value类型
      3. del key:删除指定的key value
  3. 持久化

    1. redis是一个内存数据库,当redis服务器重启或电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中

    2. 持久化机制:

      1. RDB:默认方式

        • 在一定间隔时间中,检测key的变化情况,然后去持久化数据
        1. 编辑redis.windows.conf文件
        2. 重新启动redis服务器,并指定配置文件名称
      2. AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据

        1. 编辑redis.window.conf文件

          appendonly no(关闭aof) —> appendonly yes(开启aof)

          appendfync always:每一次操作都持久化

          appendfsync everysec:每隔一秒进行一次持久化

          appendfsync no:不进行持久化

  4. Java客户端 Jedis

    • Jedis:一款java操作redis数据库的jar包

    • 步骤

      1. 下载jedis的jar包

      2. 使用

        1. 获取连接

          new Jedis

        2. 使用

        3. 关闭连接

          jedis.close()

  5. 连接池:JedisPool

    • 使用:

      1. 创建JedisPool连接池对象

        new

      2. 获取连接

        Jedis jedis = jedispool。getResource();

      3. 关闭连接

Maven

同一套生命周期中,执行后边的操作,会自动执行前边的操作

坐标:被Maven管理的资源的唯一标识

  • groupId:组织名称
  • artifactId
  • version:版本

打包方式

  1. jar:java项目。默认值
  2. war:web项目
  3. pom
推荐阅读