Jsp应用


在这里插入图片描述

一、foreach标签应用

1.1 tag类

package com.xqx.tag;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/**
 * @author W许潜行
 *
 */
public class ForeachTag extends BodyTagSupport{

	//封装数据源,遍历数据
	private List<Object> items = new ArrayList<>();
	
	//封装对象指针:指向数据源中的对象
	private String var;
	public ForeachTag() {
		// TODO Auto-generated constructor stub
	}
	public List<Object> getItems() {
		return items;
	}

	public void setItems(List<Object> items) {
		this.items = items;
	}

	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	@Override
	public int doAfterBody() throws JspException {
		//获取迭代器
		Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
		if(it.hasNext()) {
			//得到第一个迭代器对象保存到对象指针中
			pageContext.setAttribute(var, it.next());
			//保存迭代后的迭代器对象
			pageContext.setAttribute("it", it);
			return EVAL_BODY_AGAIN;
		}
		return SKIP_BODY;
	}
	@Override
	public int doStartTag() throws JspException {
		if(items==null||items.size()==0)
			return SKIP_BODY;
		//得到第一个迭代器对象
		Iterator<Object> it = items.iterator();
		//得到第一个迭代器对象保存到对象指针中
		pageContext.setAttribute(var, it.next());
		//保存迭代后的迭代器对象
		pageContext.setAttribute("it", it);
		return EVAL_BODY_INCLUDE;
	}
}

这个标签有三个属性:
“items”:需要遍历的集合对象。
“var”:迭代器指针指向的集合元素赋值变量名。
“body”:标签定义的标签体,其中可放置要循环执行的 JSP 代码块。

在 doStartTag() 方法中,首先判断集合对象是否为空,如果是则返回SKIP_BODY值,表示跳过标签体。如果非空,则获取迭代器对象,并将第一个迭代器对象赋值给对象指针,并将迭代器保存到 JSP 页面的 Attribute中,使其能够在后续方法中再次访问。

在 doAfterBody() 方法中,我们通过获取 Attribute中保存的迭代器对象,反复判断是否还有下一个元素。如果有,则将下一个元素赋值给对象指针,并将迭代器保存到 JSP 页面的 Attribute
中,以便在下一次迭代中使用。如果没有了,则返回 SKIP_BODY 值,表示跳过标签体。

1.2 tid

<?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">
    
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>c</short-name>
  <uri>http://jsp.xqx.cn</uri>
  <tag>
    <name>foreach</name>
    <tag-class>com.xqx.tag.ForeachTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>Goods</name>
    <tag-class>com.xqx.tag.GoodsTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
  <tag>
    <name>select</name>
    <tag-class>com.xqx.tag.SelectTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>optionVal</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>optionText</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>
</taglib>

在这个标签库描述文件中,定义了对应标签的名称、实现类和属性。其中, 元素用于定义标签属性,包括名称、是否必需、是否支持表达式等。 元素用于指定标签体中可放置的内容类型。

1.3 jsp

<%@page import="com.xqx.tag.Goods"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://jsp.xqx.cn" prefix = "x" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!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>
<%   
	List<Goods> list = new ArrayList();
	list.add(new Goods(1,"汽车"));
	list.add(new Goods(2,"飞机"));
	list.add(new Goods(3,"轮船"));
	request.setAttribute("list", list);
%>
<p>这是c标签的foreach
<c:forEach items = "${list }" var = "l">
		${l.id }:${l.type } <hr/>
</c:forEach>
<h1>这是自定义标签的foreach</h1>
<x:foreach items="${list }" var="l">
		${l.id }:${l.type } <hr/>
</x:foreach>
<x:Goods var="goods">

</x:Goods>
交通商品1:${goods }
</body>
</html>

首先在 JSP 页面中定义了一个商品列表集合对象,然后将其保存到请求属性中。

之后使用了两个循环遍历集合对象并将其中的元素逐个显示出来
其中一个是使用 JSTL 标签库中的 <c:forEach>
标签,另一个则是使用自定义标签库中的 <x:foreach> 标签。

二、数据标签

2.1tag类

package com.xqx.tag;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/**
 * @author W许潜行
 *
 */
public class GoodsTag extends BodyTagSupport{

	//封装一个保存数据的变量
	private String var;

	
	public String getVar() {
		return var;
	}


	public void setVar(String var) {
		this.var = var;
	}


	@Override
	public int doStartTag() throws JspException {
		//模拟数据库传来的数据
		List<Goods> list = new ArrayList<>();
		list.add(new Goods(1,"汽车"));
		list.add(new Goods(2,"飞机"));
		list.add(new Goods(3,"轮船"));
		//将数据保存到封装的变量中
		pageContext.setAttribute(var, list);
		return SKIP_BODY;
	}
}

定义了一个变量var,用于保存商品列表,并提供了对该变量的getter和setter方法。

在doStartTag方法中,模拟了一个数据库返回商品列表的场景,并将该列表保存在了封装变量var中。在JSP页面中,通过调用该标签即可获取到商品列表,方便进行商品展示。

2.2jsp页面的调用

<x:Goods var="goods">

</x:Goods>
交通商品1:${goods }
</body>
</html>

其他页面也可以调用

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://jsp.xqx.cn" prefix = "x" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!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>
<x:Goods var="goods">

</x:Goods>
交通商品2${goods }
</body>
</html>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值