今天还是讲解自定义标签。
首先介绍了IterationTag接口、以及迭代输出标签体内容的标签实现原理和应用。在讲解迭代输出集合中的元素的例子时,先讲解用普通程序代码迭代输出集合的情况:for(String user : users){System.out.println("姓名:" + user)}
上面的程序代码包含三个信息:迭代变量、集合对象、显示格式,用自定义标签进行迭代输出时,其格式如下:
<it315:iterate var="user" collections="<%= users %>">姓名:${user}</it315:iterate>。
jsp页面需要将迭代变量和集合对象作为参数传递给自定义标签,自定义标签内部对集合进行迭代,在每次迭代时,将结果存入page域中并输出标签体内容,JSP页面中的标签体按一定格式引用迭代标签存入到page域中的变量。JSP页面的标签体中怎么知道page域中的变量名称的呢?这就是通过属性传递给自定义标签的那个迭代名称。
接下来讲解了如何通过自定义标签来定义JSP脚本变量。首先帮助学员比较下面这些语句的区别:
<%= abc %>
${abc}
前者是一个脚本变量,要“先定义、后使用”。而后者相当于<%= pageContext./*get*/findAttribute("abc")%>。
要想理解自定义标签是如何定义出JSP脚本变量的,首先就要知道:对于<it315:var />,千万不要认为仅仅只有jsp页面调用这个标签对应的处理类的功能,还要知道这个标签具有告诉JSP引擎生成一段怎样的Servlet Java代码的功能,其中包括定义新的变量。如果在标签定义文件中用了variable,会生成变量定义和变量赋值的代码(这个会自动吗?还是需要标签处理类自己写,我想是要自己写,但没做自己不写的实验)。
接着讲解了如何用TagExtraInfo类定义JSP脚本变量,这由涉及到了VariableInfo和TagData这两个类。如果想让一个标签可以定义出任何类型的java对象,当对象类型不确定时,TLD文件中的<variable-class>元素内容就无法确定,这时候就可以使用TagExtraInfo类。
接着讲解了BodyTag接口和如何让自定义标签控制标签体内容,学员们应记住两个重要的细节:在什么方法之中,BodyCotent对象中才有标签体部分的内容;pageContext.getOut()返回的对象不是永恒不变的,在doStartTage、doInitBody、doAfterBody、doEndTag等方法中获得的对象不相同。
最后讲解了Tomcat下的自定义标签的缓存和线程安全问题,关于自定义标签缓存的实验:先打开原始的JSP文件翻译成的Servlet java源文件和jsp源文件,用ultraedit复制一份Servlet java源文件,保存到另外一个文件中。再修改web.xml文件,让Tomcat不要对自定义标签进行缓存,启动tomcat后访问jsp,ultraedit没有提示servlet java源文件更改的信息,所以,用ultraedit打开并修改jsp文件(增空格后删除空格),重新访问jsp文件,ultraedit提示Servlet java源文件更改,将原来复制的Servlet源文件拖动到它的旁边,然后使用比较工具进行比较,可以发现两者的显著区别。据方立勋和王泽佑的实验,在不对标签进行缓存的情况下生成的Servlet源文件有问题,在_service方法中new了标签对象,而在_jspDestroy方法中才进行释放,这将导致只有最后一次service方法被调用时产生的标签对象才会被释放,他们用的tomcat是tomcat 5.5.9,看来又抓住了tomcat以前的一个bug。要留一个tomcat 5.5.9的版本。
学员王泽佑发现jsp的问题:
<%!
int count = 0;
public void jspInit()
{
System.out.println("jspInit!");
}
%>
<%= ++count %>
如果赶在第一次访问jsp时,快速刷新,刷新到一定时机后,jsp生成的servlet会重新被加载,我想这是在编译jsp时没有处理好并发的问题。另外一个问题,通过运行对话框启动浏览器访问jsp页面,多次重复这一操作,即快速启动多个浏览器进程来访问jsp页面,由于速度很快,其中一些浏览器直接从缓存中抓取数据,而不向服务器发出访问请求。
学员田湘东发现下面例子中的一个问题:
public class IterateMessages extends TagSupport
{
String name;
String [] s;
int i = 1;//缓存问题
public void setName(String name)
{
this.name = name;
}
public void setMessages(String[] s)
{
this.s = s;
}
public int doStartTag() throws JspException
{
if(s.length > 0)
{
pageContext.setAttribute(name,s[0]);
return EVAL_BODY_INCLUDE;
}
else
{
return SKIP_BODY;
}
}
public int doAfterBody() throws JspException
{
if(i < s.length)
{
pageContext.setAttribute(name,s[i]);
i++;
return EVAL_BODY_AGAIN;
}
else
{
return SKIP_BODY;
}
}
}
考虑到标签处理器对象的缓存问题,i成员变量不能在定义时赋值,而应该在doStartTag方法中赋值。
作业:
1.在doStartTag方法中返回EVAL_BODY_INCLUDE的情况下,在doInitBody方法中、doAfterBody方法中、oEndTag方法中分别向PageContext.getOut获得的out对象中写入内容,看看有怎样的区别?
2.对于书稿中的10.6.3的例子,如果在doStartTag方法中不返回EVAL_BODY_INCLUDE,那么嵌套在它里面的子标签向out中输出的内容就应该是直接传递给浏览器,并且原来程序中调用的bodyContent应该无效导致异常,做个实验看看。
分享到:
相关推荐
在ThinkPHP中,自定义标签(Tag Lib)是一种强大的特性,允许开发者扩展模板引擎的功能,使其更符合项目需求。下面将详细解释如何在ThinkPHP 3.0版本中实现自定义标签及其使用方法。 1. **自定义标签的作用** ...
6. **自定义标签的返回值** 自定义标签可以返回任何可以转换为`TemplateModel`的对象,这些对象最终会被转换成字符串并插入到模板的相应位置。返回值可以是文本、集合、数据模型等。 7. **标签的安全性与性能** ...
6. **自定义标签的扩展**: - JSP 2.0引入了Facelets,它支持XML-based的视图层,可以更方便地创建自定义组件,包括自定义标签。 - Spring Web Flow、JSF等框架也提供了自定义标签的机制,进一步丰富了Web2.0开发...
6. **自定义标签的范围**:自定义标签可以设置其变量的作用范围,例如`page`、`request`、`session`或`application`,这与JSP内置对象的范围相同。 7. **标签库**:多个自定义标签可以组合成一个标签库,通过TLD...
在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...
6. **优势**:使用自定义标签的优点包括: - 分离关注点:将Java代码与HTML模板分离,提高了代码的可读性和可维护性。 - 代码复用:自定义标签可以作为可重用的组件,减少重复工作。 - 易于维护:美工可以专注于...
在Java Web开发中,自定义标签(Custom Tags)是一种封装常用功能、提高代码复用性的技术,它使得JSP页面更加简洁,易于维护。本文将详细介绍如何使用自定义标签实现JDBC分页功能,以及与MySQL数据库的集成。 首先...
在Java服务器页面(JSP)技术中,自定义标签是扩展JSP功能的重要手段。它允许开发者创建可重用的组件,这些组件可以像HTML标签一样在页面上使用,但执行的是自定义的Java代码。这极大地提高了代码的可读性和可维护性...
7. **在JSP页面使用自定义标签**:在视图层,使用自定义的分页标签来构建分页链接。例如,`<startPage/>`,`<endPage/>`,`<previousPage/>`和`<nextPage/>`标签可以嵌入到HTML代码中,形成完整的分页导航。 8. **...
在这个名为“Jsp自定义标签通用数据库查询”的项目中,我们探讨的关键知识点是如何利用自定义标签实现一个通用的数据库查询功能,使其能够适用于多种数据库系统。 首先,我们需要了解JSP自定义标签的工作原理。...
6. `release()`:当标签处理完毕,解除对标签处理程序实例的引用。 自定义标签的实现方式有两种: 1. 标签处理程序(Java文件):通过实现或扩展`Tag`、`IterationTag`或`BodyTag`接口,定义必要的生命周期方法,如...
6. **自定义标签示例** 假设我们有一个名为`hello`的自定义标签,它的TLD定义如下: ```xml xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> ...
标题“自定义标签实现POI导出”表明我们即将探讨的是如何使用Apache POI库来创建自定义的Excel导出功能。Apache POI是Java语言中用于读写Microsoft Office格式文件(如Word、Excel)的一个开源库。在这个场景中,...
6. 最后,释放标签对象。 四、自定义标签与JSTL标签的区别 JSTL(JavaServer Pages Standard Tag Library)是一套标准的标签库,包含了各种常用的标签,如循环、条件判断等。与自定义标签相比,JSTL提供了更通用的...
1. **创建自定义标签库**:定义一个Java类作为自定义标签的处理器,继承自`freemarker.template.TemplateDirectiveModel`接口,并实现其方法。在这个类中,你可以编写处理标签逻辑的代码。 2. **配置扫描路径**:...
6. 自定义标签的属性: 属性是传递给自定义标签的数据。开发者可以在TLD中定义属性,并在标签处理程序中访问它们。 7. 包含在"javaSrc92.zip"中的源码: 这个压缩包很可能包含了一个完整的自定义标签实现示例,...
6. **自定义布局算法**:如果标签需要动态排列,比如根据可用空间自动换行,那么还需要实现一套自定义布局算法,确保所有标签都能够正确显示。 综上所述,这个自定义标签项目提供了一种高效且灵活的方式来创建具有...
Java中的自定义标签是JSP(JavaServer Pages)技术的一部分,允许开发者创建可重用的、自定义的行为组件。这增强了JSP页面的可维护性和复用性,减少了代码的冗余。以下是对自定义标签使用及其相关概念的详细解释: ...
在Java Web开发中,自定义标签是一种强大的工具,允许开发者创建可重用的代码片段,以提高效率和代码的可维护性。以下是对"java自定义标签的使用"的详细解析: 1. **标签处理程序**: 标签处理程序是实现自定义...
标题中的“自己开发的一个生成多级select的自定义标签”是指在编程中创建了一个自定义HTML标签,这个标签能够帮助开发者生成多级选择下拉菜单(即多级联动的SELECT元素)。在Web开发中,这样的功能常用于组织结构、...