EL,JSTL,监听器,过滤器,Session的钝化与活化
#EL(Experssion Language)
a.在Servlet中用reuquest.setAttribute(“a”,“b”)传值;再通过请求转发给前端jsp中,这时可以用EL语言:
${requestScope.a}
接收相应request域对象的值,而隐式对象还有(不需要new,可直接使用的对象)pageScope,SessionScope,aplicationScope都能获取相应的值。若EL表达式不指定作用域(隐式对象)则系统会自动根据作用域的范围从大到小进行寻找,找到与a匹配的name则输出。还可以获取传递的集合的值
-----------map-------------
${requestScope.map['cn'] }<br>
${requestScope.map.am }<br>
b. r e q u e s t S c o p e . a 中 的 【 . 】 操 作 符 可 以 等 同 于 【 [ ] 】 , 【 . 】 操 作 符 的 特 点 时 更 方 便 编 写 , 而 【 [ ] 】 更 加 强 大 之 处 在 于 可 以 获 取 变 量 的 值 , 并 且 变 量 名 可 以 含 特 殊 字 符 , 如 : , − . 。 c . 在 {requestScope.a}中的【.】操作符可以等同于【[]】,【.】操作符的特点时更方便编写,而【[]】更加强大之处在于可以获取变量的值,并且变量名可以含特殊字符,如:,-.。 c.在 requestScope.a中的【.】操作符可以等同于【[]】,【.】操作符的特点时更方便编写,而【[]】更加强大之处在于可以获取变量的值,并且变量名可以含特殊字符,如:,−.。c.在{ }中可直接进行数值计算和判断,${2+2};运算符还有:+,-,*,/,>,<,=,||,&&.。另外还有emoty运算符:
${empty requestScope.student.name }<!-- 判断是否是空 -->
若为空或不存在则返回true,否则返回false
d.参数访问。获取表单数据:
${param.name}
获取数组:
${param.values}
JSTL(标准标签库)
1.使用JSTL之前需要下载并导入jar包(JSTLjar和standard.jar),创建jsp页面之后需要引入<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
。其中perfix=“”,是设置的前缀,例如设置的c则使用任何标签都必须是<c: XX />
2.核心标签库分为:通用标签库,条件标签库,迭代标签库
a.通用标签库:
给变量赋值:
<c:set var=“变量名” value=“变量值” scope=“作用域”/>
覆盖值:即已经存在的变量,通过set方法再一次进行赋值,student.sno原本是01改成02
<c:set target="requestScope.student.sno" property="sno" value="02" />
显示操作:`<c:out value="a" defaule="bbb"/>`若变量a不存在,则默认输出bbb。
删除属性:
<c:remove var="变量名" scope=“作用域”>
b.条件标签库
选择(单个):
<c:if text="条件(boolean)" >真</c:if>
选择(多个):
<c:set var="ss" value="老师" scope="request"></c:set>
<c:choose>
<c:when test="${requestScope.ss=='老大'}">
老师。。。
</c:when>
<c:when test="${requestScope.ss=='学生'}">
小学生
</c:when>
<c:otherwise > 其他人。。。 </c:otherwise>
</c:choose>
c.迭代标签库(循环,遍历)
在servlet中设置数组,并通过请求转发到jsp页面
String[] hobby ={"睡觉","看电视","吃"};
request.setAttribute("hobby", hobby);
request.getRequestDispatcher("XXX.jsp").forward(request, response);
1.遍历数组
<c:forEach var="hobby" items="${requestScope.hobby}" >
${hobby}
</c:forEach>
2.循环
<c:forEach begin="0" end="5" step="+1">
test。。。
</c:forEach>
过滤器
过滤器:拦截,过滤来自客户端的请求,以及服务器返回的响应资源,过滤器的拦截是双向的。也可以有多个。
1,创建过滤器必须要实现接口Filter,同时还要实现方法
destroy() (销毁过滤器),doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)(过滤拦截。。。),init(FilterConfig arg0)(初始化过滤器)。
2.还需要设置web.xml配置文件
<filter>
<filter-name>myservlet</filter-name>
<filter-class>LSSFilter.Myfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myservlet</filter-name>
<url-pattern>/myservlet</url-pattern>
</filter-mapping>
其中url为指定拦截的servlet,也可设为/*,即拦截所有请求
也可设置`
<dispatcher>REQUEST</dispatcher>
拦截所有HTTP请求(post,get)
<dispatcher>FORWARD</dispatcher>
拦截所有请求转发请求
<dispatcher>ERROR</dispatcher>
拦截所有请求
3.过滤器的先后由的前后决定。
4.其中doFilter()方法中编写,arg2.doFilter()为放行请求
监听器
监听器:是对某个对象发生的事件或状态改变进行监听和相应处理的对象。监听分为两类,一类是监听某个对象状态变化,另一类是对某个对象的属性改变的监听。主要监听对象:request,session,application
a.对对象监听
1.对request进行监听则需要实现接口:ServletRequestListener
重写方法:equestInitialized()创建监听,requestDestroyed()销毁监听,在地址栏输入jsp也是一种request请求。会启动监听,加载完成监听会自动销毁
2.对session进行监听则需要实现接口:HttpSessionListener
重写方法:sessionCreated()创建监听,sessionDestroyed()销毁监听,客户端对服务端进行请求是会自动生成session,则session会自动监听
3.对application进行监听则需要实现接口:ServletContextListener
重写方法:contextInitialized()创建监听,contextDestroyed()销毁监听
4.当程序使用以上设置的监听是,监听器会自动进行监听,
5.都需要进行web.xml配置
所属类的相对路径
b.对对象属性监听
1.对request属性进行监听则需要实现接口:ServletRequestAttributeListener
2.对session属性进行监听则需要实现接口:HttpSessionAttributeListener
3.对application属性进行监听则需要实现接口:ServletContextAttributeListener
4.这三个属性有相同的方法:XXX.setAttribute("","")
5.各自重写三个方法,分别是对属性的值的增加,删除,修改(代替)进行监听
Session的钝化和活化
访问客户端会自动分配一个session,但是访问的数量过多,系统内存会不足,那么就可以储存到硬盘中,而session数据从内存储存到硬盘的过程称为钝化(序列化),从硬盘取到内存的过程称为活化(反序列化)。
session有四种状态:(以下实现监听不需要配置web.xml)
a.session.setAttribute(“a”,“b”);a绑定(保存)到session中,称为绑定
b.session.getAttribute(“a”,“b”);a从到session中取出来,称为解绑
对ab两种状态进行监听则需要实现接口HttpSessionBindingListener
c.钝化
d.活化(进行监听是直接取值)
对cd进行监听则需要实现接口HttpSessionActivaionListener