JSP和JSTL 过滤器和监听器

本文介绍了JSP和JSTL的基础知识,包括JSP的注释、Scriptlet、指令标签、四大地域对象以及EL表达式的使用。详细讲解了JSTL中的迭代标签和格式化动作,如forEach、formatNumber和formatDate。同时,文章探讨了过滤器和监听器在Servlet中的应用,阐述了它们的工作原理和实现方法,以及在过滤器链中的执行顺序和生命周期管理。
摘要由CSDN通过智能技术生成

JSP 和 JSTL

1. 主要内容

在这里插入图片描述

2. JSP

新建JSP⻚⾯
在这里插入图片描述

注释

在 JSP 中⽀持两种注释的语法操作:
⼀种是显示注释,这种注释是允许客户端看⻅的; 另⼀种是隐式注释,此种注释是客户端⽆法看⻅的
① 显示注释语法:从 HTML ⻛格继承⽽来
② 隐式注释语法:从 JAVA ⻛格继承;JSP ⾃⼰的注释
JSP 的三种注释⽅式:

1) // 注释,单⾏注释 /* 多⾏注释*/
2)
3)<%-- JSP注释 --%>

** Scriptlet

在 JSP 中最重要的部分就是 Scriptlet(脚本⼩程序),所有嵌⼊在 HTML 代码中的 Java 程序。 在 JSP 中⼀共有三种 Scriptlet 代码:都必须使⽤ Scriptlet 标记出来**

第⼀种:<% %>: java 脚本段,可以定义局部变量、编写语句
第⼆种:<%! %>:声明,可以定义全局(成员)变量、⽅法、类
第三种:<%= %>:表达式,数据⼀个变量或具体内容

JSP的指令标签

使⽤包含操作,可以将⼀些重复的代码包含进来继续使⽤,从正常的⻚⾯组成来看,有时可能分为⼏
个区域。⽽其中的⼀些区域可能是⼀直不需要改变的,改变的就其中的⼀个具体内容区域。现在有两种
⽅法可以实现上述功能。
⽅法⼀:在每个 JSP ⻚⾯(HTML)都包含⼯具栏、头部信息、尾部信息、具体内容
⽅法⼆:将⼯具栏、头部信息、尾部信息都分成各个独⽴的⽂件,使⽤的时候直接导⼊
很明显,第⼆种⽅法⽐第⼀种更好,第⼀种会存在很多重复的代码,并且修改很不⽅便,在 JSP 中如
果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使⽤ include 指令即可,动态包
含则需要使⽤ include 动作标签。

. include 静态包含

<%@ include file=“要包含的⽂件路径” %>

静态包含就是将内容进⾏了直接的替换,就好⽐程序中定义的变量⼀样,是在 servlet 引擎转译时,
就把此⽂件内容包含了进去(两个⽂件的源代码整合到⼀起, 全部放到_jspService ⽅法中),所以只
⽣成了⼀个 servlet,所以两个⻚⾯不能有同名的变量。 运⾏效率⾼⼀点点。耦合性较⾼,不够灵活。

include 动态包含
动态包含在代码的编译阶段,包含和被包含部分是两个独⽴的部分,只有当运⾏时,才会动态包含进来,好⽐⽅法的调⽤。

<jsp:include page=“include.jsp”></jsp:include>

注意:动态包含,中间不要加任何内容,包括空格,除⾮确认要使⽤参数,否则报错!

<jsp:include page="include.html"></jsp:include>
<%
String a = "hello.jsp";
%>
<jsp:include page="<%=a %>"></jsp:include>

使⽤动态包含还可以通过在⻚⾯之间传参。
接收参数通过 request.getParameter(name);
<jsp:include page=“hello.jsp” flush=“true”> <jsp:param name=“uname” value=“zhangsan”/>
</jsp:include>

hello.jsp

<%=request.getParameter(“uname”)%>

JSP的四⼤域对象

四种属性范围

在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是⼀个设置的对象,可以再多少

个⻚⾯中保存并可以继续使⽤

1.page范围
pageContext : 只在⼀个⻚⾯中保存属性,跳转之后⽆效
2.request范围
request : 只在⼀次请求中保存,服务器跳转后依然有效
3.session范围
session : 在⼀次会话范围中,⽆论何种跳转都可以使⽤
4.application范围
application : 在整个服务器上保存

