JavaWeb:标签(二)

接上一节

setJspContext:

一定会被 JSP 引擎所调用,先于 doTag, 把代表JSP 引擎的 pageContext 传给标签处理器类。

带属性的自定义标签:

1)、先在标签处理器类中定义 setter 方法,建议把所有的属性类型都设置为 String 类型。

例如:

private String value;
private String count;

public void setValue(String value) {
  this.value = value;
}

public void setCount(String count) {
  this.count = count;
}

2)、在 .tld 描述文件中来描述属性:

例如:

<!-- 描述当前标签的属性 -->
<attribute>
    <!-- 属性名, 需和标签处理器类的 setter 方法定义的属性相同 -->
    <name>value</name>
    <!-- 该属性是否被必须 -->
    <required>true</required>
    <!-- rtexprvalue: runtime expression value 当前属性是否可以接受运行时表达式的动态值 -->
    <rtexprvalue>true</rtexprvalue>
</attribute>

3)、在页面中使用属性,属性名同 .tld 文件中定义的名字。

例如: <hnust:hello value="${param.name }" count="10"/>

4)、通常情况下,开发简单标签直接继承 SimpleTagSupport 就可以了,可以直接调用其对应的 getter 方法得到对应的 API 。

 1 public class SimpleTagSupport implements SimpleTag{
 2
 3     public void doTag()
 4         throws JspException, IOException{}
 5
 6     private JspTag parentTag;
 7
 8     public void setParent( JspTag parent ) {
 9         this.parentTag = parent;
10     }
11
12     public JspTag getParent() {
13         return this.parentTag;
14     }
15
16     private JspContext jspContext;
17
18     public void setJspContext( JspContext pc ) {
19         this.jspContext = pc;
20     }
21
22     protected JspContext getJspContext() {
23         return this.jspContext;
24     }
25
26     private JspFragment jspBody;
27
28     public void setJspBody( JspFragment jspBody ) {
29         this.jspBody = jspBody;
30     }
31
32     protected JspFragment getJspBody() {
33         return this.jspBody;
34     }
35 }

带标签体的自定义标签:

1)、若一个标签有标签体: <hnust:testJspFragment>abcdefg</hnust:testJspFragment>

在自定义标签的标签处理器中使用 JspFragment 对象封装标签体信息。

2)、若配置了标签含有标签体,则 JSP 引擎会调用 setJspBody() 方法把 JspFragment 传递给标签处理器类。

在SimpleTagSupport 中还定义了一个 getJspBody() 方法,用于返回 JspFragment 对象。

3)、JspFragment 的 invoke(Wirter) 方法:把标签体内容从 Writer 中输出,若为 null,则等同于 invoke(getJspContext.getOut()),即直接把标签体内容输出到页面上。

有时,可以借助 StringWriter,可以在标签处理器类中先得到标签体的内容:

  ①、利用 StringWriter 得到标签体的内容。

  StringWriter sw = new StringWriter();   bodyContent.invoke(sw);

  ②、把标签体的内容都变为大写

   String content = sw.toString().toUpperCase();

4)、在 .tld 文件中,使用 body-content 节点来描述标签体的类型:

  <body-content>: 指定标签体的类型, 大部分情况下, 取值为 scriptless 。可能取值有 3 种:empty: 没有标签体;scriptless: 标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素;tagdependent: 表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器。

例如:<body-content>tagdependent</body-content>

5)、定义一个自定义标签: <hnust:printUpper time="10">abcdefg</hnust>   把标签体的内容转为大写,并输出 time  次到浏览器上。

 1 public class TestJspFragment extends SimpleTagSupport {
 2
 3     @Override
 4     public void doTag() throws JspException, IOException {
 5         JspFragment bodyContent = getJspBody();
 6         //JspFragment.invoke(Witer): Writer 即为标签体内容输出的字符流, 若为 null, 则
 7         //输出到 getJspContext().getOut(), 即输出到页面上.
 8
 9         //1. 利用 StringWriter 得到标签体的内容.
10         StringWriter sw = new StringWriter();
11         bodyContent.invoke(sw);
12
13         //2. 把标签体的内容都变为大写
14         String content = sw.toString().toUpperCase();
15
16         //3. 获取 JSP 页面的 out 隐含对象, 输出到页面上
17         getJspContext().getOut().print(content);
18     }
19
20 }

