zoukankan      html  css  js  c++  java
  • 自定义JSP标签库及Properties使用

     

    自定义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系列视频教程。

  • 相关阅读:
    2010年8月26日周四_understanding ArcGIS Server_overview_8.1
    2010年8月23日周一_FeatureLayer_6.13
    2010年8月22日周日_StylingAndSkinningScaleBar_6.12
    2010年8月26日周四_underStanding Flex_FlexComponets_7.4
    Flex组件的项目渲染器(ItemRenderer)使用总结
    2010年8月26日周四_understanding Flex_componentsLifeCycle_7.5
    2010年8月26日周四_understanding Flex_MXML and ActionScript_7.2
    缺页中断
    后缀式
    lua continue
  • 原文地址:https://www.cnblogs.com/mengdd/p/3671391.html
Copyright © 2011-2022 走看看