在这里插入图片描述
验证属性范围的特点
5.page
本⻚⾯取得,服务器端跳转()后⽆效
6.request
服务器跳转有效,客户端跳转⽆效
如果是客户端跳转,则相当于发出了两次请求,那么第⼀次的请求将不存在了;如果希望不管是客
户端还是服务器跳转,都能保存的话,就需要继续扩⼤范围。
7.session
⽆论客户端还是服务器端都可以取得,但是现在重新开启⼀个新的浏览器,则⽆法取得之前设置的
session了,因为每⼀个session只保存在当前的浏览器当中,并在相关的⻚⾯取得。
对于服务器⽽⾔,每⼀个连接到它的客户端都是⼀个session
如果想要让属性设置⼀次之后,不管是否是新的浏览器打开都能取得则可以使⽤application
8.application
所有的application属性直接保存在服务器上,所有的⽤户(每⼀个session)都可以直接访问取得
只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此
时服务器重启了,则⽆法取得了,因为关闭服务器后,所有的属性都消失了,所以需要重新设置。

问:使⽤哪个范围呢?
答:在合理范围尽可能⼩

EL表达式的使⽤

EL表达式的语法
EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语⾔的灵感来⾃于 ECMAScript
和 XPath 表达式语⾔,它提供了在 JSP 中简化表达式的⽅法,让 Jsp 的代码更加简化。

语法结构⾮常简单: ${expression}

EL 表达式⼀般操作的都是域对象中的数据,操作不了局部变量。
域对象的概念在 JSP 中⼀共有四个:pageContext, request, session, application;范围依次是,
本⻚⾯,⼀次请求, ⼀次会话,整个应⽤程序。
当需要指定从某个特定的域对象中查找数据时可以使⽤四个域对象对应的空间对象,分别是:
pageScope, requestScope, sessionScope, applicationScope。 ⽽ EL 默认的查找⽅式为从⼩到⼤查找,找到即可。当域对象全找完了还未找到则返回空字符串""。

EL表达式的使⽤

获取数据
设置域对象中的数据

<%
pageContext.setAttribute("uname","zhangsan"); // page作⽤域
request.setAttribute("uname","lisi"); // request作⽤域
session.setAttribute("uname","wangwu"); // session作⽤域
application.setAttribute("uname","zaholiu"); // application
%>

获取域对象的值

<%-- 获取域对象中的数据:默认查找⽅式为从⼩到⼤,找到即⽌。若四个范围都未找到,则返回空字符
串。--%>
${uname} <!-- 输出结果为:zhangsan -->

获取指定域对象的值

${pageScope.uname} <!-- page作⽤域 -->
${requestScope.uname} <!-- request作⽤域 -->
${sessionScope.uname} <!-- session作⽤域 -->
${applicationScope.uname} <!-- application作⽤域 -->

获取List

<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<%--
获取List中指定下标的数据
${list[下标] }
获取集合的⻓度
${list.size()}
注:
list代表的是存在域对象中的变量名(限域变量名)
--%>
${list[1]}

获取Map

<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
<%--
获取Map中指定值
${map["key"] } 或 ${map.key }
注:
map代表的是存在域对象中的变量名(限域变量名)
--%>
${map.aaa }
${map["bbb"]}

获取JavaBean对象
User.java

public class User {
private Integer userId;
private String uname;
private String upwd;
public Integer getUserId() {
return userId;
 }
public void setUserId(Integer userId) {
this.userId = userId;
 }
public String getUname() {
return uname;
 }
 public void setUname(String uname) {
this.uname = uname;
 }
public String getUpwd() {
return upwd;
 }
public void setUpwd(String upwd) {
this.upwd = upwd;
 }
}
<%
User user = new User();
user.setUserId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
request.setAttribute("user",user);
%>
<%-- JavBean中的属性字段需要提供get⽅法 --%>
${user} <%-- 获取对象 --%>
${user.uname} <%--获取对象中的属性--%>

empty

<%--
empty
判断域对象是否为空。为空,返回true;不为空返回false; ${empty 限域变量名 }
判断对象是否不为空。
${!empty 限域变量名 }
--%>
${empty uname}
${empty list}
${empty map}
${empty user}

EL运算

<%
request.setAttribute("a", 10);
request.setAttribute("b", 2);
request.setAttribute("c", "aa");
request.setAttribute("d", "bb");
%>

等值判断

<%--
⽐较两个值是否相等,返回truefalse
== 或 eq
--%>
${a == b }
${c == d }
${c eq d }
${a == 5 }
${c == 'aa' }

算术运算

<%--
加法: +
减法: -
乘法: *
除法: / 或 div
--%>
${a + b }
${a / b } 或 ${a div b }

⼤⼩⽐较

<%--
⼤于:>
⼩于:<
⼤于等于:>=
⼩于等于:<=
--%>
${a > b}
${a + 1 > 10 }
${a + b >= 10 }
${a > b && b > 5 }
${a + b > 10 || a - b > 5 }

JSTL

Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是⼀个定制标签类库的集合,⽤于解决⼀些常⻅的问题,例如迭代⼀个映射或者集合、条件测试、XML 处理,甚⾄数据库和访问数据库操作等。
JSTL 中最重要的标签:迭代集合以及格式化数字和⽇期⼏个标签

