JSP之自定义jstl标签

article/2025/11/8 16:24:09

目录

一,什么是JSP🍑

二,什么是JSTL(JSTL标签库)🍓

三,如何使用JSTL🍅 

在项目中如何使用JSTL标签?在发开中使用JSTL标签库需要执行如下两个步骤。

(1)在工程中引用JSTL的两个jar文件和标签库描述符文件(扩展名为 .tld)。

(2)在需要使用JSTL的JSP页面中使用taglib指令导入标签库描述文件。例如,要使用JSTL核心标签库,需要在JSP页面的上方增加如下的taglib命令。

四,为何要使用JSTL🍎

JSTL标签的生命周期

 自定义标签

1、自定义标签类

 2、编写标签库描述文件(tld) 

3、在JSP上使用自定义的标签(测试)

总结🍊


一,什么是JSP🍑

  • JSP(全称JavaServer Pages),JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。 
  • 简单来说:JSP是一个模版引擎,它简化了开发,封装了servlet响应html标签的繁琐代码。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
    JSP就是一种特殊的servlet.  

二,什么是JSTL(JSTL标签库)🍓

JSTL的全称是Java Server Pages Standard Tag Library ,即JSP标准标签库。它包含了在开发JSP页面时经常用到的一组标准标签,这些标签提供了一种不用嵌入Java代码就可以开发复杂的JSP页面的途径。JSTL标签库包含了多种标签,如通用标签,条件判断标签和迭代标签等。

标签的概念👇

  • 是标记语言(Mark Language),是一种注释文本的语言,以便于计算机可以操作。很多与“ML”结尾的语言都是标记语言,比如:HTML,XML,XHTML,VML等等
  • 标记语言与其他语言一样,也需要运行它们的环境,比如HTML的运行环境时浏览器,XML也要自己的解析和运行的环境

标签类型👇

  • UI标签, 输出页面元素
  • 控制标签, 如if标签,foreach标签等
  • 数据标签,用于向页面输入数据

基本结构👇

  • <开始标签>标签体</结束标签>

空标签(没有标签体的标签)👇

  • <开始标签 属性名="属性值"/></结束标签>
  • <br/><br/>
  • <开始标签 属性名="属性值"/>

jstl标签库的概念👇

是一个JSP标签集合,它封装了JSP应用的通用核心功能, 基于JSP标签我们可以理解为,是JSP应该通用功能的一种封装方式

  

三,如何使用JSTL🍅 

在项目中如何使用JSTL标签?在发开中使用JSTL标签库需要执行如下两个步骤。

(1)在工程中引用JSTL的两个jar文件和标签库描述符文件(扩展名为 .tld)。

正如使用JDBC连接数据库那样,使用JSTL定义的标签库也必须在工程中导入两个jar文件:jstl.jar和standard.jar。除此之外,标签类库描述符文件也是必须的,这些资源都能在网上下载得到。
在MyEclipse中已经集成了JSTL,因此这一个步骤可以由工具实现。

(2)在需要使用JSTL的JSP页面中使用taglib指令导入标签库描述文件。例如,要使用JSTL核心标签库,需要在JSP页面的上方增加如下的taglib命令。

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

taglib 指令通过uti属性引用某个标签库的配置文件,JSP页面中通过prefix属性指定的前缀即可访问该标签库中的某个标签功能,语法如<C:标签名>
完成以上的两个步骤后,就可以用JSTL方便开发JSP页面,而无须嵌入Java代码了。

四,为何要使用JSTL🍎

我们通过使用EL表达式很容易地输出了用户名信息,从而在一定程度上简化了JSP页面开发的复杂度。但是由于EL表达式不能实现逻辑控制,遍历循环等功能,如果在开发JSP页面时遇到这样的需求,除了编写Java脚本,还能如何解决?答案就是使用JSTL标签。

JSTL标签的生命周期

 自定义标签

1、自定义标签类

  • out 标签类(继承BodyTagSupport)
