Jsp 自定义标签库

1.我们要先确定要做什么样功能的标签库。

        比如 <start:message key=“” />

 

2.确定使用什么标签库之后:写个类继承javax.servlet.jsp.tagext.SimpleTagSupport类覆盖doTag()方法

        比如MessageTag extends SimpleTagSupport

        MessageTag类中属性  ----  标签库的属性

            key(set/get方法)    ----      key

 

3.实现你的doTag()方法:

        PageContext context=(PageContext)getJspContext();

        context.getOut().write(key+“Hello”);

 

4.配置tld文件:

<?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.2</tlib-version>
  <jsp-version>1.0</jsp-version>
  <short-name>MessageTag</short-name>
  <uri>http://startStruts/messageTag/message</uri>
  <tag>
    <name>message</name>
    <tag-class>cs.eylen.servlet.tag.MessageTag</tag-class>
    <body-content>empty</body-content>
    <attribute >
     <name>key</name>
     <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

 

5.在jsp中引用:

      <%@taglib prefix="start"  uri="http://startStruts/messageTag/message"%>

 

     <start:message key="Eylen" />   

                             显示到页面上的就是EylenHello

 

 

例如:<c:forEach ... 自定义

1.我们要在页面使用自定义的forEach标签库。

 <%@ page language="java" import="java.util.*,domain.User" pageEncoding="utf-8" isELIgnored="false"%>
 <%@taglib prefix="test" uri="/WEB-INF/forEach.tld" %>

   <%
    List l=new ArrayList();
    User u1=new User("zhouhr","8888");
    User u2=new User("zhouhr","8888");
    User u3=new User("zhouhr","8888");
    User u4=new User("zhouhr","8888");
  l.add(u1);  l.add(u2);  l.add(u3);  l.add(u4);
  request.setAttribute("l",l);
    %>
    <test:forEach items="${l}" var="u" varStatus="c">
     ${u.name} | ${c.count} <br />
    </test:forEach>

2.类的设计

public class ForEachTag extends SimpleTagSupport{
 private Object items;
 private String var;
 private String varStatus;
 @SuppressWarnings("unchecked")
 @Override
 public void doTag() throws JspException, IOException {
  PageContext pageCtx=(PageContext)getJspContext();
  JspFragment body=getJspBody();
  ForEachStatus status=new ForEachStatus();status.setCount(1);
  if(varStatus!=null){
   pageCtx.setAttribute(varStatus,status);
  }
  Iterator it=null;
  if(items instanceof Collection){
   it=((Collection)items).iterator();
  }else if(items instanceof Object[]){
   List<Object> list=Arrays.asList(items);
   it=list.iterator();
  }
  if(it!=null){
   while(it.hasNext()){
    Object obj=it.next();
    pageCtx.setAttribute(var,obj);
    body.invoke(pageCtx.getOut());
    status.setCount((status.getCount()+1));
   }
  }
 }
 public Object getItems() {
  return items;
 }
 public void setItems(Object items) {
  this.items = items;
 }
 public String getVar() {
  return var;
 }
 public void setVar(String var) {
  this.var = var;
 }
 public String getVarStatus() {
  return varStatus;
 }
 public void setVarStatus(String varStatus) {
  this.varStatus = varStatus;
 }
}

public class ForEachStatus {
 private int count;
 public int getCount() {
  return count;
 }
 public void setCount(int count) {
  this.count = count;
 }
}

3.WEB-INF下的forEach.tld的设计

<?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.2</tlib-version>
    <jsp-version>1.0</jsp-version>
   <short-name>test</short-name>
 <tag>
     <name>forEach</name>
     <tag-class>forEach.ForEachTag</tag-class>
     <body-content>scriptless</body-content>
     <attribute >
       <name>items</name>
       <!-- 可选true必须的 -->
       <required>true</required>
       <!-- 是否支持EL表达式 -->
      <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
      <name>var</name>
      <required>true</required>
      <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
      <name>varStatus</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
     </attribute>
   </tag>
</taglib>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值