javaweb 学习笔记

javaweb

java程序中获取src目录的文件路径:

String path = 当前类的名称.class.getClassLoader().getResource("users.xml").getPath();

servlet (server applet)

概念:运行在服务器端的小程序

  • servlet 就是一个接口,定义了java类被浏览器访问(Tomcat识别)到的规则
  • 将来我们自定义一个类,实现servlet接口,复写方法

执行原理:

  1. 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的标签体内容
  3. 如果有,则再找到对应的全类名
    
  4. Tomcat会将字节码文件加载进入内存,并创建其对象
  5. 调用其方法
    

servlet中的生命周期:

  1. 被创建:执行init方法,只执行一次

    • Servlet什么时候被创建?
      • 默认情况下,第一次被访问时,Servlet被创建

      • 可以配置指定Servlet的创建时期

        • 在标签下配置
        1. 第一次被访问时,创建
        • 的值为负数

            2. 在服务器启动时,创建
          
        • 的值为0或正整数

    • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,servlet是单例的
      • 多个用户同时访问时,可能存在线程安全问题。
      • 解决:尽量不要在servlet中定义成员变量,即使定义了成员变量,也不要对其修改值
  2. 提供服务:执行service方法,执行多次

    • 每次访问Servlet时,servlet方法都会被调用一次。
  3. 被销毁:执行destroy方法,只执行一次

    • servlet被销毁时执行,服务器关闭时,servlet被销毁
    • 只有服务器正常关闭时,才会执行
    • destroy方法在servlet被销毁之前执行,一般用于释放资源

servlet的体系结构

servlet --> 接口
	| 
GenericServlet --> 抽象类
	|
HttpServlet --> 抽象类
  • GenericServlet: 将servlet接口中其他的方法做了默认空实现,只经service()方法作为抽象,
    • 将来定义servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

servlet的相关配置

  1. urlpartten:servlet的访问路径
    1. 一个servlet可以定义多个访问路径: @WebServlet({"/d2", “/dd2”, “/ddd2”})
  2. 路径的定义规则:
    1. /xxx
    2. /xxx/xxx:多层路径,目录结构
    3. *.do

HTTP

概念

概念:Hyper Text Transfer Protocol 超文本传输协议

  • 传输协议:定义了客户端和服务器端通信时,发送数据的格式

  • 特点:

    1. 基于TCP/IP的高级协议
    2. 默认端口号是80
    3. 基于请求/响应模型的: 一次请求对应一次响应
    4. 无状态的:每次请求之间相互独立,不能交互数据
  • 历史版本:

    • 1.0:每一次请求响应都会建立新的连接
    • 1.1:复用连接

请求消息数据格式

  1. 请求行
    请求方式 请求url 请求协议/版本
    GET /login.html HTTP/1.1

    • 请求方式:
      • HTTP协议有七种请求方式,常用的有两种
        • GET:
          1. 请求参数在请求行中,在url后。
          2. 请求的url长度是有限制的
          3. 不太安全
        • POST:
          1. 请求参数在请求体中
          2. 请求的url长度是没有限制的
          3. 相对安全
  2. 请求头:客户端浏览器告诉服务器一下信息

    请求头名称:请求头值

    • 常见的请求头:
      1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
        • 可以在服务端获取该头的信息,解决浏览器的兼容性问题
      2. Referer:http://localhost/login.html
        • 告诉服务器,当前请求从哪里来?
          • 作用:
            1. 防盗链:
            2. 统计工作:
  3. 请求空行

    • 空行,就是用于分割POST请求头和请求体的。
  4. 请求体(正文):

    • 封装POST请求消息的请求参数的。
  • 字符串表现形式
POST  /login.html  HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1

username=zhangsan

