自定义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. 关于DataTable的两篇基础文章

    DataTable有的时候还是很有用的.记录两篇不错的文章,当字典 1.http://blog.csdn.net/imagse/article/details/3085870 2.https://ms ...

  2. js文件合并,压缩,缓存,延迟加载

    做web前段也有一段时间了,对于web中js文件的加载有些体会想跟大家一起分享一下. 1.首先说说js文件的合并和压缩吧 为了便于集中式管理js的合并和压缩我们创建一个Js.ashx文件来专门处理合并 ...

  3. javascript小技巧:同步服务器时间、同步倒计时

    之前在网上看到有人提问,如何在页面上同步显示服务器的时间,其实实现方法有几种,可能一般人立马就想到可以使用Ajax每隔一秒去请求服务器,然后将服务器获取到时间显示在页面上,这样虽然能够实现,但存在一个 ...

  4. 五、BLE(下)

    1.1       GATT server Service 通过走读代码, GATT Server作为一个GATT service,我是没有发现其发挥了多大功能,其负责处理的消息GATT_SERVER ...

  5. OpenJudge2728:摘花生 解题报告

    2728:摘花生 总时间限制:  1000ms 内存限制: 65536kB 描述 Hello Kitty 想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南 ...

  6. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [三] 配置式爬虫

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 上一篇介绍的基本的使用方式,虽然自由度很高,但是编写的代码相对还是挺多.于是框 ...

  7. .Net语言 APP开发平台——Smobiler学习日志:如何仿微信朋友圈的消息样式?

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...

  8. WinPhone学习笔记(三)——WinPhone的动画

    这段时间又一直赶任务,结果没有去学习,也没有去写博文,这个动画的内容很早就学了,但是一直没把它整理成博文,现在终于有空就弄一下. 开始先讲讲在WinPhone中做动画有两种动画类型,一种是基于帧动画另 ...

  9. 水晶报表13.x(Crystal Reports for VS2010)的安装部署经验

    这两天搞安装包真心坎坷,一个问题接一个问题,先是为了实现自定义动作现啃vbs,后面又是安装过程老是报错: 各种搜索.各种尝试,总算搞掂,积累了些经验,分享一下. 首先CR for VS2010的所有东 ...

  10. MongoDB管理工具的插件系统

    MongoDB管理工具  MongoCola的开发已经进入第三个年头了. 官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了. 最近准备着手插件系统的开发,简 ...