• JSP之自定义jstl标签


    目录

    一,什么是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标签等
    • 数据标签,用于向页面输入数据

    基本结构👇

    • <开始标签>标签体

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

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


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

    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属性指定的前缀即可访问该标签库中的某个标签功能,语法如
    完成以上的两个步骤后,就可以用JSTL方便开发JSP页面,而无须嵌入Java代码了。

    四,为何要使用JSTL🍎

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

    JSTL标签的生命周期

     自定义标签

    1、自定义标签类

    • out 标签类(继承BodyTagSupport)
    1. /**
    2. * out 标签作用:向JSP页面中写入数据
    3. */
    4. public class OutTag extends BodyTagSupport{
    5. private String val;
    6. private String defaultVal;
    7. public void setVal(String val) {
    8. this.val = val;
    9. }
    10. //为空时设置默认值的方法
    11. public void setDefaultVal(String defaultVal) {
    12. this.defaultVal = defaultVal;
    13. }
    14. //标签的开始方法(需要给自定义的标签添加什么操作,就重写对应的生命周期中的方法)
    15. @Override
    16. public int doStartTag() throws JspException {
    17. //this.pageContext:通过当前类获取pageContext对象
    18. //pageContext对象中有一个getOut写出方法
    19. JspWriter out = this.pageContext.getOut();
    20. try {
    21. if(val==null&&val.equals("")) {
    22. out.println(this.defaultVal);
    23. } else {
    24. out.println(this.val);
    25. }
    26. } catch (Exception e) {
    27. e.printStackTrace();
    28. }
    29. //跳过标签体,out定义的是空标签
    30. return SKIP_BODY;
    31. }
    32. }/**
    33. * out 标签作用:向JSP页面中写入数据
    34. */
    35. public class OutTag extends BodyTagSupport{
    36. private String val;
    37. private String defaultVal;
    38. public void setVal(String val) {
    39. this.val = val;
    40. }
    41. //为空时设置默认值的方法
    42. public void setDefaultVal(String defaultVal) {
    43. this.defaultVal = defaultVal;
    44. }
    45. //标签的开始方法(需要给自定义的标签添加什么操作,就重写对应的生命周期中的方法)
    46. @Override
    47. public int doStartTag() throws JspException {
    48. //this.pageContext:通过当前类获取pageContext对象
    49. //pageContext对象中有一个getOut写出方法
    50. JspWriter out = this.pageContext.getOut();
    51. try {
    52. if(val==null&&val.equals("")) {
    53. out.println(this.defaultVal);
    54. } else {
    55. out.println(this.val);
    56. }
    57. } catch (Exception e) {
    58. e.printStackTrace();
    59. }
    60. //跳过标签体,out定义的是空标签
    61. return SKIP_BODY;
    62. }
    63. }
    •  if 标签类(继承BodyTagSupport)
    1. @SuppressWarnings("serial")
    2. public class IfTag extends BodyTagSupport{
    3. private boolean test;
    4. public boolean isTest() {
    5. return test;
    6. }
    7. public void setTest(boolean test) {
    8. this.test = test;
    9. }
    10. @Override
    11. public int doStartTag() {
    12. if(this.isTest()) {
    13. //判断标签体时
    14. return EVAL_BODY_INCLUDE;
    15. }
    16. return SKIP_BODY;
    17. }
    18. }
    • foreach标签类
    1. public class ForeachTag extends BodyTagSupport {
    2. private List items;
    3. private String var;
    4. public void setItems(List items) {
    5. this.items = items;
    6. }
    7. public void setVar(String var) {
    8. this.var = var;
    9. }
    10. @Override
    11. public int doStartTag() {
    12. if(Objects.isNull(this.items) || this.items.size() <= 0) {
    13. return SKIP_BODY;
    14. }
    15. Iterator it = this.items.iterator();
    16. Object next = it.next();
    17. this.pageContext.setAttribute(var, next);
    18. this.pageContext.setAttribute("iterator", it);
    19. return EVAL_BODY_INCLUDE;
    20. }
    21. @Override
    22. public int doAfterBody() {
    23. Iterator it= (Iterator)this.pageContext.getAttribute("iterator");
    24. if(it.hasNext()) {
    25. this.pageContext.setAttribute(var, it.next());
    26. return EVAL_BODY_AGAIN;
    27. }
    28. return SKIP_BODY;
    29. }
    30. }
    •  select标签类
    1. public class SelectTag extends BodyTagSupport {
    2. private String id;
    3. private String name;
    4. private List items;
    5. private String cssClass;
    6. private String cssStyle;
    7. private String value;
    8. private String text;
    9. private String selectValue;
    10. public void setText(String text) {
    11. this.text = text;
    12. }
    13. public void setValue(String value) {
    14. this.value = value;
    15. }
    16. public void setSelectValue(String selectValue) {
    17. this.selectValue = selectValue;
    18. }
    19. public void setId(String id) {
    20. this.id = id;
    21. }
    22. public void setName(String name) {
    23. this.name = name;
    24. }
    25. public void setItems(List items) {
    26. this.items = items;
    27. }
    28. public void setCssClass(String cssClass) {
    29. this.cssClass = cssClass;
    30. }
    31. public void setCssStyle(String cssStyle) {
    32. this.cssStyle = cssStyle;
    33. }
    34. @Override
    35. public int doStartTag() {
    36. JspWriter out = this.pageContext.getOut();
    37. try {
    38. String html = getSelectHtml();
    39. out.print(html);
    40. } catch (Exception e) {
    41. e.printStackTrace();
    42. }
    43. return SKIP_BODY;
    44. }
    45. //通过注入的属性值,来构造select元素的字符串
    46. private String getSelectHtml() throws Exception {
    47. StringBuilder sb = new StringBuilder();
    48. //构造页面需要的select元素
    49. sb.append("");
    50. return sb.toString();
    51. }
    52. }

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

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

    1. taglib
    2. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    3. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
    4. <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    5. <tlib-version>1.0tlib-version>
    6. <jsp-version>1.2jsp-version>
    7. <short-name>Simple Tagsshort-name>
    8. <uri>/zkinguri>
    9. <tag>
    10. <name>outname>
    11. <tag-class>com.myjstl.OutTagtag-class>
    12. <body-content>emptybody-content>
    13. <attribute>
    14. <name>valname>
    15. <required>truerequired>
    16. <rtexprvalue>truertexprvalue>
    17. <description>out标签val属性,用于输出val的值description>
    18. attribute>
    19. <attribute>
    20. <name>defaultValname>
    21. <required>falserequired>
    22. <rtexprvalue>falsertexprvalue>
    23. <description>用于定义默认值description>
    24. attribute>
    25. tag>
    26. <tag>
    27. <name>ifname>
    28. <tag-class>com.myjstl.IfTagtag-class>
    29. <body-content>jspbody-content>
    30. <attribute>
    31. <name>testname>
    32. <required>truerequired>
    33. <rtexprvalue>truertexprvalue>
    34. <description>if标签description>
    35. attribute>
    36. tag>
    37. <tag>
    38. <name>foreachname>
    39. <tag-class>com.zking.mymvc.tag.ForeachTagtag-class>
    40. <body-content>jspbody-content>
    41. <description>foreach标签description>
    42. <attribute>
    43. <name>itemsname>
    44. <required>truerequired>
    45. <rtexprvalue>truertexprvalue>
    46. attribute>
    47. <attribute>
    48. <name>varname>
    49. <required>truerequired>
    50. <rtexprvalue>falsertexprvalue>
    51. attribute>
    52. tag>
    53. <tag>
    54. <name>selectname>
    55. <tag-class>com.zking.mymvc.tag.SelectTagtag-class>
    56. <body-content>emptybody-content>
    57. <attribute>
    58. <name>idname>
    59. <required>truerequired>
    60. <rtexprvalue>falsertexprvalue>
    61. attribute>
    62. <attribute>
    63. <name>namename>
    64. <required>truerequired>
    65. <rtexprvalue>falsertexprvalue>
    66. attribute>
    67. <attribute>
    68. <name>itemsname>
    69. <required>truerequired>
    70. <rtexprvalue>truertexprvalue>
    71. attribute>
    72. <attribute>
    73. <name>cssClassname>
    74. <required>falserequired>
    75. <rtexprvalue>falsertexprvalue>
    76. attribute>
    77. <attribute>
    78. <name>cssStylename>
    79. <required>falserequired>
    80. <rtexprvalue>falsertexprvalue>
    81. attribute>
    82. <attribute>
    83. <name>valuename>
    84. <required>truerequired>
    85. <rtexprvalue>falsertexprvalue>
    86. attribute>
    87. <attribute>
    88. <name>textname>
    89. <required>truerequired>
    90. <rtexprvalue>falsertexprvalue>
    91. attribute>
    92. <attribute>
    93. <name>selectValuename>
    94. <required>falserequired>
    95. <rtexprvalue>falsertexprvalue>
    96. attribute>
    97. tag>
    98. taglib>

    👆详解

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

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

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8"%>
    3. <%@taglib prefix="z" uri="/zking" %>
    4. html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    5. <html>
    6. <head>
    7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    8. <title>Insert title heretitle>
    9. head>
    10. <body>
    11. <%
    12. request.setAttribute("name", null);
    13. %>
    14. <z:out val="${name}" defaultVal="你输入了null关键字"/>
    15. <z:if test="${100 == 100}">
    16. 测试if(100 == 100)
    17. z:if>
    18. <z:if test="${100 != 200}">
    19. 测试if(100 != 200)
    20. z:if>
    21. body>
    22. html>

    总结🍊

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

  • 相关阅读:
    基于vue和nodejs的项目外卖点餐订餐餐厅平台
    Codeforces Round 952 (Div. 4)(实时更新)
    NIO学习
    C语言中自定义类型讲解
    TypeScript 类型学习
    关于过滤链设计的实践记录
    vue小案例实现模糊查询、删除列表、添加列表
    腾讯云饥荒服务器配置选择和费用价格表
    Unity中的协程
    LSTM情感分类问题调试
  • 原文地址:https://blog.csdn.net/weixin_65474399/article/details/125886605