皓学IT:WEB06_ EL表达式JSTL标签库

一、EL表达式

1.1.特点

  • 是一个由java开发的工具包

  • 用于从特定域对象中读取并写入到响应体开发任务,不能向域对象中写入。

  • EL工具包自动存在Tomcat的lib中(el-api.jar),开发是可以直接使用,无需其他额外的包。

  • 标准格式 : ${域对象别名.。关键字} 到指定的域中获取相应关键字的内容,并将其写入到响应体。

1.2.域对象

注:使用时可以省略域对象别名

默认查找顺序: pageScope -> requestScope -> sessionScope -> applicationScope

最好只在pageScope中省略

对应案例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>jsp</title>
</head>
<body><%application.setAttribute("name","applcation");session.setAttribute("name","session");request.setAttribute("name","request");pageContext.setAttribute("name","pageContext");%><br>--------------使用java语言----------------<br>application中的值:<%= application.getAttribute("name")%><br>session中的值:<%= session.getAttribute("name")%><br>request中的值:<%= request.getAttribute("name")%><br>pageContext中的值:<%= pageContext.getAttribute("name")%><br>
​<br>--------------使用EL表达式----------------<br>application中的值:${applicationScope.name}<br>session中的值:${sessionScope.name}<br>request中的值:${requestScope.name}<br>pageContext中的值:${pageScope.name}<br>
​<br>--------------使用EL表达式,省略域对象----------------<br>application中的值:${name}<br>
</body>
</html>

 

1.3.支持的运算

(1)数学运算

(2)比较运算 > gt < lt >= ge <= le == eq != !=

(3)逻辑预算 && || !

对应案例:


<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>EL运算</title>
</head>
<body>
<%request.setAttribute("num1","12");request.setAttribute("num2","14");
​application.setAttribute("flag1",true);application.setAttribute("flag2",false);
%>
<br>---------------使用java语言-------------------<br>
<%String num1 = (String)request.getAttribute("num1");String num2 = (String)request.getAttribute("num2");int num3 = Integer.parseInt(num1)+Integer.parseInt(num2);
​boolean flag1 = (Boolean)application.getAttribute("flag1");boolean flag2 = (Boolean)application.getAttribute("flag2");boolean flag3 = flag1 && flag2;
​//输出方式一out.write(Boolean.toString(flag3));
%>
<!-- 输出方式二 -->
<h1><%=num3%></h1>
​
<br>---------------使用EL表达式-------------------<br>
<h1>${ requestScope.num1 + requestScope.num2 }</h1>
<h1>${ requestScope.num1 > requestScope.num2 }</h1>
<h1>${ applicationScope.flag1 && applicationScope.flag2 }</h1>
​
</body>
</html>

1.4.其他的内置对象

(1)param 使用 ${param.请求参数名} 从请求参数中获取参数内容

(2)paramValues 使用 ${ paramValues.请求参数名 } 从请求参数中获取多个值,以数组的形式

(3)initParam 使用 ${ initParam.参数名 } 获取初始化参数

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>其他内置对象</title>
</head>
<body>url:...?username=zhangsan&password=admin<br>url中的参数:用户名:${param.username} --- 密码:${param.password}<br>-------------------------------------------<br>url:...?username=zhangsan&username=lisiurl中的参数:用户1:${paramValues.username[0]} ---用户2:${paramValues.username[1]}<br>-------------------------------------------<br>
​<!--在web.xml中添加启动参数<context-param><param-name>driver</param-name><param-value>com.mysql.jdbc.Driver</param-value></context-param>-->获取启动参数:${initParam.driver}</body>
</html>

1.5.EL表达式的缺陷

(1)只能读取域对象中的值,不能写入

(2)不支持if判断和控制语句

二、 JSTL标签工具类

2.1.基本介绍

(1) JSP Standrad Tag Lib jsp标准标签库

(2) 是sun公司提供

(3) 组成

(4)使用原因:使用简单,且在JSP编程当中要求尽量不出现java代码

2.2.使用方式

(1)导入依赖的jar包 jstl.jar standard.jar

(2)在jsp中引入JSTL的core包依赖约束

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2.3.重要标签的使用

2.3.1.<c: set>

在JSP文件上设置域对象中的共享数据

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title> c:set </title>
</head>
<body>
​<%--相当于<%request.setAttribute("name","zhangsan");%>--%><c:set scope="request" var="name" value="zhangsan"/>通过JSTL添加的作用域的值:${requestScope.name} <br><c:set scope="application" var="name" value="lisi"/>通过JSTL添加的作用域的值:${applicationScope.name} <br><c:set scope="session" var="name" value="wangwu"/>通过JSTL添加的作用域的值:${sessionScope.name} <br><c:set scope="page" var="name" value="zhaoliu"/>通过JSTL添加的作用域的值:${pageScope.name} <br>
​
</body>
</html>

