皓学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;包括访问的网站、浏览的网页内容等。这使得管理员可以监…

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

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

【运放】LM358和LM324

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

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

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

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…

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

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

超快的 AI 实时语音转文字,比 OpenAI 的 Whisper 快4倍 -- 开源项目 Faster Whisper

faster-whisper 这个项目是基于 OpenAI whisper 的模型&#xff0c;在上面的一个重写。 使用的是 CTranslate2 的这样的一个库&#xff0c;CTranslate2 是用于 Transformer 模型的一个快速推理引擎。 在相同精度的情况下&#xff0c;faster-whisper 的速度比 OpenAI whisper …

【网站项目】294火车票订票系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

EI Scopus双检索| 2024年智能交通与未来出行国际会议(CSTFM 2024)

会议简介 Brief Introduction 2024年智能交通与未来出行国际会议(CSTFM 2024) 会议时间&#xff1a;2024年10月18日-20日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;CSTFM 2024-2024 International Conference on Smart Transportation and Future Mobility(CSTFM 202…

解决修改数据后,前端页面不显示问题

如图&#xff0c;修改数据后&#xff0c;在前端页面不显示的问题&#xff0c;可能是因为缓存问题 解决方案 以为Edge浏览器为例 打开设置左边栏点击隐私&#xff0c;搜索和服务选择清除 Internet Explorer 的浏览数据点击删除&#xff0c;重新启动前端界面即可。

3.18作业

一、网络属性&#xff08;getsockopt、setsockopt&#xff09; 1> 由于在网络通信过程中&#xff0c;套接字是服务于各个层的&#xff0c;但是&#xff0c;每一层中对套接字选项都有一定的权限控制&#xff0c;例如&#xff0c;应用层中对端口号快速重用的限制 2> 如何…

vue2 自定义 v-model (model选项的使用)

效果预览 model 选项的语法 每个组件上只能有一个 v-model。v-model 默认会占用名为 value 的 prop 和名为 input 的事件&#xff0c;即 model 选项的默认值为 model: {prop: "value",event: "input",},通过修改 model 选项&#xff0c;即可自定义v-model …

js实现旋转矩形,圆形交集并集差集运算并使用canvas展示

region 使用0代表空 1代表有 复制到codepen执行 // 创建三个 Canvas 元素 const intersectionCanvas document.createElement(canvas); const unionCanvas document.createElement(canvas); const differenceCanvas document.createElement(canvas);intersectionCanvas.wid…

本人用编译

板子方 修改ip&#xff08;保证板子和主机在同一个网段&#xff09; mount -t nfs -o rw,nolock,nfsvers3 192.168.1.200:/home/violet/nfs get/ 互通的文件在~目录下get文件内 电脑方 使用arm-linux-gnueabihf-gcc 编译

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

C++读取文本文件中的汉字出现乱码的原因及解决措施

大家好&#xff01; 作者今天在写代码时遇到了读取文本文件中的汉字时出现乱码的情况&#xff0c;所以本文介绍Windows操作系统中&#xff0c;C读取文本文件中的汉字出现乱码情况原因及解决措施。 下面代码可以读取Stu.txt中的内容并输出&#xff1a; ifstream ifs; ifs.open(…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,记录犯经验主义错误不断自己打脸过程

前言: 从小白开始 海康威视的摄像头接触过,包括前面也都开发了调用sdk开发拍照和视频预览,以及通过事件警报获取数据的。接触到的像头都是12v或者24v电源&#xff0c;或者是POE供电的&#xff0c;先入为主了觉得都是这样&#xff0c;结果打脸了。 一、设备选型&#xff1a; 最开…