五、AJAX技术
1、ajax的概念和作用
(1)概念:异步的 xml 和 js;
(2)作用:局部刷新技术;
(3)原理:
- 通过 xhr 对象发送请求,响应并不直接给到浏览器而是给 xhr 对象,最后通过 js 操作 dom 来动态刷新局部;
2、使用
(1)基本流程
- 获取 xhr 对象(兼容问题)
- 获得连接
- 发送请求
- 获得响应并解析
- ajax 状态码判断(0、1、2、3、4)
- 响应状态码判断(200、404、500)
(2)异步和同步
- 默认异步(异步并行,同步等待)
(3)请求方式:get、post
- get:直接在URL 后面拼接请求的参数即可;
- post:
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
ajax.send('name=jack&age=998');
(4)响应的数据格式
- 字符串
- xml:try it
- 一般用于配置文件,前后端的数据的交互一般通过 jsp 过渡;
- servlet 的响应的类型和 jsp 的类型都要改成 xml;
- 数据的获取的方法是 ajax.responseXml,xml 中数据获取实际上就是 dom 操作;
- json:
- 轻量级,可以js 无缝交互,现在的前后端的数据的交互一般都用他;
- servlet 中可以用 Gson 或 fastjson 将java 对象转成 json 的字符串;
- 前端的数据的获取需要用到js 的eval函数,具体的用法如下;
eval('(' + jsonstr + ')')
(5)ajax 的封装:代码见前端 js ajax 部分
六、EL表达式
1、概述
(1)作用域中取值的普通方法:
- getAttribute------强转------get;
(2)上面方法存在的问题:
- 多次的 get ;
- 多次的强转;
- 需要导包;
2、EL 表达式的使用
(1)作用域取值
- jsp 和 servlet 的4个作用域对象:request、session、pageContext、application;
- 作用域中取集合对象:
- list:${键名[index]}
- map:${键名.map中存的键名}
- 默认查找顺序:pageContext-----request------session--------application(小到大)
- 指定查找:pageScope | requestScope | sessionScope | applicationScope.键名
(2)请求数据获取(请求参数、头和cookie)
- param.keyname(返回值);
- paramvalues.keyname(返回一个数组);
- ###请求头和 cookie 数据获取###
(3)做运算
- 算术运算:加减乘除(注意加号只能做加法不能进行字符串的连接);
- 关系运算:大小比较;
- 逻辑运算:与或非;
(4)空值判断
- 语法:${empty 键名}
- 判断键名对象是否有数据;
- User 对象不为空,属性有默认值;
- 加一个 not 可以做非空的判断;
七、JSTL标签库
1、jstl概述
- 中文 java 标准标签库,是一种标签语言,是对 el 表达式的拓展;
- el 表达式负责从域中取值,jstl 负责做逻辑的处理;
- 二者配合使用能最大限度减少 jsp 中 java 代码的书写;
2、核心标签库
(1)前提:
- 导入相应的 jar 包;
- jsp 文件开头用 taglib 指令引入
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
(2)<c:out >标签
- 结合 el 可从域中取值,值也可以是常量,好处就是能设置默认值
- 语法
<c:out value="el or string" default="default value"></c:out>
(3)<c:set>标签
- 存值到域中,可以指定域
- 语法
<c:set var="key" value="value" scope="page"></c:set>
(4)<c:remove>
- 删除域中的值;
- 默认删除全部域中能匹配上的值;
- 可以指定域中的值删除
- 语法:
<c:remove var="key" scope="page"/>
(5)<c:if>----单分支判断
<c:if test="${ aa>3 }"></c:if>
- 其中的 aa 只能是从作用域中取值
(6)<c:choose>----多分枝判断
<c:choose>
<c:when test="${ aa>3 }"></c:when>
<c:otherwise></c:otherwise>
</c:choose>
(7) <c:foreach>
1、说明:
- vs 变量是存在作用域中的,要用 el 来取;
- vs 变量封装的是每次循环的角标、计数、是否第一次循环、是否最后一次循环等信息;
- 动态循环类似于 java 中的增强 for;
3、格式化标签库
(1)使用的前提:导包加 taglib 引入
(2)常用的格式化标签
- 格式化日期:<fmt:formatDate>
- 格式化数字:<fmt:formatNumber>
- 将字符串解析为日期对象:<fmt:parseDate>
- 编码设置:<fmt:requestEncoding>
4、练习:信息管理系统修改
八、过滤器
1、概述
(1)作用:对请求和响应做预处理;对 servlet 进行防护;
2、使用
(1)步骤:
- 写一个类实现 filter 接口;
- 重写三个方法:init、dofilter、destroy;
- 配置 web xml ;
(2) 注意:
- url pattern 的3种写法:
- /* --------拦截所有;
- *.do --------拦截以.do结尾的请求,一般用于模块拦截;
- /ts --------拦截特定的 servlet 的访问;
- 多个过滤器构成链式,执行范围大的,最后执行范围小的(具体的执行顺序?);
- 三个方法的执行的时机:
- init 方法在服务器启动的时候执行;
- destroy关闭的时候执行;
- doFilter 方法在请求和响应的时候执行;
- Filter 的生命周期:伴随服务器的启停;
- 执行过程:request----url----web xml----Filter----Filter----servlet-----Filter-----browser
3、Filter 应用案例
(1)统一编码设置
(2)session 管理:下面的代码在 doFilter 方法中
九、监听器
1、概述
(1)作用:用于监听request、session、sevletContext三个作用域对象的创建、销毁和内容改变
(1)使用:
- 写一个实现相应的 listener;
- 重写相应的方法;
- 在 web xml 中进行配置;
2、监听 request
(1)servletRequestListener:
- 监听request的创建和销毁;
- 重写方法的形参可以获得 request 对象;
(2)servletRequestAttributeListener:
- 监听 request 中属性的新增删除和替换;
- 重写方法形参可以获得相应的键和值;
3、监听 session
(1)httpSessionListener:
- 监听 session 的创建和销毁;
- 重写方法的形参可以获得 session 对象;
(2)httpSessionAttributeListener:
- 监听 session 中属性的新增删除和替换;
- 重写方法形参可以获得相应的键和值;
(3)应用:统计网站的在线人数 try it
4、监听 servletContext
(1)servletContextListener:
- 监听 servletContext 的创建和销毁;
- 重写方法的形参可以获得 servletContext 对象;
(2)servletContextAttributeListener:
- 监听 servletContext 中属性的新增删除和替换;
- 重写方法形参可以获得相应的键和值;