需要在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步,就自动销毁

最新文章

  1. QT基本操作
  2. T-SQL 基础学习 01
  3. mysql where 1=1和 1=0 的作用
  4. 关于struts2中表单提交时,中文乱码问题的解决
  5. JAVA_BaseDAO数据处理类
  6. ClickOnce的部署(.appref-ms)在软件限制策略中的解决方案
  7. node-webkit 写桌面系统
  8. eval()函数使用
  9. Object窥探
  10. php程序员的弱点
  11. zoj 3288 Domination (可能dp)
  12. 个人作业-2 必应词典安卓APP分析
  13. Java_泛型
  14. 读取tensorflow的checkpoint里保存的参数
  15. git 免密码push
  16. 共分为六部完成根据模板导出excel操作
  17. 比较字典推导式/dict()/通过键来构造的字典的速率 笔记
  18. 【LOJ】#2550. 「JSOI2018」机器人
  19. sencha touch 百度地图扩展(2014-6-24)(废弃 仅参考)
  20. 一、Kafka初认识

热门文章

  1. UE4 RHI与条件式编译
  2. 如何创建spring web 工程(maven工程)
  3. 内存泄漏之malloc替换方法
  4. js中遍历对象的属性和值的方法
  5. 1、Ubuntu linux下同步windows火狐foxfire 浏览器收藏夹问题
  6. SpringBoot 项目如何在tomcat容器中运行
  7. java开源APM概要
  8. Kubernetes---容器的生命周期
  9. Spring4学习回顾之路11-AOP
  10. LC 94. Binary Tree Inorder Traversal