在JavaWeb应用开发中,如果不是通过前后端分离的方式来实现数据交互,页面渲染一般是通过JSP、FreeMarker、和速度。在页面的渲染过程中,经常会用到标签(taglib)的技术。比如为了在页面上控制一些显示逻辑,在代码中实现类似if/else的效果,就会用到core标签中的内容,类似这样:实现一个容器数据的遍历,你可以直接使用核心标签的foreach。实现页面数据的格式化,可以直接使用format标签对相应的数据进行格式化显示。甚至在一些MVC框架中,包含了一些方便页面数据渲染的标签,可以直接使用。比如Spring中的form标签可以直接绑定数据。这些标签在幕后是如何工作的?在上一篇文章中,我写到了JSP的工作原理。综上所述,JSP在执行过程中会生成一个Servlet文件,然后执行相应的服务方法来处理请求。涉及标签使用的部分也会生成相应的执行逻辑。实际上,一个标签对应一个Java类,Java类按照规范实现了相应的方法。JSP生成的Servlet在执行标签的过程中,会直接调用标签对应类的指定方法,根据返回值在页面上输出相应的内容。如果是继续,则输出内容,如果是跳过,则内容被忽略。基本上就是这个想法。比如本文中if标签对应的生成的Servlet内容如下:再看foreach标签,生成的内容如下:我们可以看到foreach直接转换成了dowhile循环。其中,最核心的两个方法是:doStartTagdoEndTagdoStartTag该方法会被JSP类中具体的标签实现类调用。用于启动实例的标记、pageContext和一系列属性被认为是在执行时设置的。它将返回EVAL_BODY_INCLUDE或SKIP_BODY。从这两个结果的变量名可以看出,如果标签希望继续处理body,则返回前者,否则返回后者。doEndTag用于确认标签执行后页面是否继续渲染。整个taglib使用起来更方便。在JSP中直接声明prefix和uri,相当于添加了这部分内容依赖,然后直接使用标签设置属性,对应命名空间下标签的使用等。这些标签的声明存放在Jar等地方文件或类似于此形式的WEB-INF。具体的标签实现类一般都是继承TagSupport,然后重写我们上面提到的doStartTag和doEndTag方法。因此,对于JSP页面中一般有很多<%%>的所谓scriptlet,可以直接定义一个标签,然后将逻辑移到重写方法中。这些标签声明的tld一般在应用程序部署启动时扫描,然后添加到map中。页面解析执行时,会判断对应声明的tld是否存在,不存在则停止页面执行。页面解析生成Servlet类后,在执行过程中会调用具体标签的属性设置、doStartTag等方法。这时候如果有些属性不存在,绑定不成功等,这些具??体的标签逻辑就会暴露出来。比如我们在使用Spring标签的时候,经常会使用它的form标签来进行参数绑定。为了实验,我们只是写了一个Spring标签,使用