响应消息数据格式

  1. 响应行
    1. 组成:协议/版本 响应状态码 状态码描述
    2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
      1. 状态码都是3位数字
      2. 分类:
        1. 1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx多的状态码
        2. 2xx:成功,代表:200
        3. 3xx:重定向。代表:302(重定向) 304(访问缓存)
        4. 4xx:客户端错误。
          • 代表:
            • 404(请求路径没有对应的资源)
            • 405(请求方式没有对应的doXxx方法)
        5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
  2. 响应头
    1. 格式:头名称:值
    2. 常见的响应头:
      1. Content-Type:服务器告诉客户端本次响应消息体数据格式以及编码格式
      2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
        • 值:
          • in-line:默认值,在当前页面内打开
          • attachment;fileNama=xxx:以附件形式打开响应体。文件下载
  3. 响应空行
  4. 响应体:传输的数据
  • 响应字符串格式
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT


  
    $Title$
  
  
  hello , response
  

Request

  1. request对象和response对象的原理

    1. request和response对象是由服务器创建的,我们来使用它们而已
    2. request对象是来获取请求消息,response对象是来设置响应消息
  2. request对象继承体系结构:

    ServletRequest -- 接口
    	| 继承
    HttpServletRequest --接口
    	| 实现
    org.apache.catalina.connector.RequestFacade -- 类(Tomcat实现)
    
  3. request功能:

    1. 获取请求消息数据
      1. 获取请求行数据
        • GET /day14/demo1?name=zhangsan HTTP/1.1
        • 方法:
          1. 获取请求方式:GET
            • String getMethod()
          2. 获取虚拟目录:/day14
            • String getContextPath()
          3. 获取Servlet路径:/demo1
            • String getServletPath()
          4. 获取get方式请求参数:name=zhangsan
            • String getQueryString()
          5. 获取请求URI: /day14/demo1
            • String getRequestURI():/day14/demo1
            • String getRequestURL():http://localhost/day14/demo1
            • URL:统一资源定义符:http://localhost/day14/demo1
            • URI:统一资源表示符:/day14/demo1
          6. 获取协议及版本:HTTP/1.1
            • String getProtocol()
          7. 获取客户机的IP地址:
            • String getRemoteAddr()
      2. 获取请求头数据
        • 方法:
          • String getHeader(String name):通过请求头的名称获取请求头的值
          • Enumeration getHeaderNames():获取所有请求头的名称
      3. 获取请求体数据
        • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求参数
        • 步骤:
          1. 获取流对象
            • BufferedReader getReader():获取字符输入流,只能操作字符数据
            • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据
          2. 再从流对象中拿数据
    2. 其他功能
      1. 获取请求参数通用方式

        1. String getParameter(String name):根据参数名称来获取参数值
        2. String[] getParameterValues(String name):根据参数名称来获取参数值的数组
        3. Enumeration getParameterNames():获取所有的请求的参数名称
        4. Map getParameterMap():获取所有参数的map集合
        • 中文乱码问题
        • get方式:Tomcat8已经将get方式乱码问题解决了
        • post方式:会乱码
        • 解决:在获取参数前,设置request的编码request.setCharacterEncoding("UTF-8");
      2. 请求转发:一种在服务器内部的资源跳转方式

        1. 步骤:
          1. 通过request对象获取请求请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
          2. 使用RequestDispatcher 对象来进行转发:forward(ServletRequest request, ServletResponse response)
        2. 特点:
          1. 浏览器地址栏路径不发生变化
          2. 只能转发到当前的服务器内部资源中
          3. 转发是一次请求
      3. 共享数据

        • 域对象:一个有作用范围的对象,可以在范围内共享数据
        • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        • 方法:
          1. void setAttribute(String name,Object obj):存储数据
          2. Object getAttribute(String name):通过键获取值
          3. void removeAttribute(String name):通过键移除键值对
      4. 获取ServletContext

        • ServletContext getServletContext()
      5. BeanUtils工具类,简化数据封装

        • 用于封装JavaBean的
        1. JavaBean:标准的java类

          1. 要求:
            1. 类必须被public修饰
            2. 必须提供空参的构造器
            3. 成员变量必须使用private修饰
            4. 提供公共setter和getter方法
          2. 功能:封装数据
        2. 概念:

          ​ 成员变量:

          ​ 属性:setter和getter方法截取后的产物

          ​ 例如:

          getUsername() -> Username -> username

        3. 方法:

          1. setProperty()
          2. getProperty()
          3. populate(Object obj, Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

Response

  • 功能:设置响应消息的

    1. 设置响应行
      1. 格式:HTTP/1.1 200 OK
      2. 设置状态码:setStatus(int sc)
    2. 设置响应头:setHeader(String name, String value)
    3. 设置响应体:
      • 使用步骤:
        1. 获取输出流
          • 字符输出流:PrintWriter getWriter()
          • 字节输出流:ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器中
  • 重定向:资源跳转的方式

    • 代码实现:
    // 简单的重定向方法
    response.sendRedirect("/response/responseDemo2");
    
    // 设置状态码
    response.setStatus(302);
    // 设置重定向地址
    response.setHeader("location","/response/responseDemo2");
    
    • 重定向的特点:redirect

      1. 地址栏发生变化
      2. 重定向可以访问其他站点(服务器)的资源
      3. 重定向是两次请求,不能使用request对象来共享数据
    • 转发的特点:forward

      1. 转发地址栏路径不变
      2. 转发只能访问当前服务器下的资源
      3. 转发是一次请求,可以使用request对象来共享数据
    • 路径写法

      1. 路径分类:

        1. 相对路径:通过相对路径不可以确定唯一资源

          • 如:./index.html

          • 不以/开头,以.开头

          • 规则:找到当前资源和目标资源之间的相对位置关系

            • ./:当前目录
            • ../:后退一级目录
        2. 绝对路径:通过绝对路径可以确定唯一资源

          • 如:http://localhost:8080/response/responseDemo2 /response/responseDemo2

          • /开头的路径

          • 规则:判断定义的路径是给谁用的?判断请求将来从那发出

            • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
              • 建议虚拟目录动态获取:request.getContextPath()
              • ,,重定向…
            • 给服务器使用:不需要加虚拟目录
              • 转发路径
  • 服务器输出字符数据到浏览器

    • 步骤:

      1. 获取字符输出流
      2. 输出数据
    • 注意:

      • 乱码问题:

        1. response.getWriter();获取流的默认编码是ISO-8859-1的

        2. 设置该流的默认编码

        3. 告诉浏览器响应体使用的编码

          // 简单的形式,设置编码,是在获取流之前设置
          
          response.setContentType("text/html;charset=utf-8");
          
  // 获取流对象之前,设置流的默认编码 可省略
  // response.setCharacterEncoding("UTF-8");
  
  // 告诉浏览器,服务器发生的消息体数据的编码,建议浏览器使用该编码解码
  response.setHeader("Content-type","text/html;charset=utf-8");
  
  // 简单的形式,设置编码
  response.setContentType("text/html;charset=utf-8");
  
  response.getWriter().write("

你好,response

"
);
  • 服务器输出字节流到浏览器
response.getOutputStream().write("你好,response".getBytes());

ServletContext

概念:代表了整个web应用,可以和程序的容器(服务器)来进行通信

获取:

  1. 通过request对象获取
    request.getServletContext();

  2. 通过HttpServlet获取:

    this.getServletContext();

功能:

  1. 获取MIME类型

    • MIME类型:在互联网通信过程中定义的一种文件数据类型
      • 格式:大类型/小类型 text/html
    • 获取:String getMimeType(String file)
  2. 域对象:共享数据

    1. setAttribute(String name,Object value)

    2. getAttribute(String name)

    3. removeAttribute(String name)

    • ServletContext对象范围:所有用户所有请求的数据
  3. 获取文件的真实(服务器)路径

    1. 方法:String getRealPath(String path)

会话技术

  1. 会话:一次会话中包含多次请求和响应。

    • 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直达有一方断开为止
  2. 功能:在一次会话的范围内的多次请求间,共享数据

  3. 方式:

    1. 客户端会话技术:Cookie
    2. 服务器端会话技术:Session

Cookie

  1. 概念:客户端会话技术,将数据保存到客户端

  2. 快速入门:

    • 使用步骤:
    1. 创建Cookie对象,绑定数据
      • new Cookie(String name, String value)
    2. 发送Cookie对象
      • response.addCookie(Cookie cookie)
    3. 获取Cookie,拿到数据
      • Cookie[] request.getCookies()
  3. 实现原理

  • 基于响应头set-cookie和请求头cookie实现
  1. cookie的细节:

    1. 一次可以不可以发生多个cookie?

      • 可以
      • 可以创建多个Cookie对象,使用response调用多次addCookie方法发生cookie即可
    2. cookie在浏览器中保存多少时间?

      1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
      2. 持久化存储:
        • setMaxAge(int seconds)
          1. 正数:将cookie数据写到硬盘的文件中。持久化存储,cookie存活时间。
          2. 负数:默认值
          3. 零:删除cookie信息
    3. cookie能不能存中文?

      • 在Tomcat 8之前cookie中不能直接存储中文数据。
        • 需要将中文数据转码,一般采用url编码(%E3)
      • 在Tomcat 8之后cookie支持中文数据。
    4. cookie共享问题?

      1. 假设在一个Tomcat服务器中,部署了多个web项目,那么在这些web项目中能不能共享?

        • 默认情况下不能共享
      • setPath(String path):设置cookie的获取范围,默认情况下,设置当前的虚拟目录
        • 如果要共享,则可以将path设置为/
      1. 不同的Tomcat服务器间cookie共享问题?
    • setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享了
      - setDomain(".baidu.com"),那么tieba.baidu.comnews.baidu.com中cookie可以共享
  2. cookie的特点和作用

    1. cookie存储数据在客户端浏览器
    2. 浏览器对应单个cookie的大小有限制(4kb),以及对同一个域名下的总cookie数量也有现在(20)
    • 作用:
      1. cookie一般用于少量的不太敏感的数据
      2. 在不登录的情况下,完成服务器对客户端的身份识别

jsp:入门学习

  1. 概念:

    • java servlet pages:java服务器端页面
      • 可以理解为:一个特殊的页面,其中既可以指定定义HTML标签,有可以定义java代码
      • 用于简化书写!!!
  2. 原理:

    • jsp本质上就是一个servlet
  3. jsp的脚步:JSP定义java代码的方式

    1. <% 代码 %>:定义的java代码在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
    2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
    3. <%= 代码 %>:定义的java代码,会输出到页面上,输出语句中可以定义什么,该脚本中就可以定义什么。
  4. jsp的内置对象

    • 在jsp页面中不需要获取和创建,可以直接使用的对象
    • jsp一个有9个内置对象。
    • 今天学习三个:
      • request
      • response
      • out:字符输出流对象,可以将数据输出到页面上,和response.getWriter()类似
        • response.getWriter()out.write()的区别:

Session

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

  2. 快速入门:

    1. 获取HttpSession对象:

      HttpSession request,getSession()

    2. 使用HttpSession对象:

    Object getAttribute(String name)

    void setAttribute(String name, Object value)

    void removeAttribute(String name)

  3. 原理:

  • Session的实现时依赖于Cookie的。
  1. 细节:

    1. 当客户端关闭后,服务器不关闭,那么两次获取Session是否为同一个?
      • 默认情况下,不是
    • 如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。

       Cookie c = new Cookie("JSESSIONID",session.getId());
       c.setMaxAge(60*60);
       response.addCookie(c);
      
    1. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

      • 不是同一个,但是要确保数据不丢失
        • session的钝化:
          • 在服务器正常关闭之前,将session对象序列化到硬盘上
        • session的活化:
          • 在服务器启动后,将session文件转化为内存中的session即可。
    2. session什么时候被销毁?

      1. 服务器关闭

      2. session对象调用invalidate()

      3. session默认失效时间 30分钟

        ​ 选择性的配置修改

        <session-config>
            <session-timeout>30session-timeout>
        session-config>
        
  2. session的特点

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

jsp

指令

  • 作用:用于配置jsp页面,导入资源文件

  • 格式:

    <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %
    
  • 分类:

    1. page :配置jsp页面的
      • contentType:等同于response.setContentType()
        1. 设置响应体的mime类型以及字符集
        2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低价工具,则需要设置pageEncoding属性设置当前页面的字符集编码)
      • import:导包
      • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
      • isErrorPage:表示当前页面是否是错误页面
        • true:是,可以使用内置对象exception
        • false:否,默认值,不可以使用内置对象exception
    2. include :页面包含的,导入页面的资源文件
    3. taglib :导入资源

