1.   自定义标签

由于在JSP页面中直接嵌入Java代码会导致页面开起来非常混乱,不方便和美工等配合工作,为此,JSP提供了自定义标签技术,可以代替直接嵌入Java代码的方式提供动态逻辑,但自定义标签本质上仍然是Java代码

1.1. JSTL

JSTL(JavaServer Pages Standard Tag Library),JSP标准标签库,是一组JSP自定义标签。这些标签原本由第三方开发实现,由于效果质量非常好,sun公司就把这些标签作为标准标签打包成库并加以推广

现在先学习JSTL中主要自定义标签的用法,后面再学习如何定义自己的自定义标签

JSTL按照标签功能分为多个库,主要有:

标签库

uri

建议前缀

核心标签库

http://java.sun.com/jsp/jstl/core

c

格式化标签库

http://java.sun.com/jsp/jstl/fmt

fmt

函数库

http://java.sun.com/jsp/jstl/functions

fn

1.1.1. 核心标签库

主要包含<c:out>、<c:if>、<c:forEach>标签,要想在JSP页面中使用这些标签,需要使用<%@ taglib >指令引入核心标签库的配置文件(tld文件在对应jar包的META-INF下面)

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

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

指定taglib时需要引入带jsp的uri,这套是新版本(旧版本有时候不好用)

<c:out>

先把EL表达式计算结果中的特殊字符比如<、& 转换为对应的实体字符,再输出到HTML格式的响应中

JSP页面中

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:out value="${ '<hello>' }" ></c:out>

对应JSP生成的Servlet中主要的java代码

OutTag outTag = tagHandlerPool.get(OutTag.class);

outTag.setValue(PageContextImpl.proprietaryEvaluate("${ '<hello>' }", Object.class, pageContext, null));

outTag.doStartTag();

每个自定义标签都对应一个标签类,比如<c:out>对应OutTag,在JSP页面中每使用一次标签,就会执行一次对应标签对象的doStartTag()方法

和EL一样,自定义标签也是在服务器端执行的,客户端也看不到自定义标签,普通HTML注释对自定义标签也是无效的...

浏览器源代码

&lt;hello&gt;

<c:if>

相当于Java中的if语句,当EL表达式的值为true时,就会执行其标签体内容,也就是说会把标签体内容加入到HTML格式的响应中。如果为false,就会跳过标签体内容

<c:if test="${ param.age<18 }">

</c:if>

<c:forEach>

可以实现普通for循环和增强for循环两种效果

普通for循环效果

<c:forEach var="i" begin="0" step="1" end="5">

<c:out value="${ i }"></c:out> <br/>

</c:forEach>

var指定循环变量,每次循环开始时,内部都会调用pageContext.setAttribute("i", value),所以循环时可以使用EL表达式取出i当前的值。整个循环结束后,内部会调用pageContext.removeAttribute("i") 清理数据

begin指定循环变量的开始值

step指定循环变量的自增量,也称为步长,默认为1

end指定循环变量的结束值,其实循环条件是i <= end

需要注意以上属性都不支持EL表达式

增强for循环效果用来变量集合、数组

<c:forEach items="${ requestScope.userList }" var="user">

<c:out value="${ user.name }"></c:out> <br/>

</c:forEach>

items指定待遍历的集合或者数组,必须使用EL表达式

1.1.2. 格式化标签库

提供了<fmt:formatDate>标签用来在JSP页面中把Date对象转换为指定格式的字符串,并输出到HTML格式的响应中

<fmt:formatDate value="${ requestScope.user.birthday }" pattern="yyyy-MM-dd"/>

1.1.3. 函数库

函数库中提供了很多可以在EL表达式中使用的函数,其实就是一些静态方法,绝大部分都是操作字符串的,比如fn:length、fn:contains、fn:toLowerCase、fn:toUpperCase、fn:trim、fn:split、fn:join、fn:indexOf、fn:replace、fn:startsWith、fn:endWith、fn:substring

${ fn:length('hello') }

${ fn:contains('hello','el') }

1.2. 定义自己的自定义标签

定义并使用自己的标签分为三个步骤:

1 编写自定义标签类

2 在.tld文件中标签类

3 在JSP页面中引入tld文件后便可使用自定义标签

下面以模仿<c:if test=””>为例说明

1 MyIfTag.java

public class MyIfTag extends SimpleTagSupport {

private Boolean test; //对应标签的test属性

@Override

public void doTag() throws JspException, IOException {

if (test != null && test) {

Writer writer = getJspContext().getOut();

JspFragment tagBody = getJspBody();

tagBody.invoke(writer);

}

}

public Boolean getTest() {

return test;

}

public void setTest(Boolean test) {

this.test = test;

}

}

标签中需要用到到属性,需要对应标签类中的字段,并为字段提交get/set方法

如果标签中有default属性,由于default在Java中是关键字,可以使用_default变量名,并提供setDefault()方法给_default赋值

JspFragment表示标签体内容,标签体内容可能为空,也可能包含其他标签,也可能嵌入Java代码,其invoke(writer)方法会执行标签体内容,并使用指定writer把执行结果输出到响应中

这里并没有出现前面说的doStartTag()方法,原因是doStartTag()属于早期标签类实现方式,有些复杂。这里使用的是简易的实现方式,即继承SimpleTagSupport

