自定义JSP标签库及Properties使用

自定义JSP标签

  自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁。

  这些可重用的标签能处理复杂的逻辑运算和事务,或者定义JSP网页的输出内容和格式。

创建自定义JSP标签的步骤

  1.创建标签的处理类。

  2.创建标签库描述文件。

  3.在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>

JSP Tag API

  Servlet容器在编译JSP网页时,如果遇到自定义标签,就会调用这个标签的处理类。

  标签处理类必须扩展以下两个类之一:

  javax.servlet.jsp.tagext.TagSupport

  javax.servlet.jsp.tagext.BodyTagSupport

  前者是后者的父类。

TagSupport类的主要方法

doStartTag()

  Servlet容器遇到自定义标签的起始标志时调用该方法。

  doStartTag()方法返回一个整数值,用来决定程序的后续流程。它有两个可选值:

  Tag.SKIP_BODY:表示标签之间的内容被忽略。

  Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行。

doEndTag()

  Servlet容器遇到自定义标签的结束标志时调用该方法。

  doEndTag()方法也返回一个整数值,用来决定程序后续流程。它有两个可选值:

  Tag.SKIP_PAGE:表示立刻停止执行JSP网页,网页上未处理的静态内容和JSP程序均被忽略,任何已有的输出内容立刻返回到客户的浏览器上。

  Tag.EVAL_PAGE:表示按照正常的流程继续执行JSP网页。

setValue(String k, Object o)

  在标签处理类中设置key/value。

getValue(String k)

  在标签处理类中根据参数key返回匹配的value。

removeValue(String k)

  在标签处理类中删除key/value。

setPageContext(PageContext pc)

  设置PageContext对象,该方法由Servlet容器在调用doStartTag()或doEndTag()方法前调用。

setParent(Tag t)

  设置嵌套了当前标签的上层标签的处理类,该方法由Servlet容器在调用doStartTag()或doEndTag()方法前调用。

getParent()

  返回嵌套了当前标签的上层标签的处理类。

TagSupport类的两个重要属性

  parent:代表嵌套了当前标签的上层标签的处理类。

  pageContext:代表Web应用中的javax.servlet.jsp.PageContext对象。

  JSP容器在调用doStartTag()或doEndTag()方法前,会先调用setPageContext()和setParent()方法,设置pageContext和parent。

  在doStartTag()或doEndTag()方法中可以通过getParent()方法获取上层标签的处理类;

  在TagSupport类中定义了protected类型的pageContext成员变量,因此在标签处理类中可以直接访问pageContext变量。

PageContext类

  PageContext类提供了保存和访问Web应用的共享数据的方法:

  setAttribute(String name, Object value, int scope)

  getAttribute(String name, int scope)

  其中,scope参数用来指定属性存在的范围,它的可选值包括:

  PageContext.PAGE_SCOPE

  PageContext.REQUEST_SCOPE

  PageContext.SESSION_SCOPE

  PageContext.APPLICATION_SCOPE

用户自定义标签属性

  在标签中可以包含自定义的属性,例如:

<prefix:mytag username=“zhangsan">
……
……
</prefix:mytag>

  在标签处理类中应该将这个属性作为成员变量,并且分别提供设置和读取属性的方法,假定以上username为String类型,可以定义如下方法:

private String username;
public void setUsername(String value){
this.username=value;
}
public String getUsername(){
return username;
}

范例1 创建标签

1.创建标签的处理类:

package com.mengdd.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; public class MyTag extends TagSupport { @Override
public int doStartTag() throws JspException { // pageContext 是TagSupport的protected的成员变量
JspWriter writer = this.pageContext.getOut();// 返回一个JspWriter try {
writer.println("Hello World");
}
catch (IOException e) {
e.printStackTrace();
} return EVAL_BODY_INCLUDE;
} @Override
public int doEndTag() throws JspException { JspWriter writer = this.pageContext.getOut(); try {
writer.println("Welcome");
}
catch (IOException e) {
e.printStackTrace();
} return EVAL_PAGE;
}
}

