JSP第七篇【简单标签、应用、DynamicAttribute接口】(四)

简介: 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_BODY,EVAL_BODY等等的变量代表着什么,在什么方法中使用。这样实在是太麻烦了!

tld文件和上面是一样的,下面是测试代码

<%
    /*list集合*/
    List list = new ArrayList();
    list.add("zhongfucneng");
    list.add("1");
    list.add("2");
    list.add("3");
    request.setAttribute("list",list);
    /*基本数据类型数组*/
    int[] ints = new int[]{1, 2, 3, 4, 5};
    request.setAttribute("ints", ints);
    /*对象数组*/
    Object[] objects = new Object[]{2, 3, 4, 5, 6};
    request.setAttribute("objects", objects);
    /*map集合*/
    Map map = new HashMap();
    map.put("aa", "aa");
    map.put("bb", "bb");
    map.put("cc", "cc");
    request.setAttribute("map",map);
%>
    List集合:
    <zhongfucheng:forEach items="${list}" var="str">
        ${str}
    </zhongfucheng:forEach>
    <hr>
    <hr>
    基本数据类型数组:
    <zhongfucheng:forEach items="${ints}" var="i">
        ${i}
    </zhongfucheng:forEach>
    <hr>
    <hr>
    对象数组:
    <zhongfucheng:forEach items="${objects}" var="o">
        ${o}
    </zhongfucheng:forEach>
    <hr>
    <hr>
    map集合:
    <zhongfucheng:forEach items="${map}" var="me">
        ${me.key} = ${me.value}
    </zhongfucheng:forEach>

效果:47.jpg

HTML转义标签

要开发这个标签就很简单了,只要获取到标签体的内容,再通过经过方法转义下标签体内容,输出给浏览器即可

  • 标签处理器代码:
public class Demo1 extends SimpleTagSupport {
   @Override
    public void doTag() throws JspException, IOException {
       //获取到标签体的内容再修改
       StringWriter stringWriter = new StringWriter();
       JspFragment jspFragment = this.getJspBody();
       jspFragment.invoke(stringWriter);
       String content = stringWriter.toString();
       //经过filter()转义,该方法在Tomcat可以找到
       content = filter(content);
       //再把转义后的内容输出给浏览器
       this.getJspContext().getOut().write(content);
    }
    private String filter(String message) {
        if (message == null)
            return (null);
        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
                case '<':
                    result.append("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '"':
                    result.append("&quot;");
                    break;
                default:
                    result.append(content[i]);
            }
        }
        return (result.toString());
    }
}

测试代码

  <zhongfucheng:filter><a href="2.jsp">你好啊</a> </zhongfucheng:filter>
    <br>
    <a href="2.jsp">你好啊

效果:

48.jpg

if else标签

在JSTL中并没有if else的标签,JSTL给予我们的是choose,when,otherwise标签,现在我们模仿choose,when,otherwise开发标签

思路:when标签有个test属性,但otherwise怎么判断标签体是执行还是不执行呢?这时就需要choose标签的支持了!choose标签默认定义一个Boolean值为false,。当when标签体被执行了,就把Boolean值变成true,只要Boolean值为false就执行otherwise标签体的内容。

看程序就容易理解上面那句话了:

  • choose标签处理器
  public class Choose extends SimpleTagSupport {
        private boolean flag;
        @Override
        public void doTag() throws JspException, IOException {
            this.getJspBody().invoke(null);
        }
        public boolean isFlag() {
            return flag;
        }
        public void setFlag(boolean flag) {
            this.flag = flag;
        }
    }

When标签处理器

  public class When extends SimpleTagSupport {
        private boolean test ;
        @Override
        public void doTag() throws JspException, IOException {
            Choose choose = (Choose) this.getParent();
            //如果test为true和flag为false,那么执行该标签体
            if (test == true && choose.isFlag() == false) {
                this.getJspBody().invoke(null);
                //修改父标签的flag
                choose.setFlag(true);
            }
        }
        public void setTest(boolean test) {
            this.test = test;
        }
    }

OtherWise标签处理器

 public class OtherWise extends SimpleTagSupport {
        @Override
        public void doTag() throws JspException, IOException {
            Choose choose = (Choose) this.getParent();
            //如果父标签的flag为false,就执行标签体(如果when标签没执行,flag值就不会被修改!when标签没执行,就应该执行otherwise标签!)
            if (choose.isFlag() == false) {
                getJspBody().invoke(null);
                //改父标签的flag为false
                choose.setFlag(true);
            }
        }
    }

