你的位置:首页 > 软件开发 > Java > JSP2 自定义标签

JSP2 自定义标签

发布时间:2016-02-29 20:00:09
实现步骤实现自定义标签的处理类继承javax.servlet.jsp.tagext.SimpleTagSupport,并重写doTag方法建立标签库配置文件在jsp中使用自定义标签一个简单的标签文件目录结构src/main/java |---- cn.ljl.javaweb.d ...

JSP2 自定义标签

实现步骤


文件目录结构

src/main/java  |---- cn.ljl.javaweb.demo.jsp2taglib.servlet       |---- HelloWorldServlet.java  |---- cn.ljl.javaweb.demo.jsp2taglib       |---- HelloWordTag.javasrc/main/webapp  |---- WEB-INF       |---- jsp2taglib            |---- demo.tld  |---- demo/jsp2taglib       |---- helloword.jsp
文件解析:
  • HelloWorldServlet.java
    1. 标签处理类应该继承javax.servlet.jsp.tagext.SimpleTagSupport
    2. 重写doTag方法,这个方法负责往页面写内容

    demo.tld

    <??><taglib ="http://java.sun.com/  ="http://www.w3.org/2001/  xsi:schemaLocation="http://java.sun.com/  version="2.0">  <tlib-version>1.0</tlib-version>  <short-name>demo</short-name>  <uri>http://www.lijinlong.cn/demotaglib</uri>  <tag>    <description>输出Hello World,这个标签没有属性和标签体</description>    <name>helloword</name>    <tag-class>cn.ljl.javaweb.demo.jsp2taglib.HelloWordTag</tag-class>    <body-content>empty</body-content>  </tag></taglib>
    根元素taglib定义标签库:
    • description
      1. 使用taglib编译指令,导入指定uri的标签库,并绑定到指定的prefix。
      2. 使用标签,以prefix:tagname的形式

      HelloWordServlet.java

      package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name="helloWorldServlet", urlPatterns = {"/demo/jsp2taglib/helloword"})public class HelloWorldServlet extends HttpServlet {  private static final long serialVersionUID = -297481388442806334L;    private static final String VIEW_HELLOWORLD = "/demo/jsp2taglib/helloword.jsp";  @Override  protected void service(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    req.getRequestDispatcher(VIEW_HELLOWORLD).forward(req, resp);  }  }

      支持属性的标签


      demo.tld

      这里只给出添加的内容。attribute元素为标签添加属性,可以出现多次,每一次声明一个属性:
      • name

        支持标签体的标签


        1. 在标签处理类中,可以通过getJsoContext()来设置/获取共享变量。
        2. 输出标签体的内容:getJspBody().invoke(null);

        demo.tld

        注意:为了支持标签体,body-content要设置成scriptless。

        iterator.jsp

        <%@ page language="java" contentType="text/html; charset=GBK"  pageEncoding="GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ taglib uri="http://www.lijinlong.cn/demotaglib" prefix="demo"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>自定义标签 - iterator</title></head><body>  <h2>我们给您的建议:</h2>  <ol>    <demo:iterator collection="${requestScope.adviceList}" eleAttrName="item">      <li>${pageScope.item}</li>    </demo:iterator>  </ol></body></html>
        1. 这里从request scope取得的adviceList是在Servlet中放进去的。
        2. iterator标签设计为,将集合中的每一个元素设置到page scope的属性中,其name由eleAttrName指定。
        3. 我们的jsp非常的简洁。

        IteratorServlet.java

        package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name = "iteratorServlet", urlPatterns = { "/demo/jsp2taglib/iterator" })public class IteratorServlet extends HttpServlet {  private static final long serialVersionUID = 4201830343915991973L;    private static final String VIEW_SHOW = "/demo/jsp2taglib/iterator.jsp";  @Override  protected void service(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    List<String> advices = new ArrayList<String>();    advices.add("早睡早起。");    advices.add("坚持锻炼身体。");    advices.add("每天留半个小时发呆或者冥想。");    advices.add("保持心情平和。");    advices.add("专注认真但不要急功近利。");    advices.add("赶紧脱单。");        req.setAttribute("adviceList", advices);        req.getRequestDispatcher(VIEW_SHOW).forward(req, resp);  }  }

        支持JspFragment的标签


        文件内容

        Topic.java

        package cn.ljl.javaweb.demo.jsp2taglib.domain;/** * 这是一个pojo,用于封装一个问题及其唯一的答案. * @author lijinlong * */public class Topic {  private String question;  private String answer;    public Topic(String question, String answer) {    super();    this.question = question;    this.answer = answer;  }    public String getQuestion() {    return question;  }  public void setQuestion(String question) {    this.question = question;  }  public String getAnswer() {    return answer;  }  public void setAnswer(String answer) {    this.answer = answer;  }}

        TopicServlet.java

        package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import cn.ljl.javaweb.demo.jsp2taglib.domain.Topic;@WebServlet(name = "topicServlet", urlPatterns = { "/demo/jsp2taglib/topic" })public class TopicServlet extends HttpServlet {  private static final long serialVersionUID = -2717086554249858215L;  private static final String VIEW_SHOW = "/demo/jsp2taglib/topic.jsp";  @Override  protected void service(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    List<Topic> topicList = new ArrayList<Topic>();    topicList.add(new Topic("我很想做一件事,但是又害怕失败,怎么办?",        "害怕失败比失败本身更可怕。失败只是一时的,害怕失败却会纠缠你很久。"));    topicList.add(new Topic("最近被一些人否定了,我觉得自己很没用。",        "别人轻视了你,是轻视你的过往;你轻视了自己,是放弃了你的未来。平静地对待,平静地加油。"));    topicList.add(new Topic("我被一个同学骗了,再也不敢相信任何人了。",        "所有的人都靠谱,就没有欺骗;所有的人都不靠谱,就欺骗不了。就是有人不可信,才会有些人可信,你要学会鉴别,不要失望。"));    req.setAttribute("topicList", topicList);    req.getRequestDispatcher(VIEW_SHOW).forward(req, resp);  }}

        总结

        有必要对这一块做个总结,因为它看起来要“复杂”一点。支持动态属性,即支持不限定属性的个数和名称。

        demo.tld

          <tag>    <name>dynaAttr</name>    <tag-class>cn.ljl.javaweb.demo.jsp2taglib.DynamicAttributesTag</tag-class>    <body-content>empty</body-content>    <dynamic-attributes>true</dynamic-attributes>  </tag>

        dynaAttr.jsp

        <%@ page language="java" contentType="text/html; charset=GBK"  pageEncoding="GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><%@ taglib uri="http://www.lijinlong.cn/demotaglib" prefix="demo"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>自定义标签 - dynaAttr</title></head><body><h2>指定了三个属性:</h2><demo:dynaAttr name="Adam" age="24" favorite="books" /></body></html>

        DynaAttrServlet.java

        package cn.ljl.javaweb.demo.jsp2taglib.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name="dynaAttrServlet", urlPatterns={"/demo/jsp2taglib/dynaAttr"})public class DynaAttrServlet extends HttpServlet {  private static final long serialVersionUID = -3146911293779890912L;    private static final String VIEW_SHOW = "/demo/jsp2taglib/dynaAttr.jsp";    @Override  protected void service(HttpServletRequest req, HttpServletResponse resp)      throws ServletException, IOException {    req.getRequestDispatcher(VIEW_SHOW).forward(req, resp);  }  }

        开源标签库


        原标题:JSP2 自定义标签

        关键词:JS

JS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。