`
txf2004
  • 浏览: 7034335 次
  • 性别: 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应该无效导致异常,做个实验看看。

分享到:
评论

相关推荐

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

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

    jsp自定义标签报错的问题

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

    JSP自定义标签源码

    在Java服务器页面(JSP)技术中,自定义标签是扩展JSP功能的重要手段。它允许开发者创建可重用的组件,这些组件可以像HTML标签一样在页面上使用,但执行的是自定义的Java代码。这极大地提高了代码的可读性和可维护性...

    JSP自定义标签详解

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

    Eclipse自定义标签

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

    JSP自定义标签-标签属性_动力节点Java学院整理

    在JSP(JavaServer Pages)技术中,自定义标签库允许开发者创建可复用的组件,以方便在多个页面中使用相同的代码逻辑。添加属性到自定义标签可以使标签功能更加灵活和强大。以下是关于JSP自定义标签及其属性的相关...

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

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

    自定义分页标签自定义分页标签

    6. **兼容性**:自定义分页标签应确保在各种浏览器和设备上都能正常工作,这需要对CSS和JavaScript进行兼容性测试。 7. **可维护性**:良好的代码结构和注释能提高代码的可读性和可维护性,便于团队协作和后期修改...

    C#自定义标签事例

    在C#编程中,自定义标签(Custom Control)是一种常见的技术,它允许开发者根据特定需求创建自己的UI元素,以扩展Windows Forms或WPF应用程序的功能。本篇将详细讲解如何利用C#实现自定义标签控件,并通过提供的示例...

    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. **标签...

    JSP 页中的自定义标签 PPT

    6. **自定义标签的优点**: - 提高代码的可读性和可维护性,因为业务逻辑被封装在标签中,而不是混杂在JSP页面中。 - 促进组件重用,通过定义一组自定义标签,可以构建模块化的应用程序。 - 与MVC(Model-View-...

    android标题栏自定义标签

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

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

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

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

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

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

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

    ssm+自定义标签+自定义注解 实现权限细粒度控制

    在这个项目中,开发者尝试模仿Apache Shiro框架,通过自定义标签和自定义注解来实现权限的细粒度控制,从而更好地管理和限制用户访问特定的资源。 Apache Shiro是一个强大且易用的Java安全框架,处理认证、授权、...

    antv g2、g6 自定义扩展

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

Global site tag (gtag.js) - Google Analytics