测试代码:

  <zhongfucheng:choose>
        <zhongfucheng:when test="${user!=null}">
            user为空
        </zhongfucheng:when>
        <zhongfucheng:otherwise>
            user不为空
        </zhongfucheng:otherwise>
    </zhongfucheng:choose>

效果:49.jpg

DynamicAttribute接口

此接口的主要功能是用于完成动态属性的设置!前面我们讲解属性标签的时候,属性都是写多少个,用多少个的。现在如果我希望属性可以动态的增加,只需要在标签处理器类中实现DynamicAttribute接口即可!

现在我要开发一个动态加法的标签

  • 标签处理器
 public class Demo1 extends SimpleTagSupport implements DynamicAttributes {
        //既然有动态属性和动态的值,那么我们就用一个Map集合存储(1-1对应的关系),做的加法运算,值为Double类型的。
        Map<String, Double> map = new HashMap<>();
        @Override
        public void doTag() throws JspException, IOException {
            //定义一个sum变量用于计算总值
            double sum = 0.0;
            //获取到Map集合的数据
            Iterator iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<String, Double> entry = (Map.Entry<String, Double>) iterator.next();
                sum += entry.getValue();
            }
            //向浏览器输出总和是多少
            this.getJspContext().getOut().write(String.valueOf(sum));
        }
        //对于这个要实现的方法,我们只要关注第2个参数和第3个参数即可
        //第二个参数表示的是动态属性的名称,第三个参数表示的是动态属性的值
        @Override
        public void setDynamicAttribute(String s, String localName, Object value) throws JspException {
            //将动态属性的名字和值加到Map集合中
            map.put(localName, Double.valueOf(Float.valueOf(value.toString())));
        }
    }

tld文件,注意要把dynamic-attribute设置为true

  <tag>
        <name>dynamicAttribute</name>
        <tag-class> tag.Demo1</tag-class>
        <body-content> empty</body-content>
        <!--这个必须要设置为true-->
        <dynamic-attributes>true</dynamic-attributes>
    </tag>
  • 测试代码

<zhongfucheng:dynamicAttributenum="1.1"num2="2.2"num3="1"/>

  • 效果,double在运算的时候会丢失精度的,现在只是测验下动态属性,这里就不详细说了!
    50.jpg

开发自定义函数

至于怎么开发自定义函数,在EL表达式的博客中有

如果文章有错的地方欢迎指正,大家互相交流。

目录
相关文章
|
6月前
|
SQL XML Java
JSP 教程 之 JSP 标准标签库(JSTL) 4
**JSP的JSTL是用于简化Web开发的标签库,包括核心、格式化、SQL、XML和函数5个部分。SQL标签库允许与数据库交互,如设定数据源、执行查询和更新,以及处理参数。例如, `&lt;sql:setDataSource&gt;` 定义数据源, `&lt;sql:query&gt;` 执行查询。通过使用JSTL,开发者能更整洁地处理JSP页面。**
51 8
|
6月前
|
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页面的清洁和结构化。
43 5
|
6月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
119 10
|
6月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
81 7
|
6月前
|
前端开发 小程序 Java
深入解析Java Servlet与JSP:构建高效服务器端应用
【6月更文挑战第23天】Java Servlet和JSP是Web开发的关键技术,用于构建高效服务器端应用。Servlet处理HTTP请求,执行业务逻辑,而JSP专注于动态HTML生成。两者结合,借助MVC架构,实现逻辑与视图分离,提高代码可读性和性能。尽管有新框架出现,Servlet和JSP仍是许多项目的基础。
114 7
|
6月前
|
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()`用于去除字符串两端空白。
40 5
|
6月前
|
Java 应用服务中间件 Android开发
完成你的自定义JSP Tag标签-Basic Coustom Tag
完成你的自定义JSP Tag标签-Basic Coustom Tag
33 0
|
7月前
|
前端开发 Java 数据库
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
【Spring原理进阶】SpringMVC调用链+JSP模板应用讲解
|
7月前
|
SQL 前端开发 Java
JSP技术详解及其在Web开发中的应用
【1月更文挑战第2天】本文将对JSP(Java Server Pages)技术进行详细的介绍和分析。JSP是一种基于Java的服务器端编程技术,它允许开发者在HTML或XML等文档中直接嵌入Java代码片段,从而动态地生成Web页面内容。本文将首先阐述JSP的基本原理和工作机制,然后讨论其在Web开发中的各种应用场景,包括表单处理、数据库访问、会话管理等,并通过实例代码展示JSP的实际应用。最后,本文将对JSP的优缺点进行评述,并对未来的发展趋势进行展望。
744 10
|
7月前
|
Java
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
jsp页面中使用jstl标签报错:javax.servlet.jsp.JspTagException
91 0