自定义标签
定义一个类直接或者间接的实现标签接口,例如Tag
public class MyTag implements Tag {
private PageContext pageContext;
@Override
public void setPageContext(PageContext pc) {
this.pageContext=pc;
}
@Override
public void setParent(Tag t) {
}
@Override
public Tag getParent() {
return null;
}
/*
<font color=red>abcd</font>
标签起始 属性 标签体 标签结尾
*/
@Override
public int doStartTag() throws JspException {
//标签头的回调方法
//获取请求参数中name对应的值,如果没有name则默认 tag
ServletRequest sr=pageContext.getRequest();
String name=sr.getParameter("name");
if(name==null || name.trim().length()<1)
name="Tag";
//输出问候信息
JspWriter out=pageContext.getOut();
try {
out.write("<h1>Hello "+name+"!</h1>");
} catch (IOException e) {
throw new JspException(e);
}
//Tag.EVAL_BODY_INCLUDE 表示处理标签体;
//Tag.SKIP_BODY 跳过标签体
return Tag.SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
//遇到标签尾的回调方法
// Tag.EVAL_PAGE 继续处理后续标签
// Tag.SKIP_PAGE 不处理后续标签
return Tag.EVAL_PAGE;
}
@Override
public void release() {
//销毁标签对象时 释放资源
}
}
在/WEB-INF/下创建一个文件xxx.tld
- 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>5.0</tlib-version>
<!--标签的短名称,即标签的前缀-->
<short-name>yan</short-name>
<!--设置标签库的URI地址-->
<uri>/WEB-INF/yan.tld</uri>
<tag>
<!--标签名称,根据配置调用方法为yan:hello-->
<name>hello</name>
<!--标签处理类的全名称-->
<tag-class>com.yan.tags.MyTag</tag-class>
<!--允许的标签体内容类型-->
<body-content>empty</body-content>
<!--标签属性声明-->
<attribute>
<!-- 属性名称 -->
<name>var</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
页面中如何调用
<!-- 第一步引入标签库,prefix标签前缀对应tld文件中的short-name,uri为tld文件中的uri配置-->
<%@ taglib prefix="yan" uri="/WEB-INF/yan.tld" %>
<!--直接按照前缀名+标签名的方式使用标签-->
<yan:hello/>
随着时间的推荐,标签库越来越多,缺少标准,使用比较混乱
解决方案:标准标签库JSTL
JSTL
JSP标准标签库JSTL是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
JSP标准标记库JSTL是 JSP定制标记库集,这些标记库实现大量服务器端 Java 应用程序常用的基本功能
-
通过为典型表示层任务(如数据格式化和迭代或条件内容)提供标准实现,JSTL 使 JSP 作者可以专注于特定于应用程序的开发需求,而不是为这些通用操作另起炉灶
-
根据JSTL标签所提供的功能,可以将其分为5个类别:核心标签、格式化标签、SQL标签、XML标签和JSTL函数
JSTL标签库
JSTL 标签种类 | 说 明 |
---|---|
核心标签 | 包含JSTL核心操作所需的标签,例如数据输出、循环流程控制以及URL操作等 |
i18n国际化标签 | 进行数值与日期数据格式化、国际化资源网页设定所需的标签 |
SQL标签 | 运用SQL与操作资库所需的标签 |
XML标签 | 剖析XML文件所需的标签 |
函数标签 | 包含字符串处理与其它特定功能之JSTL标签 |
标签种类 | 前缀词 | uri |
---|---|---|
核心标签 | c | http://java.sun.com/jsp/jstl/core |
i18n国际化标签 | fmt | http://java.sun.com/jsp/jstl/fmt |
SQL标签 | sql | http://java.sun.com/jsp/jstl/sql |
XML标签 | xml | http://java.sun.com/jsp/jstl/xml |
函数标签 | fn | http://java.sun.com/jsp/jstl/functions |
依赖配置pom.xml
<!--如果使用tomcat10 -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<!--如果使用Tomcat9或者更低版本使用-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty requestScope.bookList}">
<c:forEach items="${bookList}" var="book">
<TR bgColor=#ffffff>
<TD class=txt align=middle width="8%">${book.id}</TD>
<TD class=txt align=middle width="20%">${book.title}</TD>
<TD class=txt align=middle width="20%">${book.catalog.title}</TD>
<TD class=txt align=middle width="14%">${book.unit}</TD>
<TD class=txt align=middle>${book.price}</TD>
<TD οnmοuseοver="this.style.cursor='hand';this.style.backgroundColor='#eeeeee';"
οnclick=""
οnmοuseοut="this.style.backgroundColor='#ffffff';"
noWrap align=middle><image src="images/cart.gif" style="border:0px"></TD>
</TR>
</c:forEach>
<tr><td colspan=3 align=center>1 2 3 4 5 6 7 8</td>
<td colspan=3 align=center>每页:15个 页码:1/8页 共有:87个</td></tr>
</c:if>
c:if用于条件判断
无本体内容
<c:if test="条件表达式" var="存储变量名" [scope="存储范围{page |request |session |application }"]/>
包含本体内容
<c:if test="条件表达式" [var="存储变量名"] [scope="存储范围{page |request |session |application}"]> 标签体</c:if>
如果条件成立则执行标签体,否则不执行标签体
属性 | 动态 | 类型 | 说明 |
---|---|---|---|
test | 是 | boolean | 条件表达式 |
var | 否 | String | 输出判断结果的范围变量名称 |
scope | 否 | String | var的范围 |
- test 是最重要的属性,为标签的条件判断式
- var用来储存判断式的输出結果
<c:if test="${not empty requestScope.bookList}">
...
</c:if>
等价于
Object obj=request.getAttribute("bookList");
if(obj!=null && ((List)obj).size()>0){
......
}
c:forEach循环标签
迭代对象集合内容
<c:forEach [var="循环控制变量名"] items="需要循环迭代的集合" [varStatus="循环状态变量"] [begin="起始值"] [end="终止值"] [step="循环步长值"]>
标签体
</c:forEach>
- var用来指定网页当中所要迭代的对象
- items则是每一次迭代所取得的对象内容
- varStatus为目前对象的相关内容信息
- begin、end以及step则是相关的属性,分别代表迭代的开始、结束以及区间,这三个值相互影响,设定不正确可能导致程序流程的运行错误
迭代特定次数
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
body content
</c:forEach>
九九乘法口诀表
<table width="80%">
<c:forEach var="k" begin="1" end="9">
<tr>
<c:forEach var="i" begin="1" end="${k}">
<td>${i}*${k}=${k*i}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
属性 | 动态 | 类型 | 说明 |
---|---|---|---|
var | 否 | String | 储存指定的迭代成员 |
items | 是 | 集合对象 | 迭代的集合对象 |
varStatus | 否 | String | 储存指定迭代成员的状态内容 |
begin | 是 | int | 迭代的开始值 |
end | 是 | int | 迭代的结束值 |
step | 是 | int | 每次迭代的间隔值 |
<%
String atts[] = new String [5]; atts[0]="hello"; atts[1]="this"; atts[2]="is"; atts[3]="a"; atts[4]="pen"; request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item" begin="1" end="4" step="2" >
${item}</br>
</c:forEach>
结果是只显示atts[1]和atts[3]的内容
<%
Map map=new HashMap();
map.put("111","aaa");
map.put("222","bbb");
map.put("333","ccc");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="ff">
<c:out value="${ff.key}"/>:<c:out value="${ff.value}" /><br>
</c:forEach>
用c:forEach 中varStatus的属性可以获得迭代的自身状态
<c:forEach var="" items="" varStatus="status">
<c:out value=“${status.index}”/> 此次迭代的索引
<c:out value=“${status.count}”/> 已经迭代的数量
<c:out value=“${status.first}”/> 是否是第一个迭代对象
<c:out value=“${status.last}”/> 是否是最后一个迭代对象
</c:forEach>
<c:forEach var="item" items="${contents}" varStatus="status">
<tr
<c:if test="${status.count%2==0}"> bgcolor="#CCCCFE" </c:if>
align="left">
${item.username}
</tr>
</c:forEach>
建立URL
<c:url>
标签在JSP网页动态指定一个网址字符串
<c:url value="value" [context="context"] [var="varName"] [scope="{ page | request | session | application }"]>
<c:param> subtags <c:param>
</c:url>
- value代表所要设定的网页资源位置
- context用来指定一个外部资源
- var代表一个变量,如果有指定,URL资源的内容将被输出至指定的变量
- scope则是变量的范围,var变量只在这个范围里面有效
c:param
将属性值指定给value属性
<c:param name="name" value="value"/>
应用场景
<a href="<c:url value='/login.jsp' />">现在就登录</a>
<c:param>
标签放在<c:url>
本体內容当中,可用来设定连接所要传递的参数內容
<c:param>
所指定的参数值firstPara,与URL字符串一同被送出:urlstring? FirstPara=123456
<c:url value="/login.jsp" var="loginURL" > login.jsp?username=yanjun&password=123456
<c:param name="username" value=“yanjun"/>
<c:param name="password" value=“123456"/>
</c:url>
<a href="<c:out value='${loginURL}'/>">现在就登录</a>