2.3.2.<c: if>

控制哪些内容能够输出到响应体

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title> c:if </title>
</head><c:set scope="page" var="age" value="20"/><br>---------------使用java语言------------------<br><%if(Integer.parseInt((String)pageContext.getAttribute("age")) >= 18){%>输入:欢迎光临!<%  }else{  %>输入:未满十八,禁止入内!<%  }  %><br>---------------使用JSTL标签------------------<br><c:if test="${age ge 18}">输入:欢迎光临!</c:if><c:if test="${age lt 18}">输入:未满十八,禁止入内!</c:if>
​
</body>
</html>

2.3.3.<c: choose>

在jsp中进行多分支判断,决定哪个内容写入响应体

<%@ page import="com.sun.org.apache.xpath.internal.operations.Bool" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title> c:choose </title>
</head>
<body><c:set scope="page" var="age" value="20"/><br>---------------使用java语言------------------<br><%if(Integer.parseInt((String)pageContext.getAttribute("age")) == 18){%>输出:您今年成年了<%  }else if(Integer.parseInt((String)pageContext.getAttribute("age")) > 18){  %>输出:您已经成年了<%  }else{  %>输出:您还是个孩子<%  }  %><br>---------------使用JSTL标签------------------<br><c:choose><c:when test="${age eq 18}">输出:您今年成年了</c:when><c:when test="${age gt 18}">输出:您已经成年了</c:when><c:otherwise>输出:您还是个孩子</c:otherwise></c:choose>
​
</body>
</html>

2.3.4.<c: forEach>

循环遍历

<c:forEach var="申明循环变量的名称" begin="初始化循环变量"end="循环变量可以接受的最大值" step="循环变量的递增或递减值">*** step属性可以不写,默认递增1*** 循环变量默认保存在pageContext中
</c:forEach>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="dao.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title> c:forEach </title>
</head>
<body><%pageContext.setAttribute("students",new ArrayList(){{add(new Student("01","zhangsan",16));add(new Student("02","lisi",19));add(new Student("03","wangwu",15));}});pageContext.setAttribute("stuMap",new HashMap(){{put("s1",new Student("01","zhangsan",16));put("s2",new Student("02","zhangsan",19));put("s3",new Student("03","zhangsan",15));}});%><br>---------------使用java语言----------------<br><table><tr><td>学号</td><td>姓名</td><td>年龄</td></tr><%List<Student> students = (ArrayList<Student>)pageContext.getAttribute("students");for (int i = 0; i < students.size(); i++) {%><tr><td><%=students.get(i).getSid()%></td><td><%=students.get(i).getName()%></td><td><%=students.get(i).getAge()%></td></tr><%  }  %></table><br>---------------使用JSTL标签读取list----------------<br><table><tr><td>学号</td><td>姓名</td><td>年龄</td></tr><c:forEach var="stu" items="${students}"><tr><td>${stu.sid}</td><td>${stu.name}</td><td>${stu.age}</td></tr></c:forEach></table><br>---------------使用JSTL标签读取Map----------------<br><table><tr><td>key值</td><td>学号</td><td>姓名</td><td>年龄</td></tr><c:forEach var="stu" items="${stuMap}"><tr><td>${stu.key}</td><td>${stu.value.sid}</td><td>${stu.value.name}</td><td>${stu.value.age}</td></tr></c:forEach></table><br>---------------使用JSTL标签读取指定for循环----------------<br><c:forEach var="item" begin="1" end="10" step="1"><option> ${item} </option></c:forEach>
</body>
</html>

其中使用的javaBean

public class Student {private String sid;private String name;private int age;
​public String getSid() {return sid;}
​public void setSid(String sid) {this.sid = sid;}
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​public int getAge() {return age;}
​public void setAge(int age) {this.age = age;}
​public Student(String sid, String name, int age) {this.sid = sid;this.name = name;this.age = age;}
}

三、Listener、Filter

3.1.概念

  • servlet

servlet是一种运行服务器端的java应用程序,他可以用来处理请求和响应。

  • filter

过滤器,不像servlet,它不能产生一个请求或者响应,它是一个中间者,能修改处理经过它的请求和响应,并不能直接给客户端响应。

  • listener

监听器,它用来监听容器内的一些变化,如session的创建,销毁等。当变化产生时,监听器就要完成一些工作。

3.2.生命周期

1、servlet: servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新开始。

