J2EE&JSP标签02&Foreach标签&select

简介: J2EE&JSP标签02&Foreach标签&select

一.foreach标签

  • 编写助手类
public class ForeachTag extends BodyTagSupport {
  //存放数据源
  private List<?> items;
  //每次循环获取的对象放入pageContext中,并以var属性的值为key进行保存
  //示例: 页面上标签var属性指定为item,则每次循环取出的对象(obj)将执行如下:
  //pageContext.setAttribute("item", obj); 
  //页面中可以使用EL表达式取出对象中的属性, 如: ${item.name}
  private String var;
  public List<?> getItems() {
    return items;
  }
  public void setItems(List<?> items) {
    this.items = items;
  }
  public String getVar() {
    return var;
  }
  public void setVar(String var) {
    this.var = var;
  }
  @Override
  public int doStartTag() {
    if(Objects.isNull(this.items) || this.items.size() == 0) {
      return SKIP_BODY;
    }
    Iterator<?> iterator = this.items.iterator();
    Object obj = iterator.next();
    this.pageContext.setAttribute(var, obj);
    this.pageContext.setAttribute("iterator", iterator);
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doAfterBody() {
    Iterator<?> it = (Iterator<?>)this.pageContext.getAttribute("iterator");
    if(it.hasNext()) {
      this.pageContext.setAttribute(var, it.next());
      return EVAL_BODY_AGAIN;
    }
    return SKIP_BODY;
  }
}
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>Simple Tags</short-name>
  <uri>/zking</uri>
<tag>
    <!-- 标签名 -->
    <name>foreach</name>
    <!-- 标签助手类 -->
    <tag-class>com.zking.tagdemo.tag.ForeachTag</tag-class>
    <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
    <body-content>jsp</body-content>
    <attribute>
      <!-- 属性名, OutTag类中的val属性相匹配 -->
      <name>items</name>
      <!-- 表示该属性为必要的属性 -->
      <required>true</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签test属性,用于输出test的值</description>
    </attribute>
    <attribute>
      <!-- 属性名, OutTag类中的val属性相匹配 -->
      <name>var</name>
      <!-- 表示该属性为必要的属性 -->
      <required>true</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签test属性,用于输出test的值</description>
    </attribute>
  </tag>
  • 测试数据辅助类
public class Book {
  private int id;
  private String name;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
public class TestData {
  public static List<Book> getBooks() {
    List<Book> books = new ArrayList<>();
    Book b1 =  new Book();
    b1.setId(1);
    b1.setName("水浒传");
    Book b2 =  new Book();
    b2.setId(2);
    b2.setName("红楼梦");
    Book b3 =  new Book();
    b3.setId(3);
    b3.setName("西游记");
    books.add(b1);
    books.add(b2);
    books.add(b3);
    return books;
  }
}
  • 在页面上使用标签
<%@page import="com.zking.mvc.test.*,java.util.List" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="z" uri="/zking" %>
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
  <h1><%=System.currentTimeMillis()%></h1>
  <z:hello/>
  <!-- out -->
  <z:out val="adb"/>
  <%
    request.setAttribute("name", null);
  %>
  <z:out val="${name}" defaultVal="test"/>
  <p>
  <!-- if -->
  <z:if test="${100 == 100}">
    测试if(100 == 100)
  </z:if>
  <z:if test="${100 == 1}">
          测试if(100 == 1)
  </z:if>
  <p>
  <!-- foreach -->
  <%
  //获取测试数据
  List<Book> books = TestData.getBooks();
  //放入request对象中
  request.setAttribute("books", books);
  %>
  <z:foreach items="${books}" var="book">
    <p>${book.id } - ${book.name }</p>
  </z:foreach>
</body>
</html>

二.select

编写助手类
package com.zking.tagdemo.tag;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class SelectTag extends BodyTagSupport{
  private String name;
  private Map<String, String> options;
  private String selectedValue;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Map<String, String> getOptions() {
    return options;
  }
  public void setOptions(Map<String, String> options) {
    this.options = options;
  }
  public String getSelectedValue() {
    return selectedValue;
  }
  public void setSelectedValue(String selectedValue) {
    this.selectedValue = selectedValue;
  }
  @Override
  public int doStartTag() throws JspException {
    JspWriter out = this.pageContext.getOut();
    try {
      out.print("<select name=\""+name+"\">");
      for (String key : options.keySet()) {
        if(key.equals(selectedValue)) {
          out.print(" <option value=\""+key+"\" selected>"+options.get(key)+"</option>");
        }else {
          out.print(" <option value=\""+key+"\" >"+options.get(key)+"</option>");
        }
      }
      out.print("</select>");
    } catch (Exception e) {
      e.printStackTrace();
    }
    return SKIP_BODY;
  }
}
编写tld
<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <short-name>Simple Tags</short-name>
  <uri>/zking</uri>
<tag>
    <!-- 标签名 -->
    <name>selectTag</name>
    <!-- 标签助手类 -->
    <tag-class>com.zking.tagdemo.tag.SelectTag</tag-class>
    <!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
    <body-content>empty</body-content>
    <attribute>
      <!-- 属性名, OutTag类中的val属性相匹配 -->
      <name>name</name>
      <!-- 表示该属性为必要的属性 -->
      <required>true</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签test属性,用于输出test的值</description>
    </attribute>
    <attribute>
      <!-- 属性名, OutTag类中的val属性相匹配 -->
      <name>options</name>
      <!-- 表示该属性为必要的属性 -->
      <required>true</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签test属性,用于输出test的值</description>
    </attribute>
    <attribute>
      <!-- 属性名, OutTag类中的val属性相匹配 -->
      <name>selectedValue</name>
      <!-- 表示该属性为必要的属性 -->
      <required>false</required>
      <!-- 该属性可以接受EL表示式的值 -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 标签描述,用于说明标签的作用 -->
      <description>out标签test属性,用于输出test的值</description>
    </attribute>
  </tag>
在页面上使用标签
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.tagdemo.tag.Book"%>
<%@page import="com.zking.tagdemo.tag.BookTest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" uri="/zking" %>
<!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>
sname}-${book.tid}</p>
  </z:foreach>
  <!-- 模拟数据 -->
  <%
    request.setAttribute("name", "瑶姐");
    Map<String,String> map = new HashMap<>();
    map.put("1", "宝宝");
    map.put("2", "辉辉");
    map.put("3", "杰少");
    request.setAttribute("options", map);
  %>
  <select name="type">
  <option value="1">药药</option> 
  <option value="2">理论</option> 
  <option value="3" selected="selected">付费</option> 
  </select>
  <z:selectTag name="selectName" options="${options}" selectedValue="3"/>
</body>
</html>


相关文章
|
5月前
|
SQL XML Java
JSP 教程 之 JSP 标准标签库(JSTL) 4
**JSP的JSTL是用于简化Web开发的标签库,包括核心、格式化、SQL、XML和函数5个部分。SQL标签库允许与数据库交互,如设定数据源、执行查询和更新,以及处理参数。例如, `&lt;sql:setDataSource&gt;` 定义数据源, `&lt;sql:query&gt;` 执行查询。通过使用JSTL,开发者能更整洁地处理JSP页面。**
48 8
|
5月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 1
JSP的JSTL是用于简化页面逻辑的标签库,涵盖核心、格式化、SQL、XML和函数五大类标签。要安装,下载Apache的JSTL包,将jar文件放入WEB-INF/lib,tld文件复制到WEB-INF,并在web.xml中配置相应的taglib信息。JSTL促进了JSP页面的清洁和结构化。
39 5
|
5月前
|
XML SQL Java
JSP 教程 之 JSP 标准标签库(JSTL) 6
**JSP JSTL 摘要:** JSTL是JSP的标签库,包含核心、格式化、SQL、XML和函数5类标签。它用于执行常见任务,如迭代、条件判断和XML操作。JSTL函数库提供字符串处理函数,如`contains()`, `endsWith()`, `escapeXml()`等,方便XML和HTML处理。通过`&lt;%@ taglib %&gt;`导入,如`fn:trim()`用于去除字符串两端空白。
37 5
|
5月前
|
Java 应用服务中间件 Android开发
完成你的自定义JSP Tag标签-Basic Coustom Tag
完成你的自定义JSP Tag标签-Basic Coustom Tag
31 0
|
6月前
|
Java
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
82 0
|
6月前
|
Java 数据安全/隐私保护
Jsp自定义标签(foreach,dept,select)
Jsp自定义标签(foreach,dept,select)
45 0
|
11月前
|
Java
jsp标签下
jsp标签下
42 0
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
61 0
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
3月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)