注解

  1. html注释:
    :只能注释html代码片段
  2. jsp注释:推荐使用
    <%-- --%>:可以注释所有

内置对象

  • 在jsp页面中不需要创建,直接使用的对象
    • 一共有9个:
      变量名 真实类型 作用
      • pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
      • request HttpServletRequest 一次请求访问的多个资源(转发)
      • session HttpSession 一次会话的多个请求间
      • application ServletContext 所有用户间共享数据
      • response HttpServletResponse 响应对象
      • page Object 当前页面(Servlet)的对象 this
      • out JspWriter 输出对象,数据输出到页面上
      • config ServletConfig Servlet的配置对象
      • exception Throwable 异常对象

EL表达式

  • 概念:Expression Language 表达式语言

  • 作用:替换和简化jsp页面中java代码的编写

  • 语法:${表达式}

  • 注意:

    • jsp默认是支持EL表达式的,如果要忽略el表达式
      1. 设置jsp中page指令中的isELIgnored="true"忽略当前jsp页面中所有的el表达式
      2. \${表达式}:忽略当前这个el表达式
  • 使用:

    1. 运算:

      • 运算符:
        1. 算数运算符:+ - * /(div) %(mod)
        2. 比较运算符:> < >= <= == !=
        3. 逻辑运算符:&&(and) ||(or) !(not)
        4. 空运算符:empty
          • 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0
          • ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
          • ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
    2. 获取值

      1. el表达式只能从域对象中获取值

      2. 语法:

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

          • 域名称:

            1. pageScope --> pageContext
            2. requestScope --> request
            3. sessionScope --> session
            4. applicationScope --> application(ServletContext)
          • 举例:在request域中存储了name = 张三

          • 获取:${requestScope.name}

        2. ${键名称}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止

        3. 获取对象,list集合,map集合的值

          1. 获取对象、List集合、Map集合的值
            1. 对象:${域名称.键名.属性名}
              * 本质上会去调用对象的getter方法

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

            3. Map集合:

            • ${域名称.键名.key名称}
            • ${域名称.键名[“key名称”]}
      3. 隐式对象:

        • el表达式中有11个隐式对象
        • pageContext:
          • 获取jsp其他八个内置对象
            • ${pageContext.request.contextPath}:动态获取虚拟目录

