`
逆风的香1314
  • 浏览: 1420773 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

11月6日自定义标签培训日记

阅读更多

今天还是讲解自定义标签。
首先介绍了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应该无效导致异常,做个实验看看。 

分享到:
评论

相关推荐

    tp自定义标签

    在ThinkPHP中,自定义标签(Tag Lib)是一种强大的特性,允许开发者扩展模板引擎的功能,使其更符合项目需求。下面将详细解释如何在ThinkPHP 3.0版本中实现自定义标签及其使用方法。 1. **自定义标签的作用** ...

    Web2.0体系学习(自定义标签)

    6. **自定义标签的扩展**: - JSP 2.0引入了Facelets,它支持XML-based的视图层,可以更方便地创建自定义组件,包括自定义标签。 - Spring Web Flow、JSF等框架也提供了自定义标签的机制,进一步丰富了Web2.0开发...

    jsp自定义标签报错的问题

    在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...

    JSP自定义标签详解

    6. 加载TLD文件,找到对应标签的定义。 7. 获取标签处理类并实例化。 8. 调用doStartTag和doEndTag方法执行标签逻辑。 四、创建和使用自定义标签库的基本步骤: 1. 创建标签处理类:编写实现特定功能的Java类。 2. ...

    Eclipse自定义标签

    在Java Web开发中,自定义标签(Custom Tags)是一种强大的工具,它允许开发者创建可重用的组件,提高代码的可读性和维护性。Eclipse作为一款流行的Java集成开发环境,提供了良好的支持来帮助开发者创建和管理自定义...

    Jsp自定义标签通用数据库查询

    在这个名为“Jsp自定义标签通用数据库查询”的项目中,我们探讨的关键知识点是如何利用自定义标签实现一个通用的数据库查询功能,使其能够适用于多种数据库系统。 首先,我们需要了解JSP自定义标签的工作原理。...

    jbuilder 自定义标签插件

    6. **文档编写**:借助`JSPTagWizardsDoc.jar`中的文档工具,生成详细的自定义标签使用文档,方便团队成员参考。 综上所述,JBuilder的自定义标签插件是Java Web开发中的一个重要工具,它简化了自定义标签的创建和...

    jsp自定义带属性的标签

    6. **在JSP页面中使用自定义标签**:最后,在JSP页面中使用`&lt;%@ taglib %&gt;`指令导入标签库,并使用前缀加上标签名称来调用自定义标签。在调用标签时,可以通过类似HTML属性的方式设置标签的属性值。 #### 三、示例...

    java_自定义标签的使用.docx

    Java中的自定义标签是JSP(JavaServer Pages)技术的一部分,允许开发者创建可重用的、自定义的行为组件。这增强了JSP页面的可维护性和复用性,减少了代码的冗余。以下是对自定义标签使用及其相关概念的详细解释: ...

    JSP自定义标签

    **JSP自定义标签**是JavaServer Pages (JSP)技术的一个强大特性,它允许开发者创建可重用的自定义组件,以增强JSP页面的功能和可读性。以下是关于JSP自定义标签的详细解释和创建过程: **一、基本概念** 1. **标签...

    android标题栏自定义标签

    "android标题栏自定义标签"这一主题,主要涉及如何在Android应用的标题栏中添加和定制各种元素,如文字、图片,以及实现沉浸式显示效果。下面将详细讲解这个知识点。 首先,Android的标题栏通常指的是`ActionBar`或...

    Android自定义标签view——可自动换行

    6. 处理触摸事件:为了保持良好的交互体验,自定义标签可能还需要处理触摸事件,如点击事件,以便用户能够选择或操作标签。 7. Github协作与版本控制:项目是从GitHub上下载的,这表明开发者利用了Git进行版本控制...

    ThinkPHP模板自定义标签使用方法

    其中一个便捷功能就是模板自定义标签的使用,这可以让我们在开发中更加灵活地调用数据和显示内容。 首先,了解什么是模板标签是很重要的。模板标签类似于一些内容管理系统(如dedecms、phpcms)中使用标签的方式,...

    自定义标签小练习----一个简单的分页标签

    在本文中,我们将深入探讨如何创建一个自定义的分页标签,这是一个常见的需求,尤其是在Web应用开发中。分页功能可以有效地帮助用户浏览大量数据,提高用户体验。通过自定义标签,我们可以更好地控制分页的样式和...

    vue中使用antv/x6编写自定义流程

    在vue中使用antv/x6和element组件,实现自定义流程的编写,使用antv/x6实现画布绘制和流程绘制,通过拖动节点到画布的方式进行节点的添加,使用element组件实现鼠标移入节点后的自定义功能,使用antv/x6自带的api和...

    基于JavaScript ECharts的Java自定义标签实现设计源码

    本项目是一个基于JavaScript ECharts和Java技术的自定义标签实现设计源码,包含475个文件,包括167个JavaScript文件、108个PNG图片文件、45个GIF动画文件、35个HTML文件、35个Java源文件、20个CSS样式文件、14个JSP...

    antv g2、g6 自定义扩展

    g2自定义 3d柱状图、分割柱状图及g6 自定义卡片

    Jsp中的自定义标签由浅到深详细讲解

    ### JSP中的自定义标签详解 #### 一、基本概念 1. **标签(Tag)**:在JSP中,标签是一种类似于XML元素的结构,通过标签可以让JSP页面更清晰地组织代码,实现相同功能的不同部分在标签内的复用。标签在JSP中既可以...

    自定义分页标签

    6. **在JSP页面中使用**:最后,在JSP页面中,我们可以像使用标准JSP标签一样使用自定义分页标签,传入必要的参数,如当前页码和总记录数。 例如,一个简单的分页标签可能看起来像这样: ```jsp ${currentPage}" ...

    java自定义分页标签实现带条件的分页查询

    6. **配置TLD文件**:在项目的WEB-INF目录下创建一个.tld文件,定义你的自定义标签及其属性。这样,你就可以在JSP页面上像使用内置标签一样使用你的自定义分页标签。 7. **使用自定义标签**:在JSP页面中,插入`...

Global site tag (gtag.js) - Google Analytics