迭代标签

forEach标签

<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
</c:forEach>

属性
在这里插入图片描述

forEach varStatus 属性
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: ⽤来表明当前这轮迭代是否为第⼀次迭代的标志
last: ⽤来表明当前这轮迭代是否为最后⼀次迭代的标志

格式化动作标签

JSTL 提供了格式化和解析数字和⽇期的标签,我们讨论⾥⾯有:formatNumber、formatDate、parseNumber及parseDate。
formatNumber标签
formatNumber标签⽤于格式化数字,百分⽐,货币。该标签⽤指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
语法格式

<fmt:formatNumber
 value="<string>"
 type="<string>"
 var="<string>"
 scope="<string>"/>

属性
在这里插入图片描述

注意:

1.如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
2.默认的类型(type)的取值为number。可取值:number数值型、percent百分⽐类型、currency货币型
formatDate标签
formatDate标签⽤于使⽤不同的⽅式格式化⽇期。(将Date型数据转换成指定格式的字符串类
型。)
语法格式

<fmt:formatDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>

在这里插入图片描述
标签格式模式

在这里插入图片描述

parseNumber标签

parseNumber标签⽤来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分⽐类型的字符串转换成数值型。)
语法格式

<fmt:parseNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>

属性
在这里插入图片描述

parseDate标签

parseDate标签⽤于解析⽇期。(将指定格式的字符串转换成Date类型。)
语法格式

<fmt:parseDate
 value="<string>"
 type="<string>"
 dateStyle="<string>"
 timeStyle="<string>"
 pattern="<string>"
 var="<string>"
 scope="<string>"/>

在这里插入图片描述

滤器和监听器

1. 主要内容

在这里插入图片描述

过滤器

介绍
Filter 即为过滤,⽤于在 Servlet 之外对 Request 或者 Response 进⾏修改。它主要⽤于对⽤户请求
进⾏预处理,也可以对 HttpServletResponse 进⾏后处理。使⽤ Filter 的完整流程: Filter 对⽤户请求
进⾏预处理,接着将请求交给 Servlet 进⾏处理并⽣成响应,最后 Filter 再 对服务器响应进⾏后处理。
在⼀个 web 应⽤中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为⼀个 Filter 链。

在这里插入图片描述

多个过滤器

在这里插入图片描述

若是⼀个过滤器链:先配置先执⾏(请求时的执⾏顺序);响应时: 以相反的顺序执⾏。
在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。根据需要检查
HttpServletRequest,也可以修改 HttpServletRequest 头和数据。
在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查
HttpServletResponse,也可以修改 HttpServletResponse头和数据。
实现
可以通过实现⼀个叫做javax.servlet.Fileter的接⼝来实现⼀个过滤器,其中定义了 三个⽅法,init(),doFilter(), destroy()分别在相应的时机执⾏。后期观察⽣命周期。
Filter 的实现只需要两步:
Step1: 编写 java 类实现 Filter 接⼝,并实现其 doFilter ⽅法。
Step2: 通过@WebFilter注解设置它所能拦截的资源。

@WebFilter("/*")
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
 }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
}
@Override
public void destroy() {
 }
}

Filter 接⼝中有⼀个 doFilter ⽅法,当开发⼈员编写好 Filter,并配置对哪个 web 资源进⾏拦截后,
Web 服务器每次在调⽤ web 资源的 service ⽅法之前,都会先调⽤⼀下 filter 的 doFilter ⽅法。因此可
以达到如下效果:
调⽤⽬标资源之前,让⼀段代码执⾏。
是否调⽤⽬标资源(即是否让⽤户访问 web 资源)。
web 服务器在调⽤ doFilter ⽅法时,会传递⼀个 filterChain 对象进来,filterChain 对象是 filter 接
⼝中最重要的⼀个对象,它提供了⼀个 doFilter ⽅法,开发⼈员可以根据需求决定 是否调⽤此⽅法,
调⽤该⽅法,则 web 服务器就会调⽤ web 资源的 service ⽅法,即 web 资源就会被访问,否则 web
资源不会被访问。(本质是放⾏,调⽤doFilter⽅法后,即请求可以到达资源)

监听器

介绍
web 监听器是Servlet 中⼀种的特殊的类,能帮助开发者监听 web 中的特定事件, ⽐如
ServletContext,HttpSession,ServletRequest 的创建和销毁;变量的创建、销毁和修改等。 可以在
某些动作前后增加处理,实现监控。例如可以⽤来统计在线⼈数等。

实现

监听器有三类8种:
⑴ 监听⽣命周期:
ServletRequestListener
HttpSessionListener
ServletContextListener
⑵ 监听值的变化:
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
⑶ 针对 session 中的对象:
监听 session 中的 java 对象(javaBean) ,是 javaBean 直接实现监听器 的接⼝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值