/**
*     out 标签作用:向JSP页面中写入数据
*/
public class OutTag extends BodyTagSupport{  private String val;private String defaultVal;public void setVal(String val) {this.val = val;}//为空时设置默认值的方法public void setDefaultVal(String defaultVal) {this.defaultVal = defaultVal;}//标签的开始方法(需要给自定义的标签添加什么操作,就重写对应的生命周期中的方法)@Overridepublic int doStartTag() throws JspException {//this.pageContext:通过当前类获取pageContext对象//pageContext对象中有一个getOut写出方法JspWriter out = this.pageContext.getOut();		try {if(val==null&&val.equals("")) {out.println(this.defaultVal);} else {out.println(this.val);}} catch (Exception e) {e.printStackTrace();}		//跳过标签体,out定义的是空标签return SKIP_BODY;}
}/**
*     out 标签作用:向JSP页面中写入数据
*/
public class OutTag extends BodyTagSupport{  private String val;private String defaultVal;public void setVal(String val) {this.val = val;}//为空时设置默认值的方法public void setDefaultVal(String defaultVal) {this.defaultVal = defaultVal;}//标签的开始方法(需要给自定义的标签添加什么操作,就重写对应的生命周期中的方法)@Overridepublic int doStartTag() throws JspException {//this.pageContext:通过当前类获取pageContext对象//pageContext对象中有一个getOut写出方法JspWriter out = this.pageContext.getOut();		try {if(val==null&&val.equals("")) {out.println(this.defaultVal);} else {out.println(this.val);}} catch (Exception e) {e.printStackTrace();}		//跳过标签体,out定义的是空标签return SKIP_BODY;}
}
  •  if 标签类(继承BodyTagSupport)
@SuppressWarnings("serial")
public class IfTag extends BodyTagSupport{private boolean test;public boolean isTest() {return test;}public void setTest(boolean test) {this.test = test;}	@Overridepublic int doStartTag() { 		if(this.isTest()) {//判断标签体时return EVAL_BODY_INCLUDE;} return SKIP_BODY;		}
}
  • foreach标签类
public class ForeachTag extends BodyTagSupport {private List<?> items;private String var;public void setItems(List<?> items) {this.items = items;}public void setVar(String var) {this.var = var;}	@Overridepublic int doStartTag() { if(Objects.isNull(this.items) || this.items.size() <= 0) {return SKIP_BODY;}Iterator<?> it = this.items.iterator();Object next = it.next();this.pageContext.setAttribute(var, next);this.pageContext.setAttribute("iterator", it);return EVAL_BODY_INCLUDE;}@Overridepublic 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;}	
}
  •  select标签类
public class SelectTag extends BodyTagSupport {	private String id;	private String name;private List<?> items;private String cssClass;private String cssStyle;private String value;private String text;private String selectValue;public void setText(String text) {this.text = text;}public void setValue(String value) {this.value = value;}public void setSelectValue(String selectValue) {this.selectValue = selectValue;}public void setId(String id) {this.id = id;}public void setName(String name) {this.name = name;}public void setItems(List<?> items) {this.items = items;}public void setCssClass(String cssClass) {this.cssClass = cssClass;}public void setCssStyle(String cssStyle) {this.cssStyle = cssStyle;}		@Overridepublic int doStartTag()  {		JspWriter out = this.pageContext.getOut();try {String html = getSelectHtml();out.print(html);} catch (Exception e) {e.printStackTrace();}		return SKIP_BODY;}//通过注入的属性值,来构造select元素的字符串private String  getSelectHtml() throws Exception {StringBuilder sb = new StringBuilder();		//构造页面需要的select元素sb.append("<select id='"+id+ "' name='"+name+"'");if(!StringUtils.isNullOrEmpty(this.cssClass)) {sb.append(" class='"+this.cssClass+"'");}if(!StringUtils.isNullOrEmpty(this.cssStyle)) {sb.append(" style='"+this.cssStyle+"'");}sb.append(">");		//循环生成optionsfor(Object option: this.items) {String val = BeanUtils.getProperty(option, this.value);String txt = BeanUtils.getProperty(option, this.text);//value="id"  text="name" if(val.equals(this.selectValue)) {sb.append("<option value='"+val+"' selected>" + txt + "</option>");} else {sb.append("<option value='"+val+"' >" + txt + "</option>");}}sb.append("</select>");return sb.toString();}
}

 2、编写标签库描述文件(tld) 

将你定义的标签具备相应的格式规范编辑在 tld 文件中

<!DOCTYPE taglibPUBLIC "-//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>out</name><tag-class>com.myjstl.OutTag</tag-class><body-content>empty</body-content><attribute><name>val</name><required>true</required><rtexprvalue>true</rtexprvalue><description>out标签val属性,用于输出val的值</description></attribute><attribute><name>defaultVal</name><required>false</required><rtexprvalue>false</rtexprvalue><description>用于定义默认值</description></attribute></tag><tag><name>if</name><tag-class>com.myjstl.IfTag</tag-class><body-content>jsp</body-content><attribute><name>test</name><required>true</required><rtexprvalue>true</rtexprvalue><description>if标签</description></attribute></tag><tag><name>foreach</name><tag-class>com.zking.mymvc.tag.ForeachTag</tag-class><body-content>jsp</body-content><description>foreach标签</description><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>select</name><tag-class>com.zking.mymvc.tag.SelectTag</tag-class><body-content>empty</body-content><attribute><name>id</name><required>true</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>name</name><required>true</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>items</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>cssClass</name><required>false</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>cssStyle</name><required>false</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>value</name><required>true</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>text</name><required>true</required><rtexprvalue>false</rtexprvalue></attribute><attribute><name>selectValue</name><required>false</required><rtexprvalue>false</rtexprvalue></attribute></tag></taglib>

👆详解