有父标签的标签:

1)、父标签无法获得子标签的引用,父标签仅把子标签作为标签体来使用。

2)、子标签可以通过 getParent() 方法来获取父标签的引用(需继承 SimpleTagSupport 或自实现 SimpleTag 接口的该方法):若子标签的确有个父标签,JSP 引擎会把代表父标签的引用通过 setParent(JspTag parent) 赋给标签处理器。

3)、注意:父标签的类型是 JspTag 类型的,该接口是一个空接口,但是来统一 SimpleTag 和 Tag 的。实际使用需要进行类型的强制转换。

4)、在 .tld 配置文件中,无需为父标签有额外的配置,但,子标签是以标签体的形式存在的,所以父标签的 <body-content></body-content> 需设置为 scriptless。

时间: 2024-08-06 18:29:20

JavaWeb:标签(二)的相关文章

JavaWeb 后端 &lt;二&gt; 之 Servlet 学习笔记

JavaWeb 后端 <二> 之 Servlet 学习笔记 一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException ServletRequest req:代表着请

JavaWeb学习(二)---Tomcat服务器学习和使用(一)

本文整理自孤傲苍狼大大的博客,,, 一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改 例如:将Tomcat服务器的启动端口由默认的8080改成8081端口 Tomcat服务器启动端口默认配置 1 <Connector port="8080" protocol="HTTP/1

Servlet之javaweb应用(二)

一. 使用 JavaEE 版的 Eclipse 开发动态的 WEB 工程(JavaWEB 项目) 1). 把开发选项切换到 JavaEE 2). 可以在 Window -> Show View 中找到 Package Explorer, 并把其拖拽到开发区的左边 3). 在 Servers 面板中新建 Tomcat 服务器. 一定要关联到 Tomcat 安装的根目录 4). 新建一个 Dynamic Web Project(如果没有,下载Eclipse组件.或者去Eclipse官网下载Eclip

Struts2(十)OGNL标签二与Struts2标签

一.Struts2标签的优势 标签库简化了用户对标签的使用 结合OGNL使用,对于集合.对象的访问功能非常强大 提供可扩展的主题.模板支持.极大简化了视图页面的编写 不依赖任何表现层技术 Struts2标签的分类: 通用标签(Generir Tags) 数据标签(Data Tags) 控制标签(Control Tags) UI标签(UI Tags) Ajax标签(Ajax Tags) 二.数据标签 web.xml <filter> <filter-name>struts2</

初学HTML 常见的标签(二) 列表标签

上次介绍了一些简单的文本标签设计, 这篇介绍列表类标签, 通过列表能写出很好看的, 多元化的网络页面. ul-li 列表标签 <ul> <li>列表1</li> <li>列表2</li> </ul> ul-li在网页中显示的默认样式一般为:每项li前都带一个圆点, 所以ul-li是没有序号的信息列表, 不存在前面的1, 2, 3等等的序号为其排序. ol-li 列表标签 <ol> <li>有序列表1</l

JavaWeb学习 (二十四)————Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

JavaWeb学习 (二十五)————监听器(Listener)

一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行. 1.2.监听器案例--监听window窗口的事件监听器 1 package me.gacl.listener.demo; 2 3 import java.awt.Fram

JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听器技术来实现这个功能了. 1 package me.gacl.web.listener; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.http.HttpSessionEvent; 5 import javax.ser

〇二——body内标签之交互输入标签二

我们在上一章讲了一些要通过后台程序实现交互的标签,下面我们看一看一些不通过后台实现交互的标签. 一.a标签 a标签主要实现超链接的功能 1.跳转效果 这个效果比较简单,直接在属性里添加一个网址,然后可以做成链接效果 <a href="http://www.baidu.com"target='_blank'>百度</a> 其中的target='_blank'意思是在新窗口内打开链接.targe还有其他的属性,但是这个是用的比较多的. 2.锚效果 有些比较好的博客,

Struts2之数据标签(二)

Struts2之数据标签(一):http://blog.csdn.net/u012561176/article/details/46848817 1.action标签:使用此标签可以允许在JSP页面中直接调用Action,因为需要调用Action,故可以指定需要被调用Action的name以及namespace.如果指定了executeResult参数的属性值为true,该标签还会把Action的处理结果(视图支援)包含到本页面中来. (1).此标签的属性: - id:可选属性,该属性将会作为该