2.创建标签库描述文件

  标签库描述文件的后缀名:.tld (tag lib descriptor)

  它是一个标准的XML文件。

  存放位置:必须跟web.xml在同一个目录下,即WEB-INF下面。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version>
<jsp-version>1.1</jsp-version>
<short-name>myTag</short-name>
<uri>/myTag</uri> <tag>
<name>firstTag</name>
<tag-class>com.mengdd.tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag> </taglib>

3.在JSP文件中引入标签库,然后插入标签,例如:<mm:hello/>

  首先,新建一个JSP页面,在第一行下面加上这么一行:

<%@ taglib uri="/myTag" prefix="hello" %>

  其中uriprefix是必填属性,uri在.tld文件中定义,这里用来指定使用哪个标签库,prefix是前缀,表示用这个词来指代该标签库,这里先随便起一个名字。

  在JSP页面的body里面插入这个标签:

<body>
<p>
<font color="blue"><hello:firstTag />
</font>
</p>
</body>

  用浏览器访问,页面显示:

  Hello World Welcome

  这是因为标签处理类里输出了该内容。

范例2:创建message标签

  创建一个能够替换应用中JSP网页的静态文本的标签,这个标签名为message,它放在标签库中。

1.初始化操作

  尽管装载静态文本的任务可以直接由标签处理类来完成,但是把初始化的操作安排在Web应用启动时完成更符合Web编程的规范。

  首先,在WEB-INF下新建一个message.properties文件,其中存放的是键值对:

title=hello
body=world

  然后创建一个InitServlet,删除其在web.xml中的<servlet-mapping>配置,加上启动设置:

 <servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.mengdd.tag.InitServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>

  InitServlet内容如下:

package com.mengdd.tag;

import java.io.InputStream;
import java.util.Properties; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; public class InitServlet extends HttpServlet { @Override
public void init() throws ServletException {
Properties properties = new Properties(); try {
ServletContext servletContext = getServletContext();
InputStream is = servletContext
.getResourceAsStream("/WEB-INF/message.properties"); properties.load(is); is.close(); // 将properties对象放到application范围内供其他组件使用
servletContext.setAttribute("properties", properties);
}
catch (Exception e) {
}
} }

2.标签库描述文件

  标签库的描述文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version>
<jsp-version>1.1</jsp-version>
<short-name>myTag</short-name>
<uri>/myTag</uri> <tag>
<name>firstTag</name>
<tag-class>com.mengdd.tag.MyTag</tag-class>
<body-content>empty</body-content>
</tag> <tag>
<name>message</name>
<tag-class>com.mengdd.tag.MyTag2</tag-class>
<body-content>empty</body-content>
<attribute>
<name>key</name>
<required>true</required>
</attribute>
</tag> </taglib>

3.标签处理类:

package com.mengdd.tag;

import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport; public class MyTag2 extends TagSupport { // 属性,需要在标签处理类中提供成员变量和get set方法
private String key; public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} @Override
public int doEndTag() throws JspException { try {
// 首先,读取properties
Properties properties = (Properties) this.pageContext.getAttribute(
"properties", PageContext.APPLICATION_SCOPE); // 获取key对应的value
String message = properties.getProperty(key); // 将message打印在页面上
this.pageContext.getOut().println(message);
}
catch (Exception e) {
}
return EVAL_PAGE;
}
}

4.在页面中使用:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/myTag" prefix="hello"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'tag1.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<p>
<font color="blue"><hello:firstTag /> </font>
</p> <p>
<hello:message key="title"/><br/>
<hello:message key="body"/><br/>
</p>
</body>
</html>

  页面中会添加两行,显示键值title和body对应的value值,即hello和world。

  用途:用来实现国际化时,可以定义多个.properties文件,对不同的语言,使用不同的文件。

参考资料

  圣思园张龙老师Java Web系列视频教程。

