10.自定义EL函数和自定义标签
需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库
如果sun公司的EL函数库没有或者无法满足,就需要自己写 自定义标签或者写一个EL函数
自定义EL函数:
1.写这样一个 满足你的逻辑的函数(必须是静态的)
public class elDemo { public static String demo(String str) {
return str;
} }
2.这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0"> <tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>el</short-name>
<uri>/el</uri> <function>
<name>demo</name>
<function-class>elDemo</function-class>
<function-signature>java.lang.String demo (java.lang.String)</function-signature>
</function> </taglib>
3.在jsp页面去使用
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/el" prefix="el" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '2.jsp' starting page</title>
</head> <body>
${el:demo("sss") }
</body>
</html>
自定义标签
1.传统自定义标签:
1.遇到自定义标签,首先实例化标签对应的标签处理器类
2.调用setPageContext方法,把页面的pageContext对象 传递给标签处理器类
3.看标签是否有父标签,有则把父标签作为一个对象,调用setParent方法调用该对象
//(上面是自动的(服务器做的),但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾))
4.完成以上标签的初始化工作后,服务器就开始执行标签,这时遇到标签的开始标签 ,就调用doStartTag方法
5.如果标签有标签体,这时服务器一般会执行标签体
6.服务器遇到JSP页面结束标签,则调用处理器的doEndTag方法
7.整个标签执行完后,服务器一般会调用release方法释放标签工作时所占用的资源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/foreachTag" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '3.jsp' starting page</title>
</head> <body>
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("dddd");
request.setAttribute("list", list); %>
<c:foreach var="str" items="${list }">
${str }
</c:foreach>
</body>
</html>
//标签处理器类 自定义foreach标签
public class foreachTag extends SimpleTagSupport {
private Object items;
private String var; public void setItems(Object items) {
this.items = items;
} public void setVar(String var) {
this.var = var;
} @Override
public void doTag() throws JspException, IOException {
List list = (List) items;
Iterator it = list.iterator(); while(it.hasNext()) {
Object value = it.next();
this.getJspContext().setAttribute(var, value);
this.getJspBody().invoke(null);
}
}
}
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>simple</short-name>
<uri>/foreachTag</uri> <tag>
<name>foreach</name>
<tag-class>com.Tag.foreachTag</tag-class>
<body-content>scriptless</body-content> <attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
2.简单自定义标签(及属性的设置)
1.遇到简单标签,同样先实例化标签对应的标签处理器类
2.调用setJspContext,把页面pageContext传递给标签处理器类
3.调用setParent方法,把父标签传递进去,如果没有,则传递null
//(上面是自动的,但是需要做到:1.在JSP页面中,写好taglib指令,并合理调用自定义标签 2.写好标签处理器类 3.写好tld文件(抄头抄尾)
4.调用setJspBody方法,把封装了标签体JspFragment传递给标签处理器类
5.执行页面中的自定义标签,执行标签实际上就是调用doTag方法
public class SimpleTag extends SimpleTagSupport { private int count; public void setCount(int count) {
this.count = count;
}
@Override
public void doTag() throws JspException, IOException { JspFragment jf = this.getJspBody();
for(int i = 0;i<count;i++) {
jf.invoke(null);
}
} }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>simple</short-name>
<uri>/sTag</uri> <tag>
<name>sTag</name>
<tag-class>com.Tag.SimpleTag</tag-class>
<body-content>scriptless</body-content> <attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> </taglib>
注意:
1.简单自定义标签在tld文件中 <body-content>srcipt</body-content> 传统自定义标签 <body-content>JSP</body-content>
2.设置带属性的标签的步骤:1.在标签处理器类中编写每个属性对应的setter方法 2.在TLD文件中描述标签的属性
3.在设置带属性的标签时,除了基本的name(属性名)的设置,还有:
<required>true</required> (这个元素设置该属性是否必须)
<rtexprvalue>true</rtexprvalue> (这个元素设置该属性是否支持运行时表达式(这样就支持了el表达式)为属性赋值 一般都设置为true)
4.传统自定义标签的生命周期为创建该自定义标签到工程结束;;简单自定义标签的生命周期为 创建该标签,到完成上面的5步,就自动销毁
10.自定义EL函数和自定义标签的更多相关文章
- 自定义EL函数、自定义JSTL标签
自定义EL函数 1.做一个类(静态) package com.maya.el; public class ELBiaoDaoShi { public static String TiHuan(Stri ...
- EL函数以及自定义标签的应用
一.EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定,例如下: package cn.wzbril ...
- 自定义el函数
1.1.1 自定义EL函数(EL调用Java的函数) 第一步:创建一个Java类.方法必须是静态方法. public static String sayHello(String name){ retu ...
- EL函数和自定义EL函数
简介 EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了.但是EL函数还是和JSTL技术绑定在一起.下面将介绍如何 ...
- 【JSP】EL函数和自定义EL函数
简介 EL原本是JSTL1.0中的技术(所以EL和JSTL感情如此好就是自然的了),但是从JSP2.0开始,EL就分离出来纳入了JSP的标准了.但是EL函数还是和JSTL技术绑定在一起.下面将介绍如何 ...
- [JSP]自定义EL函数以及使用
有时候在JSP页面需要进行一连串的字符串的处理,需要进行自定义EL函数. 先看EL函数的tld文件: standard.jar下面: 自定义EL函数: 1.编写EL函数(全是public static ...
- [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...
- EL表达式 EL函数 自定义el函数 《黑马程序员_超全面的JavaWeb视频教程vedio》
\JavaWeb视频教程_day12_自定义标签JSTL标签库,java web之设计模式\day12_avi\12.EL入门.avi; EL表达式 1. EL是JSP内置的表达式语言! * jsp2 ...
- javaWeb学习总结(10)- EL函数库(2)
一.EL函数库介绍 由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用. 这些EL函数在JSTL开发包中进行描述,因此在JSP页 ...
随机推荐
- 014-操作系统下验证下载文件的 MD5/SHA1/SHA256
一.mac 1.md5 openssl md5 /path/to/file 新的macOS默认支持:md5 filename 2.sha256 openssl dgst -sha256 /path/t ...
- DSS分发压力实验
DSS分发压力实验 昨天为验证依托DSS搭建流媒体直播监控系统的可行性,及确定实时流画面出现严重花屏的原因,做了一个压力实验. 网络拓扑如图: 1.DVR上配置4路视频(CIF / 25fps / 1 ...
- jenkins打完包在哪里
查看控制台输出最后面一行是jar包的位置 [JENKINS] Archiving /var/lib/jenkins/jobs/moven-test/workspace/target/projectA- ...
- (IStool)删除新版本已废弃但可能会影响新版本运行的文件夹/文件
需求:老版本服务器的某些文件或文件夹在新版本已弃用,新版本覆盖安装时需要将文件夹或文件删除 实现:覆盖安装完成后将对应目录下的文件删除 [InstallDelete] Type: files; Nam ...
- 2019Java常见面试下
1.集合的作用是什么? 数据的传送增.删.改.查.constainsAll,可以存放不同类型的对象. 2.集合的通用方法有那些?通用方法是什么?(操作) 集合List的遍历方法有: Iterator: ...
- NDK学习笔记-使用现有so动态库
前面将的都是如何使用C/C++文件生成so动态库,那么在使用别人的so动态库的时候应该怎么做呢?这篇文章就是使用一个变声功能的动态库,完成对于以有so动态库的说明. 动态库来源 在互联网中,有着许许多 ...
- 字符编码笔记:ASCII,Unicode 和 UTF-8(理解)
1.ASCII 码 美国制定的字符编码规则,对英语字符与二进制位之间的关系做了统一规定. 占一个字节,8 位,最多可表示 2^8 = 256 种状态(字符) 实际共有 128 个字符,只占用一个字节的 ...
- vue-cli 3.x搭建项目以及其中vue.config.js文件的配置
参考链接:https://www.cnblogs.com/wxh0929/p/11271551.html vue-cli3全面配置详解:https://www.jb51.net/article/150 ...
- Mac/Windows 跳过sourcetree的注册环节
前几天在电脑上装了个sourcetree,结果它硬要我注册,烦得很. 于是查了一下怎么跳过注册环节,结果还真有,试了一下,真给力! 特此记录. MAC版本: 打开sourcetree 关闭 ...
- [转帖CCIX]
业界七巨头联手,数据中心通过PCIe实现25Gbps数据通信! 2017-06-07 17:31 CCIX(Cache Coherent Interconnect for Accelerators,针 ...