1.装入:启动服务器时加载Servlet的实例;

2.初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作由init()方法负责执行完成;

3.调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;

4.销毁:停止服务器时调用destory()方法,销毁实例。

2、filter: 一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destory(),空实现也行

1.启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;

2.每一次请求时都只调用方法doFilter()进行处理;

3.停止服务器时调用destory()方法,销毁实例。

3、listener: 类似于servlet和filter

servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:

  • 第一类:与servletContext有关的listener接口。包括:ServletContextListener、ServletContextAttributeListener;

  • 第二类:与HttpSession有关的Listener接口。包括:HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener、HttpSessionActivationListener;

  • 第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListener、ServletRequestAttributeListener

web.xml 的加载顺序是:context- param -> listener -> filter -> servlet

3.3.使用方式

listener:

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
​
public class TestListener implements HttpSessionListener, ServletRequestListener, ServletRequestAttributeListener {//sessionListener  start!@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {logger.info("............TestListener sessionCreated().............");}
​@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {logger.info("............TestListener sessionDestroyed().............");}//sessionListener end!
​//requestListener start!@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {logger.info("............TestListener requestInitialized().............");}
​@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {logger.info("............TestListener requestDestroyed().............");}//requestListener end!
​//attributeListener start!@Overridepublic void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {logger.info("............TestListener attributeAdded().............");}
​@Overridepublic void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {logger.info("............TestListener attributeRemoved().............");}
​@Overridepublic void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {logger.info("............TestListener attributeReplaced().............");}//attributeListener end!
​
​
​
}

Filter:

import javax.servlet.*;
import java.io.IOException;
​
public class TestFilter implements Filter {
​@Overridepublic void init(FilterConfig filterConfig) throws ServletException {
​}
​@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤器被执行了");//放行filterChain.doFilter(servletRequest,servletResponse);}
​@Overridepublic void destroy() {
​}
}

Servlet:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
public class TestServlet extends HttpServlet {
​@Overridepublic void init() throws ServletException {super.init();}
​@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}
​@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);//...TestdoPost  doPost()  start...//操作Attributereq.setAttribute("a","a");req.setAttribute("a","b");req.getAttribute("a");req.removeAttribute("a");
​//操作sessionreq.getSession().setAttribute("a","a");req.getSession().getAttribute("a");req.getSession().invalidate();//...TestdoPost  doPost()  end...}
​@Overridepublic void destroy() {super.destroy();}
​
}

配置XML

<!-- 测试filter -->
<filter><filter-name>TestFilter</filter-name><filter-class>test.TestFilter</filter-class>
</filter>
<filter-mapping><filter-name>TestFilter</filter-name><url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- 测试servlet -->
<servlet><servlet-name>TestServlet</servlet-name><servlet-class>test.TestServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>TestServlet</servlet-name><url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 测试listener -->
<listener><listener-class>test.TestListener</listener-class>
</listener>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

seleniumUI自动化实例(登录CSDN页面)

今天分享一个CSDN登录模块的登录场景 1.配置文件 CSDNconf.py&#xff1a; from selenium import webdriver options webdriver.ChromeOptions() options.binary_location r"D:\Program Files\360\360se6\Application\360se.exe" # 360浏览器安装地址 driver w…

电脑审计系统知多少

域智盾的电脑审计系统是一款功能强大的软件&#xff0c;主要用于监控和审计电脑的使用情况。通过安装该系统&#xff0c;组织能够全面了解员工的电脑活动。 首先&#xff0c;该系统能够详细记录用户的上网记录&#xff0c;包括访问的网站、浏览的网页内容等。这使得管理员可以监…

剑指offer面试题42 翻转字符顺序 VS 左旋字符串

考察点 字符串遍历知识点 题目 分析 类似这种题目只能观察元素特点找出规律确定算法了&#xff0c;像第一道题目翻转单词顺序&#xff0c;我们可以很容易的得到翻转每个字符后的的字符串&#xff0c;再仔细观察一下紧接着以空格为间隔分别翻转俩边的字符串就可以解这道题目了…

鸿蒙Harmony应用开发—ArkTS-@Provide装饰器和@Consume装饰器:与后代组件双向同步

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provide装饰的变…

YOLOv8 如何实现多主干特征融合方式 | GhostNet+ShuffleNet / SwinTransformer+ShuffleNet

文章目录 前言模块添加方法双特征提取例子`GhostNet+ShuffleNet` 双主干结构图代码`Swin+ShuffleNet` 双主干结构图代码参数量与计算量1. 什么是YOLO-Magic框架?2. 如何加入这个框架?3. 加入后如何使用框架?4. GitHub组织是什么?