  • <tag></tag>:里面放一个自定义标签的所有格式规范
  • <name>out</name>:表示自定义的标签名
  • <tag-class>com.zking.mymvc.tag.OutTag</tag-class>:表示第一步中自定义的标签类的完整类名(这里是通过反射机制找到自定义的标签类的)
  •  <body-content>empty</body-content>:代表没有标签体,填jsp就代表有
  • <attribute>:代表自定义的标签类中的属性规范  <name>val</name>:自定义的属性名字
                <required>true</required>:自定义的标签中必须写出的属性
                <rtexprvalue>true</rtexprvalue>:属性值是否可以使用EL表达式
                <description>out标签val属性,用于输出val的值</description>:自定义属性的描述
    </attribute>  

3、在JSP上使用自定义的标签(测试)

<%@ 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><%request.setAttribute("name", null);%><!-- out 标签 --><z:out val="${name}" defaultVal="你输入了null关键字"/><z:if test="${100 == 100}">测试if(100 == 100)</z:if><z:if test="${100 != 200}">测试if(100 != 200)</z:if>
</body>
</html>

总结🍊

今天的分享就到此为止啦,精彩下期继续哦!


http://chatgpt.dhexx.cn/article/nMF815DL.shtml

相关文章

什么是JSTL标签?常用的标签库有哪些?

从JSP1.1规范开始&#xff0c;JSP就支持使用自定义标签&#xff0c;使用自定义标签大大降低了JSP页面的复杂度&#xff0c;同时增强了代码的重用性。为此&#xff0c;许多Web应用厂商都定制了自身应用的标签库&#xff0c;然而同一功能的标签由不同的Web应用厂商制定可能是不同…

jsp--JSTL标签库

目录 1.JSTL标签库介绍 2.JSTL 标签库的使用步骤 3.core核心库使用 3.1 <c:set> 3.2 <c:if /> 3.3 <c:choose> <c:when> <c:otherwise >标签 3.4 <c:forEach /> 1.JSTL标签库介绍 JSTL 标签库&#xff0c;全称是指 JSP Standard …

【Java Web】JSTL标签库的引入

在使用JSTL标签前首先要引入JSTL标签库 引入&#xff1a; <% taglib prefix"c" uri"http://java.sun.com/jsf/core" %> taglib是JSP指令&#xff0c;功能是用来引入标签库&#xff1b; prefix意思是前缀&#xff0c;指的就是使用标签时的前缀&a…

常见JSTL标签详解

JSP标准标签库&#xff08;JSTL&#xff09; jsp标准标签库&#xff08;jstl&#xff09;是一个JSP标签集合&#xff0c;它封装了jsp应用的通用核心功能。 JSTL支持通用的、格式化的任务。比如&#xff1a;迭代、条件判断、XML文档操作、国际化标签、SQL标签。除了这些它还提供…

JSTL标签库之核心标签

一、JSTL标签库介绍   JSTL标签库的使用是为弥补html标签的不足&#xff0c;规范自定义标签的使用而诞生的。使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二、JSTL标签库的分类 核心标签(用得最多)国际化标签(I18N格式化标签)数据库标签(SQL标签&#xff0c;很…

JSTL标签库的使用

1 JSTL 1.1 JSTL概述 1&#xff09;简介 JSTL的全称是&#xff1a;JSP Standard Tag Libary。它是JSP中标准的标签库。它是由Apache实现的。 它由以下5个部分组成&#xff1a; 组成作用说明Core核心标签库。通用逻辑处理Fmt国际化有关。需要不同地域显示不同语言时使用Fun…

JSTL标签库 | 深入解析JSTL标签库

目录 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 2、使用JSTL标签库的步骤 3、JSTL标签的原理 4、jstl中的核心标签库core当中常用的标签 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 ①Java Standard Tag Lib&#xff08;Java标准的标签库&am…

JSTL标签库详细介绍

目录 一JSTL标签库 二、核心&#xff08;Core&#xff09;标签库 通用标签 循环控制标签 导入文件和URL 总结 一JSTL标签库 JSTL是一个不断完善的开放源代码的JSP标签库&#xff0c;是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上…

JSTL标签库

JSTL&#xff08;Java Server Pages Standerd Tag Library&#xff0c;JSP标准标签库&#xff09;包含用于编写和开发JSP页面的一组标准标签&#xff0c;它可以为用户提供一个无脚本环境。在此环境中&#xff0c;用户可以使用标签编写代码&#xff0c;而无须使用Java脚本。在JS…

JSTL标签

一、概念 JSTL的全称是JavaServer Pages Tag Library&#xff0c;我们也称之为JSP标准标签库。它是由Apache组织提供的开源的免费的jsp标签 二、作用 用于简化和替换jsp页面上的java代码 三、使用步骤&#xff1a; 导入jstl相关jar包引入标签库&#xff0c;通过<% tagl…

JSTL核心标签超详细

1.JSTL介绍 JSTL&#xff08;JavaServer Pages Standard Tag Library&#xff0c;JSP标准标签库)是一个JSP标签集合&#xff0c;它封装了JSP应用的通用核心功能。 JSTL支持通用的、结构化的任务&#xff0c;比如迭代&#xff0c;条件判断&#xff0c;XML文档操作&#xff0c;…

关于网站最近出现504错误的总结,too open many files in system

如果你有耐心看完这篇文章&#xff0c;也许会给你带来真正的益处。 网站出现504错误&#xff0c;如果你用阿里云CDN的话还会报 504 Gateway Time-out The gateway did not receive a timely response from the upstream server or application. Powered by Tengine 这样一句…

腾讯云服务器网站504,使用腾讯、百度云CDN现403和504错误的解决及使用CDN踩的坑...

最近源站出网流量超出带宽的限定值&#xff0c;经常导致服务器丢包。最近有点频繁&#xff0c;甚至一小时丢好几次&#xff0c;如下图所示&#xff1a; 于是考虑接入 CDN &#xff0c;腾讯云CDN送了300G流量&#xff0c;但是接入后经常打不开页面&#xff0c;就换了百度云CDN。…

出现504怎么办?由于服务器更新导致的博客报504错误[详细记录]

最近由于云服务商进行了云服务优化&#xff0c;更新。由于以前在优化博客时的疏忽与草率&#xff0c;导致了本次服务商那边更新&#xff0c;这边博客直接报错504。 据官方称是修改了DNS解析地址&#xff0c;和ip域名地址。 504错误&#xff1a;代表网关超时 &#xff08;Gatewa…

nginx实战总结-504错误剖析

一、问题描述 nginx访问会出现504:Gateway Time-out,按照报错的意思是请求无响应或者无响应,意思就是说由于大量的请求,有些线程运气差,一直调用不到,导致请求超时,所以就往超时的时间入手,进行解决 二、解决步骤 先看下nginx使用的是什么协议(proxy/fastcgi):我这…

Git 504错误

网络和代理的问题 1、在环境变量中添加代理 2、设置git的代理为默认 git config --global --unset http.proxy //设置http代理为默认 git config --global --unset https.proxy //设置https代理为默认env | grep proxy //查看代理

php响应码504,php为什么会出现504错误_后端开发

python如何实现excel多表合并(附代码)_后端开发 今天来用python实现合并多个excel为一个工作本&#xff0c;使用不到40行代码完成了60多张excel工作本合并为一张&#xff0c;大家一起来看看吧。 php出现504错误的原因是&#xff1a;1、nginx默认的fastcgi进程响应缓冲区太小了&…

504网关超时怎么解决_什么是504网关超时错误(以及如何解决)?

504网关超时怎么解决 A 504 Gateway Timeout Error happens when a server that was attempting to load a web page did not get a response in time from another server. Almost always, the error is on the website itself, and there’s nothing you can do about it but…

HTTP代理504网关超时错误如何修复?

HTTP状态代码指的是服务器向浏览器指示响应的状态&#xff0c;当服务器充当外部网关或代理并且没有及时收到来自另一个服务器的响应时&#xff0c;则会收到“504–网关超时”。那么&#xff0c;HTTP代理504网关超市错误怎么解决呢&#xff1f; 1、重新加载网页 遇到504网关超时…

鸡啄米:添加控件变量

设置Tab键的顺序&#xff1a;先按CtrlD &#xff0c;再从自己认为Tab顺序应该为1的控件开始依次单击&#xff0c;随着单击的完成&#xff0c;各控件的Tab响应顺序也按我们的想法设置好了按钮中的代码&#xff1a;UpdateData(TRUE); //将控件中输入的数据传到变量m_a 、 m_b中 …