自定义JSP标签库及Properties使用的更多相关文章

  1. 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题

    不少web项目,都用到了SiteMesh.SiteMesh可以和JSP.Freemarker等模版进行整合,有一定的好处,当然也有其不好的地方.我个人觉得,如果没有必要,不要在项目中引入太多的工具和技 ...

  2. 自定义JSP标签示例

    我们以一个例子来讲解如何自定义JSP标签,假如我们需要在页面中输出当前的时间,按照最简单的JSP脚本,需要在JSP里面写很多Java代码,那么如何来使用自定义标签实现这个功能呢? 首先,我们要先创建一 ...

  3. Java开源JSP标签库

    01displytag 与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮.完善. 02cewolf tag 用来在web上显示复杂图形报表的一个jsp tag. 03Loading T ...

  4. 自定义jstl标签库

    开发环境:Spring+SpringMVC +Maven +Mybatis JSTL 标签库的配置: 导入对应的 jstl.jar 和 standard.jar ,我使用的配置如下: <prop ...

  5. 自定义JSP标签入门

    1.编写一个实现Tag接口的java类 package TagDemo; import javax.servlet.http.HttpServletRequest; import javax.serv ...

  6. [应用篇]第六篇 JSTL之自定义函数标签库

      在之前的JSTL的总结中已经对函数标签库进行了一些说明,在这里我再一次重新整理一下! 自带函数标签库介绍 引入该标签库的方法为: <%@ taglib prefix="fn&quo ...

  7. JSP标签库

    step1: 定义一个标签处理类:改类必须实现SimpleTag接口,在实际中是拓展它的子类SimpleTagSupport.复写doTag方法 public class MyTag extends ...

  8. 自定义jsp标签

    1.类: package ===============================; import javax.servlet.jsp.JspTagException; import javax ...

  9. Spring的jsp标签库

    1,主要有两个 一个用于渲染HTML表单标签, 这些标签会绑定model中的某个属性 另一个包换了一些工具类标签 2,将表单绑定到模型上 包含了14个标签,海报一个人为用户展现错误的标签,它会将错误信 ...

随机推荐

  1. javascript学习总结(一):基础知识。

    1 数据类型a.数据类型共有7种,字符串(string).数字(number).布尔(boolean).数组(array).对象(object).Null.Undefined. 其中布尔(逻辑)类型只 ...

  2. 在SQL Server里禁用聚集索引——真的好么?

    有人问了我一个最有意思的问题:“你能禁用聚集索引么?” 对这个问题,我先是吓了一跳,因为我从未想过禁用聚集索引,因为聚集索引代表表数据,对这个最有趣问题,我立即答道:“我认为可以,但是...” 好吧, ...

  3. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...

  4. 使用PhoneGap搭建一个山寨京东APP

    为什么要写一个App 首先解释下写出来的这个App,其实无任何功能,只是用HTML和CSS模仿JD移动端界面写的一个适配移动端的Web界面.本篇主要内容是介绍如何使用PhoneGap把开发出来的mob ...

  5. The Web server is configured to not list the contents of this directory.

    部署一个ASP.NET MVC网站至一个全新的服务器Windows Server 2008 R2, 数据为MS SQL Server 2014 64bit Expression版本. 运行时,它第一次 ...

  6. 解读 C 语言中的指针

    我想对很多学习C语言的新手来说,指针无疑是一个难点.但是,我觉得指针也是C语言特别重要的一个特性.也许,你在除了C和C++以外的编程语言中,很少看到指针.而C++中,也多用引用,而非指针.指针,作为一 ...

  7. [Android] 环境配置之正式版Android Studio 1.0

    昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...

  8. sqlserver中的循环遍历(普通循环和游标循环)

    sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student

  9. 怎样学习Scala泛函编程

    确切来说应该是我打算怎么去学习Scala泛函编程.在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍.博客.演讲稿.论坛问答.技术说明等组织一下,希望能达到学习目的.关于Sca ...

  10. 基于HTML5 geolocation 实现的天气预报功能

    最近一直在学习HTML5,因为8月份要开发手机项目了.所以先把HTML5学习下. 基本思路: 1. 用户未设置任何城市之前,根据HTML5 geolocation 获取用户所在的地理位置. 2. 根据 ...