JSP 笔记 —— JSTL 标签库

news/2024/5/18 16:28:19 标签: jstl

一、关于JSTL 标签库

JSTL,JSP 标准标签库,由Apache 的Jakarta 小组负责维护,所以在apache的下载发布资源(distribution)时需进入jakarta 目录下载。

JSTL  的作用?取代在JSP 页面嵌入java 代码的方式,提高程序可维护性。

JSTL 与EL 的区别?EL 只是用于访问数据用户数据与bean数据的,JSTL 除了可访问,还可设置。


JSTL 标签库由4个标签库组成:core、fmt、sql、xml、functions 标签库。

一个标签库由两部分组成:jar 文件包、tld文件(tag library description)。

使用JSTL 需要的对应的 jar 包及各标签库的tld文件定义位置(即taglib指令的uri属性值):

jar 包:jstl.jar 、standard.jar

tld 定义位置:

core库:http://java.sun.com/jsp/jstl/core
fmt 库:http://java.sun.com/jsp/jstl/fmt
sql 库:http://java.sun.com/jsp/jstl/sql
xml 库:http://java.sun.com/jsp/jstl/xml
functions库:http://java.sun.com/jsp/jstl/functions


二、引用JSTL 标签库的配置

主要是对uri 属性。

方式一:标准定义

1、导入jstl.jar、standard.jar,发布时也需要包含进发布路径。

2、JSP 页面中使用:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="任意名字" %>


方式二:自定义

1、导入jstl.jar、standard.jar,同上。此外,还需下载使用标签库的tld 文件,假设core 库的描述文件c.tld放在WEB-INF/taglib目录下。

2、在web.xml 中配置标签库。

<jsp-config>
  	<taglib>
  		<taglib-uri>myTaglib</taglib-uri>
  		<taglib-location>WEB-INF/taglib/c.tld</taglib-location>
  	</taglib>
  </jsp-config>
3、JSP 页面中使用:

<%@ taglib uri="myTaglib" prefix="任意名字" %>



三、JSTL 核心标签库core

核心标签的功能实现定义在standard.jar 包的org.apache.taglibs.standard.tag.common.core 与 org.apache.taglibs.standard.tag.rt.core 包下。

核心标签分为四类:表达式标签(out、set、remove、catch)、URL相关标签(import、redirect、url、param)、流程控制标签(if、when、choose、otherwise)、循环标签(forEach、forTokens,其中forTokens 可指定分隔符后遍历子串)

标签如下(取标签库前缀prefix 为core):

1、catch标签:

<core:catch var="aException">
	<core:out value="request" ></core:out>
	<core:set></core:set><!--此处将发生异常,因为没有指定set 标签的必须属性-->
</core:catch>
<core:if test="${aException != null }">
	<core:out value="${pageScope.aException }"></core:out>
</core:if>
所有属性说明:var,非必须的。用于指定可能发生的异常的名称,即以var指定的值为键,以发生的异常为值,存储在pageContext 中。
打开c:catch 标签的源代码(org.apache.taglibs.standard.tag.common.core.CatchTag),其中一段代码如下:

public void doCatch(Throwable t) {
        if (var != null)
            pageContext.setAttribute(var, t, PageContext.PAGE_SCOPE);
        caught = true;
    }
可见是以键值对形式保存了异常。

2、if 标签:

<core:if test="判断条件,必须" var="test的boolean结果,可选" scope="var的范围">
	条件体
</core:if>


3、out 标签:

<core:out value="输出的内容,必须"></core:out>

4、when、choose  与 otherwise 标签:choose只能作为when与otherwise的父标签,且内部不能包含之外的其它标签,只能有一个otherwise

<core:choose>
	<core:when test="">
		条件体1
	</core:when>
	<core:when test="">
		条件体N
	</core:when>
	<core:otherwise>
		只能包含一个otherwise
	</core:otherwise>
</core:when>

相当于 switch 结构,otherwise为默认执行。


5、set 标签:属性分为两组

<core:set property="被设置在target中的属性名" scope="var的范围" 
target="具有setter方法的JavaBean对象或java.util.Map对象" value="表达式"
var="存储value表达式结果的变量"></core:set>
属性都非必须的,但有的属性之间存在依赖关系。set 标签既可设置值,也可产生变量var。实例:

var、scope、value 为一组用于设置变量;

target、property、value 为一组用于设置bean 的属性值;

<jsp:useBean id="wjb" class="com.milan.pojo.Person" ></jsp:useBean>
<%--设置新的变量 --%>
<core:set var="userName" scope="page" value="weijianbao"></core:set>
<%--设置bean的属性值 --%>
<core:set  target="${wjb}" property="name" value="zhengyingxia"></core:set>
<core:out value="${userName}"></core:out>
<core:out value="${wjb.name}"></core:out>
能正确输出, 注意target 是通过EL 赋值的,且操作的bean 只能通过jsp:useBean 标签获得,而不能通过new 创建,因为EL 无法访问到new 创建的对象。此外,应保证property 及其setter方法存在。

此外target 还可指定为java.util.Map 的对象:

<%
Map<String,String> user=new HashMap<String,String>();
user.put("name", "郑");
//session.setAttribute("user", user);
%>
<core:out value="${session.user.name} "></core:out><%--无法访问 --%>
<core:out value="sessionScope.user.name:${sessionScope.user.name} "></core:out>

<core:set target="${user}" property="name" value="郑成功"></core:set>
<core:out value="user.name:${user.name}"></core:out>
注:虽然set是在第二个与第三个out标签之间的,但两个标签都显示设置后的值。


6、remove 标签:

<%-- <core:remove var="移除的变量名" scope="指定范围"/> --%>

<core:set var="aVar" scope="session" value="varValue"></core:set>
<core:out value="${aVar}"></core:out>
<core:out value="${sessionScope.aVar} "></core:out>