2 mytag.tld

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

version="2.1">

<tlib-version>1</tlib-version>   <!-- 标签库内部版本号 -->

<short-name>my</short-name>   <!-- 建议前缀 -->

<uri>/my-tag</uri>   <!-- 标签库uri -->

<tag>   <!-- 用来定义标签 -->

<name>if</name>   <!-- 标签名称 -->

<tag-class>com.rupeng.web.tag.MyIfTag</tag-class>   <!-- 标签类 -->

<body-content>scriptless</body-content>   <!-- 表示标签体中不可嵌入Java代码 -->

<attribute>   <!-- 用来定义标签属性 -->

<name>test</name>   <!-- 属性名称 -->

<required>true</required>   <!-- 属性是否必须 -->

<rtexprvalue>true</rtexprvalue>   <!-- 属性是否支持EL表达式 -->

</attribute>

</tag>

</taglib>

<body-content>用来指定标签体内容类型,取值如下:

empty

标签体为空

scriptless

标签体中不可嵌入Java代码,其他无限制

JSP

标签体内容不做限制(当前JSP版本已废弃此选项)

3 JSP页面中

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

<%@ taglib uri="/my-tag" prefix="my" %>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>自定义标签</title>

</head>

<body>

<my:if test="${ param.age<18 }">禁</my:if>

</body>

</html>

Java Web 自定义标签的更多相关文章

  1. 杂项-Java:自定义标签

    ylbtech-杂项-Java:自定义标签 1.返回顶部 1. 一般我们说自定义标签是指JSP自定义标签.自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码.自定义标签是可重用的组 ...

  2. (转)java web自定义分页标签

    转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...

  3. Java Web自定义MVC框架详解 (转)

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

  4. java:tag 自定义标签应用

    一,tag类 1.1 TagMy标签类,格式化当前日期并输出 package com.dkt.tag; import java.io.IOException; import java.text.Sim ...

  5. Java jsp 自定义标签

    1 自定义标签 1.1 引入 需求: 向浏览器输出当前客户的IP地址 (只能使用jsp标签) 1.2 第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫 ...

  6. web 自定义标签

    Web Components 标准非常重要的一个特性是,它使开发者能够将HTML页面的功能封装为 custom elements(自定义标签).而自定义标签的好处,就是在大型web开发的时候,可以封装 ...

  7. java JSP自定义标签

    来至: http://blog.csdn.net/jiangwei0910410003/article/details/23915373 http://blog.csdn.net/jiangwei09 ...

  8. 权限管理(java+struts2(自定义标签)实现)--------->全代码演示

    地址:http://blog.chinaunix.net/uid-24343152-id-3673026.html 最近由于项目不是很紧所以总结了之前做了n遍的权限管理功能.以便之后系统copy之用. ...

  9. java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp

    1.首先配置web.xml  添加一下代码 <error-page> <error-code>500</error-code> <location>/e ...

随机推荐

  1. Nginx+Php-fpm运行原理详解

    一.代理与反向代理 现实生活中的例子 1.正向代理:访问google.com 如上图,因为google被墙,我们需要vpnFQ才能访问google.com. vpn对于“我们”来说,是可以感知到的(我 ...

  2. SQLSERVER 导出表数据为insert 语句

    1. 打开sqlserver的查询分析器,在图示的位置右键以及处理 选择生成对象 重要的是 选择 脚本编写选项 很快就能完成 4 转出的SQL文件就为 5.  但是记得 曾经出过问题, 字符集 还有 ...

  3. iphone 与 PC端电脑投屏设置

    1. iphone端安装: 屏幕投影助手 下载地址 https://itunes.apple.com/cn/app/ping-mu-tou-ying-zhu-shou/id1152332174?mt= ...

  4. 简单对比一下不同Windows操作系统在相同硬件配置的情况下浏览器js引擎的性能

    最近部门进行Windows客户端的测试产品单点性能, 感觉不在通的windows版本以及浏览器内核的情况下性能可能有差异, 也一直没有找到一个比较好的对比工具, 今天用chrome的控制台简单测试了下 ...

  5. View.requestLayout

    参考:安卓高手之路之图形系统(6)requestLayout的流程 一.invalidate和postInvalidate 这两个方法都是在重绘当前控件的时候调用的.invalidate在UI线程中调 ...

  6. Jquery 组 标签页

    <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...

  7. 给kali linux2.0装一个中文输入法

    没有中文输入法好痛苦啊.. 毕竟做了无限网卡,虚拟机和主机可以完完全全当两台设备使用了,所以kali还是需要一个中文输入法才方便. 由于使用的是比较新的kali版本和源,现在安装fcitx已经可以直接 ...

  8. CAP定理与BASE理论

    1. CAP定理 C:Consistency,一致性 A:Availability,可用性 P:Partition tolerance,分区容错性 CAP定理,指的是在一个分布式系统中,一致性.可用性 ...

  9. BZOJ1500[NOI2005]维修数列——非旋转treap

    题目描述 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 输入 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初 ...

  10. Laravel框架简单的用户管理[CURD]操作

    一个基于laravel和bootstrap的简单的用户管理,适合刚入门的我们,在做的过程中可以加深自己对laravel基础理解,里面存在一些问题,还未修改,比如css和js的引入,表单提交地址等不规范 ...