JSTL.带标签体的标签,方法和例子

时间:2023-03-09 18:26:46
JSTL.带标签体的标签,方法和例子

1.

实现 forEach 标签: 两个属性: items(集合类型, Collection), var(String 类型)

doTag:
遍历 items 对应的集合
 把正在遍历的对象放入到 pageContext 中, 键: var, 值: 正在遍历的对象.
把标签体的内容直接输出到页面上.

(1)首先建立一个customer类:

package com.lanqiao.javatest;

public class Customer {
private Integer id;
private String name;
private int age;
public Customer() {
super();
// TODO Auto-generated constructor stub
}
public Customer(Integer id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", age=" + age + "]";
} }

(2)ForEachTag类,继承于父类: SimpleTagSupport

package com.atguigu.javaweb;

import java.io.IOException;
import java.util.Collection; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class ForEachTag extends SimpleTagSupport{ private Collection<?> items; public void setItems(Collection<?> items) {
this.items = items;
} private String var; public void setVar(String var) {
this.var = var;
} @Override
public void doTag() throws JspException, IOException {
// * 遍历 items 对应的集合
if(items != null){
for(Object obj: items){
// * 把正在遍历的对象放入到 pageContext 中, 键: var, 值: 正在遍历的对象.
getJspContext().setAttribute(var, obj); //把标签体的内容直接输出到页面上.
getJspBody().invoke(null); }
} } }

(3)在lib下建立一个mytag.tld的xml文件,

<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"> <description>MyTag 1.2 core library</description>
<display-name>MyTag core</display-name>
<tlib-version>1.2</tlib-version>
<short-name>lxn</short-name>
<uri>http://lxn.com/myTag/core</uri> <tag>
<name>forEach</name>
<tag-class>com.lanqiao.javatest.ForEachTag</tag-class>
<body-content>scriptless</body-content> <attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute> <attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> </taglib>

(4)建立一个test.jsp页面:

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="com.atguigu.javaweb.Customer"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="lxn" uri="http://lxn.com/myTag/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <br><br>
<%
List<Customer> customers = new ArrayList<Customer>(); customers.add(new Customer(1, "AAA"));
customers.add(new Customer(2, "BBB"));
customers.add(new Customer(3, "CCC"));
customers.add(new Customer(4, "DDD"));
customers.add(new Customer(5, "EEE")); request.setAttribute("customers", customers);
%> <lxn:forEach items="${requestScope.custoemrs }" var="cust">
-- ${cust.id } -- ${cust.name } <br>
</lxn:forEach> <br><br>
</body>
</html>

2.使用标签处理器类,其中有一些方法:

package com.atguigu.javaweb;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
//标签处理器类
public class TestJspFragment extends SimpleTagSupport { @Override
public void doTag() throws JspException, IOException {     //JspFragment,是标签体,getJspBody()是获取标签体
JspFragment bodyContent = getJspBody();
//JspFragment.invoke(Witer): Writer 即为标签体内容输出的字符流, 若为 null, 则
//输出到 getJspContext().getOut(), 即输出到页面上. //1. 利用 StringWriter 得到标签体的内容.
StringWriter sw = new StringWriter();
bodyContent.invoke(sw); //2. 把标签体的内容都变为大写
String content = sw.toString().toUpperCase(); //3. 获取 JSP 页面的 out 隐含对象, 输出到页面上
getJspContext().getOut().print(content);
} }