<core:remove var="aVar" scope="session"/>
<core:out value="${aVar}"></core:out>
注:通过jstl 标签设置的变量,既可通过EL 的范围对象(如sessionScope),也可直接访问,上面的前两个out 标签都能显示变量值。


7、foreach 标签:

<core:forEach items="遍历的集合" begin="开始索引" end="结束索引" step="步长,默认1"
var="遍历的集合当前item" varStatus="迭代状态,有多个可选值" >
	<core:out value=""></core:out>
</core:forEach>


8、url、param、forTokens 标签:

暂不了解


9、import 与 redirect 标签:

暂不了解


三、sql 标签库

包含标签:
sql:transaction 
sql:query 
sql:update 
sql:param 
sql:dateParam 
sql:setDataSource  


四、fmt 标签库


五、functions 标签库


六、xml 标签库


七、JSTL 与 EL 的结合使用

1、关于EL 访问数据的顺序

属性的默认访问顺序为:page——>request——>session——>application,即从范围由小到大。

EL 提供了pageScope、requestScope、sessionScope、applicationScope 四个对象封装了page 、request、session、application范围内的属性,这四个对象都是Map 类型。

大前提:EL 只能访问 JavaBean 与 内置对象中的数据,在jsp的java 片段中new 的JavaBean 类的对象,不算JavaBean,所以无法通过EL 访问到。测试:

<%!String var="pageVar"; %>
<%
application.setAttribute("var", "applicationScope");
session.setAttribute("var", "sessionScope");
request.setAttribute("var", "requestScope");
%>
<core:out value="var:${var}"></core:out><br><!--重点:将显示requestScope,因为在page中查找不到,所以先查到了request中的var属性-->
<core:out value="applicationScope.var:${applicationScope.var}"><!--显示applicationScope-->
</core:out><br>
<core:out value="sessionScope.var:${sessionScope.var}"><!--显示sessionScope-->
</core:out><br>
<core:out value="requestScope.var:${requestScope.var}"><!--显示requestScope-->
</core:out><br>
<core:out value="pageScope.var:${pageScope.var}"><!--重点:此处无显示,因为page 范围中不存在var ,page内置对象也没有设置属性的方法-->
</core:out><br>

注:EL 的内置对象中,除了pageContext 对象是ServletContext 类型(用于获取其它内置对象),其它的都是java.util.Map 类型。


2、JSTL 与 EL 结合使用

JSTL 只有与EL 结合才能发挥强大功能,JSTL 的标签中的属性值都是引号包围的,即是是对象的赋值,如set 标签的 target 标签。所以,进行对象的赋值只能通过结合EL 实现,如:

<c:set target="${beanId}" property="attrName" value="..."/>
此外,算术与逻辑运算也都是在EL 中完成,如:

<c:out value="${3+2}-5"/><!--显示"5-5"-->












 





http://www.niftyadmin.cn/n/701435.html

相关文章

c-一维字符数组

一维字符数组的定义及初始化 一维字符数组的定义格式为&#xff1a; char 数组名[数组大小]; 例如&#xff1a; char c[10]; 该语句定义了一个一维字符数组 c&#xff0c;大小为 10&#xff0c;即占 10 个字符变量空间&#xff0c;最大可存储长度为 9 的字符串&#xff08;第…

生成接口文档

一.方式 前后端交互&#xff0c;有接口&#xff0c;那必须要有文档。 文档可以选择第三方文档&#xff0c;接口和文档彻底分离&#xff0c;如docway、showdoc&#xff08;推荐&#xff09; 或者选择文档工具包配合代码生成&#xff0c;如swagger、japidocs&#xff08;推荐&a…

MySQL 笔记-DriverManager 类与 Driver 类

一、DriverManager 类 所有方法&#xff1a; //注册驱动 DriverManager.registerDriver(Driver driver); DriverManager.registerDriver(Driver driver, DriverAction da);//da 为调用deregisterDriver 类方法时执行的驱动事件 //获取驱动 DriverManager.getDriver(String url…

android 测试必备 -adb 工具的使用

ADB&#xff0c;即 Android Debug Bridge&#xff0c;它是 Android 开发/测试人员不可替代的强大工具&#xff0c;也是 Android 设备玩家的好玩具。 安装adb.exe 其实&#xff0c;这个不需要安装&#xff0c;只要下载 copy到对应目录即可。如果从事android 开发的&#xff0…

Android 基于bmob平台的手机登录验证码注册 等功能实现

首先是基于Bmob 平台&#xff0c;采用MVP 开发模式。效果见图&#xff1a; 下面一 一给出源码&#xff1a; MVP 目录结构&#xff1a; 登录/注册的Activity: package com.example.yangzi.mvp_dev.ui.activity;import android.content.Context; import android.content.Intent;…

Java —— Comparable 接口

一、Comparable 接口 作用&#xff1a;定义了一个类的两个实例比较大小的方法&#xff0c;以用于排序。 定义&#xff1a; 所在包&#xff1a;java.lang 具体定义&#xff1a; interface Comparable<T>{int compareTo(T o); } compareTo 方法说明&#xff1a; 1、返…

Java实现笛卡尔积算法-递归

import java.util.ArrayList; import java.util.List;public class Test{public static void main(String[] args) {List<String> list1 new ArrayList<String>();list1.add("蓝色");list1.add("绿色");List<String> list2 new ArrayL…

json解析1 - 普通json解析为java对象

案例一&#xff1a;&#xff08;两层嵌套&#xff09; 请求数据&#xff1a; ps:一个对象包含一个对象&#xff1b; 方式一&#xff1a;使用map 代码段&#xff1a; RestController RequestMapping("test") public class testDemo {PostMapping("demo&quo…