JavaWeb笔记之JSTL和自定义标签

概述 本篇博文中主要探讨以下内容:

JSTL的核心标签库的使用开发简单的自定义标签的步骤在Web应用中使用标签

JSTL和自定义标签

一、JSTL1.1 通用目的标签1.1.1 out标签1.1.2 set标签1.1.3 remove标签

1.2条件控制标签1.2.1 if标签1.2.2 choose标签

1.3 循环控制标签1.3.1 forEach标签

二、自定义标签2.1 创建"Hello"标签2.2 访问标签体2.3 自定义标签属性

一、JSTL

JSTL(JSP Standard Tag Library):JSP标准标签库

使用JSTL可以提高JSP页面的开发效率,也可以避免重复开发标签库。

JSTL包

taglibs-standard-impl-1.2.5.jar taglibs-standard-spec-1.2.5.jar

下载地址: http://tomcat.apache.org/download-taglibs.cgi

JSTL库及使用的URI与前缀

库名称使用的URI前缀核心标签库http://java.sun.com/jsp/jstl/corecXML标签库http://java.sun.com/jsp/jstl/xmlx国际化和格式化库http://java.sun.com/jsp/jstl/fmtfmtSQL标签库http://java.sun.com/jsp/jstl/sqlsql函数库http://java.sun.com/jsp/jstl/functionsfn

核心(core)标签库

通用目的

//在页面中显示内容

//定义或者设置一个作用域变量值

//清除一个作用域变量

//捕获异常

条件控制

//根据一个属性等于一个值改变处理

//根据一个属性等于一组值改变处理

//用来测试一个条件

//当所有when条件都为false时,执行该标签内的内容

循环控制

//对集合中的每个对象作迭代处理

//对给定字符串中的每个子串执行处理

URL处理

//重写URL并对它们的参数编码

//访问Web应用程序外部的内容

//告诉客户浏览器访问另一个URL

//用来传递参数

在JSP页面中使用JSTL,必须使用taglib指令来引用标签库

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

1.1 通用目的标签

1.1.1 out标签

标签的功能与JSP中脚本表达式(<%= %>)相同,用于向页面输值。

格式一:不带标签体

default = "defaultValue"/>

格式二:带标签体

default value

标签需要一个value属性,它的值是向页面中输出的值。default表示如果value的值为null或者不存在,则输出该默认值;如果escapeXml的值为true(默认值),表示将value属性值中包含的<,>,’,"或者&等特殊字符转换为相应的实体引用(或者字符编码),如小于号(<)将转换为<;大于号(>)转换为>;如果escapeXml的值为false将不转换。

//输出客户地址

%>

${ msg }

//页面输出结果:B

另外一种格式

//不带标签体的情况 单标签

或者

//带标签体的情况 双标签标签

value

//其中 target属性是指定对象名

property属性是指定属性名

value属性是要设置的值

注意:target属性的值应该是用EL的形式,如target="${book}",不能写成

target="book"

1.1.3 remove标签

作用:从域对象中移除值

属性: var:移除的key值

代码:

remove标签

${ msg }

已经把msg移除了

${ msg }

注意:remove标签不能用于删除JavaBeans或Map对象

1.2条件控制标签

1.2.1 if标签

作用:进行语句的判断。注意:只有if,没有else属性: test:必须要出现的,判断的条件 var:把判断条件的结果(true或者false)保存到var变量中 scope:作用域 代码:

if标签

<%

int n = 20;

request.setAttribute("n", n);

%>

n=10

n!=10

${ i }

页面输出结果:n!=10 false

1.2.2 choose标签

作用:用来进行判断,但是复合的标签

属性: 关注when标签,test属性代码:

<%

int n = 10;

request.setAttribute("n", n);

%>

n=20

n=其他

页面输出结果:n=其他

1.3 循环控制标签

1.3.1 forEach标签

作用:用来迭代数据 forEach当成普通的for循环。for(int i=1; i<=10; i++){} forEach当成增强的for循环。for(String key : 集合){}属性: var:声明变量 begin:从哪开始 end:到哪结束 step:步长 varStatus:在迭代的过程中会产生一些信息,把信息保存在varStatus属性。其中属性有一些值: count:代表计数 index:代表下标 first:判断是否是第一个元素 last:判断是否是最后一个元素 current:代表当前迭代的元素 items:代表的是要迭代的集合(数组 list set map)代码:

<%@page import="com.pers.domain.User"%>

<%@page import="java.util.HashMap"%>