LeetCode-热题100:39.组合总和

题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…

使用 Python 读取 Word 文件

使用 Python 读取 Word 文件 0. 引言安装必要的库 1. 读取和提取 Word 文件中的文本2. 提取 Word 文件中的图片 0. 引言 要使用 Python 读取 Word 文件并识别其中的对象&#xff08;如图片&#xff09;和文本&#xff0c;你可以使用 python-docx 库来处理文本&#xff0c;和 d…

大数定律与中心极限定理

大数定律与中心极限定理 大数定律切比雪夫不等式依概率收敛切比雪夫大数定律辛钦大数定律伯努利大数定律 中心极限定理列维-林德伯格中心极限定理&#xff08;Lindeberg-Levy central limit theorem&#xff09;棣莫弗-拉普拉斯中心极限定理&#xff08;De Moivre-Laplace cent…

【运放】LM358和LM324

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

python脚本for循环

使用python脚本单个输出Hello单词。 for循环实例&#xff1a; ​ [rootkvm-72 py]# cat for02.py #for i in hello: #for i in "hello": #for i in hello: for i in """hello""":print("i ", i)​ 单个字符输出结果&…

C语言运算符优先级

C语言运算符的优先级&#xff08;从高到低&#xff09;如下所示&#xff1a; 1. ()&#xff1a;括号 2. []&#xff1a;数组索引 3. . 和 ->&#xff1a;结构体和联合体成员选择 4. 和 --&#xff1a;自增和自减 5. !&#xff1a;逻辑非 6. ~&#xff1a;位取反 7. -&…

力扣---打家劫舍---动态规划

思路 1&#xff1a; 我将res[i]定义为&#xff1a;一定要取第 i 个房子的前提下&#xff0c;能获取的最大金额。那么直接用cnt从头记录到尾&#xff0c;每个房子的res最大值即是答案。那么递推公式是什么&#xff1f;res[i]max(res[i-2],res[i-1],...,res[0])nums[i]。数组初始…

如何配置nginx反向代理服务器

配置Nginx作为反向代理服务&#xff0c;你需要编辑Nginx的配置文件&#xff08;通常是nginx.conf或在其下的某个sites-available目录下的特定域名配置文件&#xff09;&#xff0c;并在其中添加反向代理相关配置块。以下是一个基本的反向代理配置示例&#xff1a; # 假设这是位…

mysql中的数据类型大全纯干货------------时间日期类型

简介(类型预览): 在mysql8.0版本中支持的类型主要有: YEAR类型表示年 DATE类型表示年,月,日 TIME类型表示时,分,秒 DATETIME类型表示年,月,日,时,分,秒 TIMESTAMP类型通常表示带时区的年,月,日,时,分,秒 数据类型单位占用字节格式下限上限YEAR年1YYY或…

C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境

目录 说明 效果 项目 代码 下载 C# StableDiffusion StableDiffusionSharp 脱离python臃肿的环境 说明 Stable Diffusion in pure C/C github地址&#xff1a;https://github.com/leejet/stable-diffusion.cpp C# Wrapper for StableDiffusion.cpp github地址&#x…

Java的三大特性之一——继承

前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装&#xff0c;这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实…

zabbix6.4监控mysql数据库

目录 一、前提二、配置mysql数据库模板三、配置监控的mysql主机 一、前提 已经搭建好zabbix-server 在需要监控的mysql服务器上安装zabbix-agent2 上述安装步骤参考我的上篇文章&#xff1a;通过docker容器安装zabbix6.4.12图文详解&#xff08;监控服务器docker容器&#xf…

RAII 与智能指针

1.什么是 RAII 1.概念 Resource Acquisition Is Initialization 资源获取即初始化。一般分为 3 步&#xff0c;当我们在main函数中声明一个局部对象的时候&#xff0c;会自动调用构造函数进行对象的初始化&#xff0c;当整个main函数执行完成后&#xff0c;自动调用析构函数来…

用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理

1&#xff09;用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理 2&#xff09;折叠屏适配问题 3&#xff09;Prefab对DLL中脚本的引用丢失 4&#xff09;如何优化Unity VolumeManager中的ReplaceData 这是第378篇UWA技术知识分享的推送&#xff0c;精选了UWA社区…

css的box-shadow详解

CSS的box-shadow属性用于在元素框上添加阴影效果。它可以为元素提供外阴影或内阴影&#xff0c;并且可以控制阴影的颜色、偏移距离、模糊半径以及扩展半径。 box-shadow属性的基本语法如下&#xff1a; box-shadow: h-shadow v-shadow blur spread color inset;下面是各个参数…