• Fileter过滤器的使用及小案例


    回顾:

    EL:表达式语言,替代<%= %>
    ${表达式}
    表达式中的数据除了常量必须来自于域中
    取得域中数据 : pageScope/requestScope/sessionScope/applicationScope
    param/paramValues/header/headerVlaues/pageContext/cookie/initParam
    empty:判空
    数值:0
    对象:null
    字符串:" "
    集合: 长度是否为0
    在EL表达式中不区分单引号和双引号,只要有引号,就算字符串
    JSTL:JSP标准标签库:开发的一些有java语言实现的标签.主要是用一些自定的标签来实现页面中的程序的流程控制(分支.循环)

    如何使用JSTL:
    导包 : jstl.jar standard.jar
    在页面引入:<%@ taglib uri=" " prefix=" " %>
    常用标签
    < c:if test="结果为布尔值的表达式" >没有ELSE.
    <c:forEach>
    var:遍历的当前对象(保存在page域的)
    items:被遍历的集合(EL表达式)
    ------------------------------------------------
    var:循环控制变量
    begin:起始值
    end:结束值(闭区间)
    step:步长
    --------------------------------------------------
    varStatus:封装了当前循环的状态的对象
    index:索引,从0开始
    count:计数.从1开始
    first:当前是否是第一次
    last:当前是否是最后一次
    在JSP开发中使用JSTL和EL来替代之前所学的所有JSP的脚本


    Filter : 过滤器 : 相当于门卫

    功能:决定请求是否通过过滤器到达原本要访问的目标
    权限控制
    预处理和后处理
    如何开发一个过滤器:(增强型的servlet)
    创建一个类,实现javax.servlet.Filter
    在web.xml中配置注册

    过滤器的生命周期:(单例)
    创建:服务器启动
    销毁:服务器关闭(正常关闭才会调用destroy方法)


    3.案例一:自动登录:
    3.1.需求分析:在访问网站的首页时,可以实现自动登录(不用输入用户名和密码,直接进入“已登录”状态)。在访问一个网站时,右上角“登录、注册”超链接,如果点登录,转跳到登录页面。登录成功后回到首页,右上角显示“用户姓名”等信息,代表当前用户是“已登录”状态。
    3.2.技术分析:
    3.2.1.如何区分当前的状态是已登录还是未登录?把用户信息保存到Session域,域中有用户信息说明已登录,没有则说明未登录。
    3.2.2.(在之前的某次登录中勾选了“自动登录”,之后再次访问首页时)在请求到达IndexServlet之前,就已经进入“已登录”状态,登录的工作只能在请求到达Servlet之前进行,所以只能是过滤器的预处理。也就是说要在过滤器的预处理中进行调用业务逻辑登录验证的工作。也就是说,需要把用户名和密码在某个地方保存一段时间(一周),断电不消失,所以只能使用Cookie。
    3.2.3.
    3.3.步骤分析:
    3.3.1.正确的登录过程
    3.3.2.业务逻辑在进行登录的验证的时候,不能再返回布尔值。所以改为返回用户对象(User),如果用户名密码正确,则说明登录成功,则返回用户对象(用于保存到Session的),如果登录失败,则返回null。
    3.3.3.如果登录成功,且勾选了自动登录,则把用户名和密码保存到Cookie中。并设置有效期为一周。
    3.3.4.Servlet中如果登录成功,则把用户对象保存到Session中,名为current_user。返回首页
    3.3.5.JSP的页面中,右上角去Session中取得用户对象,如果得到说明当前是已登录状态,则显示用户的姓名。否则显示“登录、注册”超链接
    3.3.6.创建一个过滤器(专门进行自动登录),从Cookie中取出用户名和密码,调用业务逻辑进行登录验证,如果登录成功,则把用户对象保存到Session,名为current_user。然后放行。如果登录失败,直接放行。
    3.4.注意:这种功能必须提示用户,只能在个人电脑上进行。


    4.案例二:统一解决中文乱码问题
    4.1.需求分析:以前在写代码时,每个Servlet都要处理中文问题(请求的、响应的),现在可以使用过滤器,对所有Servlet都进行统一的预处理来解决中文乱码问题。
    4.2.技术分析:
    4.2.1.用过滤器过滤所有请求,对请求和响应的字符集进行设置。
    4.2.2.所以要解决GET方式的乱码问题,只能想办法增强request对象的getParameter方法,让方法中对原值进行重新编码
    4.2.3.然后再把增强后的request对象放行过去。这样,Servlet接收到的就是增强后的Request对象,这时在Servlet中
    4.2.4.调用getParameter方法时,调用的就是增强后的方法,在方法内进行了重新编码 ,就能得到正确结果了。
    4.2.5.如何增强一类的方法:
    4.2.5.1.继承:必须知道实现类才能继承,只知道接口是无法继承的
    4.2.5.2.装饰者模式
    4.2.5.2.1.实现和被增强类一样的接口
    4.2.5.2.2.持有被增强类的对象(为了能够调用原始方法)
    4.2.5.3.动态代理


    4.3.步骤分析:
    4.3.1.创建一个过滤器,在过滤器放行前,设置请求和响应的字符集。

    总结:
    Filter : 过滤器
    如何开发一个过滤器:
    创建一个类实现javax.servlet.Filter接口
    在web.xml中配置注册Filter(方式和servlet类似,注意:url-pattern匹配上的所有请求都要经过此过滤器)

    过滤器的生命周期:
    创建:项目启动
    销毁:项目关闭(只有正常关闭才会调用destroy方法)
    运行期间:Filter是单例的
    运行顺序:
    按照web.xml配置文件的顺序依次运行Filter的预处理
    请求到达目标处理完成后,在逆序依次运行Filter的后处理.
    功能:可以对请求和响应进行预处理,后处理,放行操作(不放行).
    作用:
    权限控制
    预处理(字符集,自动登录)和后处理(页面静态化,响应内的压缩).

  • 相关阅读:
    领会一些比较巧妙的算法
    操作系统os常识
    C++中的继承与虚函数各种概念
    我学shell程序的记录
    matlab:linux环境中将m文件编译成动态链接库
    struct内存对齐:gcc与VC的差别
    fedora中丢失或损坏fstab,无法启动,如何补救
    判断一个字符串中的字符是否都在另一个中出现
    linux下的不错的小软件:apvlv,zathura和vifm
    C语言中将结构体写入文件
  • 原文地址:https://www.cnblogs.com/jia-/p/7381268.html
Copyright © 2020-2023  润新知