<%@page import="java.util.Map"%>

<%@page import="java.util.ArrayList"%>

<%@page import="java.util.List"%>

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

pageEncoding="UTF-8"%>

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

Insert title here

<%

for(int i=0;i<=10;i++){

}

%>

普通for循环

${ vs.count }

模拟增强for循环

${ s }

遍历数据,数据需要存入在域对象中,遍历List集合

<%

List list = new ArrayList();

list.add("A");

list.add("B");

list.add("C");

request.setAttribute("list", list);

%>

${ s }

遍历Map集合

<%

Map map = new HashMap();

map.put("a", "A");

map.put("b", "B");

map.put("c", "C");

request.setAttribute("map", map);

%>

${ entry.key } -- ${ entry.value }

List集合中有Java对象

<%

List ulist = new ArrayList();

ulist.add(new User(1,"张三","zhangsan123","zhangsan@163.com"));

request.setAttribute("ulist", ulist);

%>

${ user.username } -- ${ user.email }

二、自定义标签

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。

JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。

你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。

开发简单的自定义标签的步骤 (1)创建标签处理类 (2)创建标签库描述文件TLD (3)在JSP页面中使用标签

2.1 创建"Hello"标签

接下来,我们想创建一个自定义标签叫作

标签格式为:

要创建自定义的JSP标签,你首先必须创建处理标签的Java类。所以,让我们创建一个HelloTag类,如下所示:

package com.runoob;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class HelloTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

JspWriter out = getJspContext().getOut();

out.println("Hello Custom Tag!");

}

}

以下代码重写了doTag()方法,方法中使用了getJspContext()方法来获取当前的JspContext对象,并将"Hello Custom Tag!"传递给JspWriter对象。

编译以上类,并将其复制到环境变量CLASSPATH目录中。最后创建如下标签库:webapps\ROOT\WEB-INF\custom.tld。

1.0

2.0

Example TLD

Hello

com.runoob.HelloTag

empty

接下来,我们就可以在JSP文件中使用Hello标签:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>

A sample custom tag

以上程序输出结果为:

Hello Custom Tag!

2.2 访问标签体

你可以像标准标签库一样在标签中包含消息内容。如我们要在我们自定义的Hello中包含内容,格式如下:

This is message body

我们可以修改标签处理类文件,代码如下:

package com.runoob;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class HelloTag extends SimpleTagSupport {

StringWriter sw = new StringWriter();

public void doTag()

throws JspException, IOException

{

getJspBody().invoke(sw);

getJspContext().getOut().println(sw.toString());

}

}

接下来我们需要修改TLD文件,如下所示:

1.0

2.0

Example TLD with Body

Hello

com.runoob.HelloTag

scriptless

现在我们可以在JSP使用修改后的标签,如下所示:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>

A sample custom tag

This is message body

以上程序输出结果如下所示:

This is message body

2.3 自定义标签属性

你可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法, JavaBean 中的setter方法如下所示:

package com.runoob;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.io.*;

public class HelloTag extends SimpleTagSupport {

private String message;

public void setMessage(String msg) {

this.message = msg;

}

StringWriter sw = new StringWriter();

public void doTag()

throws JspException, IOException

{

if (message != null) {

/* 从属性中使用消息 */

JspWriter out = getJspContext().getOut();

out.println( message );

}

else {

/* 从内容体中使用消息 */

getJspBody().invoke(sw);

getJspContext().getOut().println(sw.toString());

}

}

}

属性的名称是"message",所以setter方法​​是的setMessage()。现在让我们在TLD文件中使用的元素添加此属性:

1.0

2.0

Example TLD with Body

Hello

com.runoob.HelloTag

scriptless

message

现在我们就可以在JSP文件中使用message属性了,如下所示:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>

A sample custom tag

以上实例数据输出结果为:

This is custom tag

你还可以包含以下属性:

属性描述name定义属性的名称。每个标签的是属性名称必须是唯一的。required指定属性是否是必须的或者可选的,如果设置为false为可选。rtexprvalue声明在运行表达式时,标签属性是否有效。type定义该属性的Java类类型 。默认指定为 Stringdescription描述信息fragment如果声明了该属性,属性值将被视为一个 JspFragment。

以下是指定相关的属性实例:

.....

attribute_name

false

java.util.Date

false

.....

如果你使用了两个属性,修改TLD文件,如下所示:

.....

attribute_name1

false

java.util.Boolean

false

attribute_name2

true

java.util.Date

.....