JSTL标签

  • 概念:JavaServer Pages Tag Library JSP标准标签库

    • 是由Apache组织提供的开源的免费的jsp标签
  • 作用:用于简化和替换jsp页面上的java代码

  • 使用步骤:

    1. 导入jstl相关jar包
    2. 引入标签库:taglib指令
    3. 使用标签
  • 常用的JSTL标签

    1. if:相当于java代码的if语句

      1. 属性:
        • test 必须属性,接受boolean表达式
          • 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
          • 一般情况下,test属性值会结合el表达式一起使用
      2. 注意:
        - c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
    2. choose:相当于java代码的switch语句

    3. 使用choose标签声明 相当于switch声明
      2. 使用when标签做判断 相当于case
      3. 使用otherwise标签做其他情况的声明 相当于default

    4. foreach:相当于java代码的for语句

Filter:过滤器

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

  • 作用:

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

    1. 步骤:
      1. 定义一个类,实现接口Filter
      2. 复写方法
      3. 配置拦截路径
        1. web.xml
        2. 注解
  • 细节:

    1. web.xml配置

      <filter>
           <filter-name>demo1filter-name>
           <filter-class>cn.itcast.web.filter.FilterDemo1filter-class>
       filter>
      <filter-mapping>
           <filter-name>demo1filter-name>
      	
           <url-pattern>/*url-pattern>
       filter-mapping>
      
    2. 过滤器执行流程

    3. 执行过滤器

    4. 执行放行后的资源

    5. 回来执行过滤器放行代码下边的代码

    6. 过滤器生命周期方法

    7. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源

    8. doFilter:每一次请求被拦截资源时,会执行。执行多次

    9. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

    10. 过滤器配置详解

      • 拦截路径配置:
        1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
        2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
        3. 后缀名拦截: .jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
        4. 拦截所有资源:/
        访问所有资源时,过滤器都会被执行
        • 拦截方式配置:资源被访问的方式
          • 注解配置:
            • 设置dispatcherTypes属性
              1. REQUEST:默认值。浏览器直接请求资源
              2. FORWARD:转发访问资源
              3. INCLUDE:包含访问资源
              4. ERROR:错误跳转资源
              5. ASYNC:异步访问资源
          • web.xml配置
            • 设置标签即可
      1. 过滤器链(配置多个过滤器)
        • 执行顺序:如果有两个过滤器:过滤器1和过滤器2

          1. 过滤器1
          2. 过滤器2
          3. 资源执行
          4. 过滤器2
          5. 过滤器1
        • 过滤器先后顺序问题:

          1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
            • 如: AFilter 和 BFilter,AFilter就先执行了。
          2. web.xml配置: 谁定义在上边,谁先执行
  • 设计模式:一些通用的解决固定问题的方式
    1. 装饰模式
    2. 代理模式
    * 概念:
    1. 真实对象:被代理的对象
    2. 代理对象:
    3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
    * 实现方式:
    1. 静态代理:有一个类文件描述代理模式
    2. 动态代理:在内存中形成代理类
    * 实现步骤:
    1. 代理对象和真实对象实现相同的接口
    2. 代理对象 = Proxy.newProxyInstance();
    3. 使用代理对象调用方法。
    4. 增强方法

      				* 增强方式:
      					1. 增强参数列表
      					2. 增强返回值类型
      					3. 增强方法体执行逻辑
    

redis

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

  • 数据结构:

    • redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构
    • value的数据结构:
      1. 字符串类型:string
      2. 哈希类型:hash
      3. 列表类型:list
      4. 集合类型:set
      5. 有序集合类型:sortedset
  • 命令:

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

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

    2. redis持久化机制:

      1. RDB:默认方式,不需要进行配置,默认就使用这种机制

        • 在一定的间隔时间中,检测key的变化情况,然后持久化数据
        1. 编辑redis.windows.conf文件

          #   after 900 sec (15 min) if at least 1 key changed
          save 900 1
          #   after 300 sec (5 min) if at least 10 keys changed
          save 300 10
          #   after 60 sec if at least 10000 keys changed
          save 60 10000
          
        2. 重新启动redis服务器,并指定配置文件名称

          D:\JavaWeb2018\day23_redis\资料\redis\windows-64\redis-2.8.9>redis-server.exe redis.windows.conf	
          
      2. AOF:日志记录方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据

        1. 编辑redis.windwos.conf文件
            appendonly no(关闭aof) --> appendonly yes (开启aof)
            
            # appendfsync always : 每一次操作都进行持久化
            appendfsync everysec : 每隔一秒进行一次持久化
            # appendfsync no	 : 不进行持久化
        

你可能感兴趣的:(javaweb 学习笔记)