Servlet 入门到精通(三)

上一篇博客的传送门:Servlet 入门到精通(二)

EL 表达式

概述

Expression Language 表达式语言,是一种在 JSP 页面获取数据的简单方式。只能获取数据,不能设置数据。主要用于替换和简化jsp页面中java代码的编写。

语法

在JSP页面的任何静态部分均可通过: ${expression}来获取到指定表达式的值。

需要注意的是,使用Idea创建jsp页面时需手动在page指令中允许使用EL表达式。

<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>

使用

容器相应操作

获取请求参数的值

获取initParam的值

对象操作

集合操作

cookie的操作

运算和常量部分

注意事项

  1. EL表达式不能出现在 Java 代码块、表达式块等JSP动态代码部分
  2. EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
  3. EL不会抛出空指针异常,只会不显示
  4. EL不会抛出数组越界异常,只会不显示
  5. EL不具有对字符串进行处理的能力

JSTL标准标签库

JSTL(Java server pages Standarded Tag Library,JSP 标准标签库)是由JCP(Javacommunity Proces)所制定的标准规范,它主要提供给 Java Web 开发人员一个标准通用的标签库,并由 Apache 的 Jakarta 小组来维护。开发人员可以利用这些标签取代JSP页面上的 Java代码,从而提高程序的可读性,降低程序的维护难度。

JSTL的分类

根据JSTL标签所提供的功能,一般将其分为5个类别:

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

JSTL的引入

maven项目中引入依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

如果是 Tomcat10需要引入

<dependency>
       <groupId>org.glassfish.web</groupId>
       <artifactId>jakarta.servlet.jsp.jstl</artifactId>
       <version>2.0.0</version>
</dependency>
<dependency>
       <groupId>jakarta.servlet.jsp.jstl</groupId>
       <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
       <version>2.0.0</version>
</dependency>

具体页面中引入相应标签

<!--核心标签 核心标签是最常用的 JSTL标签-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--格式化标签 格式化标签用来格式化并输出文本、日期、时间、数字-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!--SQL标签 SQL标签库提供了与数据库进行交互的标签-->
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!--XML 标签 XML标签库提供了创建和操作XML文档的标签-->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<!--JSTL函数 JSTL包含一系列标准函数,大部分是通用的字符串处理函数-->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

以下错误如何解决?

有时我们在使用JSTL标签库时会出现红色警告,并且我们的标签库快捷提示也无法使用,这个原因是因为我们对应的tld文件未下载成功或者未成功加载。以下跟着关为来告诉大家如何解决这样的问题。

1、找到Maven中JSTL依赖的位置

2、在Idea中点击File--->Setting

3、将uri书写到第一个文本框,选择c.tld路径到第二个文本框

4、这里JSTL就OK了 

注意:还有一种方式,就是将 jstl 的依赖包复制到 Tomcat 的 lib 文件夹中。

JSTL的实现 

容器操作

<!--
    像容器中存放内容
    var:Key
    value:Value
    scope:具体容器 page|request|session|application 默认page
-->
<h1>JSTL对容器的操作</h1>
<c:set var="A" value="abc" scope="session"/>
<c:set var="B" value="abcd" scope="application"/>
<c:set var="C" value="abcde" scope="request"/>
<!--从对应容器中删除具体的Key-->
<c:remove var="B" scope="application"/>
<!--获取具体容器中的内容 如果容器中不存在内容 显示default的内容-->
<c:out value="${A}" default="缺省值"/>
<c:out value="${B}" default="缺省值"/>
<c:out value="${C}" default="缺省值"/>
<h1>为什么不用EL</h1>
${A}..${B}..${C}
<h2>如果容器中没有这个值,EL表达式不显示</h2>

分支操作

<!--单层if分支结构 test:条件-->
<c:if test="${NUM%2==0}">
    ${NUM} 是偶数!
</c:if>
<hr/>
<!--多层if结构-->
<!--通过when和otherwise实现了if-else操作-->
<c:choose>
    <c:when test="${NUM%2==0}">
        ${NUM} 是偶数!
    </c:when>
    <c:otherwise>
        ${NUM} 是奇数!
    </c:otherwise>
</c:choose>
<hr/>
<c:choose>
    <c:when test="${NUM==100}">
        ${NUM} ,完美!
    </c:when>
    <c:when test="${NUM>85}">
        ${NUM} ,优秀!
    </c:when>
    <c:when test="${NUM==60}">
        ${NUM} ,及格!
    </c:when>
    <c:otherwise>
        ${NUM} ,比较差!
    </c:otherwise>
</c:choose>

循环操作

<!--
    for循环
    for(int i=1;i<=10;i++){
        输出i;
    }
    var:变量名 begin:初始值 end:最终值 step:自增
    step:必须大于0
-->
<c:forEach var="i" begin="1" end="10" step="1">
    ${i}&nbsp;
</c:forEach>
<hr/>
<%
    // 这是一个集合
    pageContext.setAttribute("LIST",new EmpService().findAll());
%>
<!--
    foreach循环
    var:迭代对象
    items:需要迭代的集合
    varStatus:游标变量  x.count  x.index
-->
<c:forEach var="emp" items="${LIST}" varStatus="j">
    ${j.count}..${j.index}..${emp}..${emp.ename}<br/>
</c:forEach>

跳转操作

<!--
    重定向操作
    response.sendRedirect(3.jsp?a=111&b=admin);
-->
<c:redirect url="guanwei.jsp">
    <c:param name="a" value="111"/>
    <c:param name="b" value="admin"/>
</c:redirect>

格式化操作

<!--
  时间格式化
  value:需要格式化的日期
  pattern:格式化规则
  var:格式化之后的名字
-->
<fmt:formatDate value="${DATE}" pattern="yyyy年MM月dd日 HH:mm:ss" var="DATE2" scope="page"/>
${DATE}<br/>
${DATE2}<br/>
<hr/>
<!--
  格式化数字
  var:格式化之后的名字
  value:需要格式化的数字
  pattern:格式化规则
-->
<fmt:formatNumber var="num" pattern="#.##" value="${10/3}" scope="page"/>

JSTL相关API

因为时间关系,我们这里只讲解了常用了标签,需要了解更多的童鞋可以参考以下标签库,此API出自于菜鸟教程

核心标签

标签描述
<x:out>与<%= ... >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when>和<x:otherwise>的父标签
<x:when><x:choose>的子标签,用来进行条件判断
<x:otherwise><x:choose>的子标签,当<x:when>判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform>共同使用,用于设置XSL样式表

格式化标签

标签描述
<fmt:formatNumber>使用指定的格式或精度格式化数字
<fmt:parseNumber>解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>使用指定的风格或模式格式化日期和时间
<fmt:parseDate>解析一个代表着日期或时间的字符串
<fmt:bundle>绑定资源
<fmt:setLocale>指定地区
<fmt:setBundle>绑定资源
<fmt:timeZone>指定时区
<fmt:setTimeZone>指定时区
<fmt:message>显示资源配置文件信息
<fmt:requestEncoding>设置request的字符编码

数据库标签

标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

XML标签

标签描述
<x:out>与<%= ... >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when>和<x:otherwise>的父标签
<x:when><x:choose>的子标签,用来进行条件判断
<x:otherwise><x:choose>的子标签,当<x:when>判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform>共同使用,用于设置XSL样式表

函数标签

函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首尾的空白符

休息休息,继续我们Servlet的学习--Servlet 入门到精通(四) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值