自定义jsp标签和El表达式

   在项目中我们肯能会遇到一些EL表达式不能满足我们的需求,这时

   我们可以利用自定义表达式来完成自己所需要的功能
   下面是简单介绍一个日期的处理EL表达式,配置文件的详细介绍
   1,首先我们要在项目中建立一个.tld文件
       文件内容如下:

     <?xml version="1.0" encoding="UTF-8" ?>
     <taglib xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
       version="2.1">
    <tlib-version>1.1</tlib-version>
    <short-name>cust</short-name>
   <!--注意此uri在引用的时候要与其保持一致-->
     <uri>/cust-tags</uri>
      <!-- 配置EL表达式的function -->
    <function>
        <!--标签名称-->
        <name>fmtDate</name>
         <!--标签处理类-->
        <function-class>com.DateUtils</function-class>
          <!--标签处理方法-->
        <function-signature>java.lang.String fmtDate(java.util.Date)</function-signature>
    </function>
    
    <function>
        <name>fmtDateTime</name>
        <function-class>com.DateUtils</function-class>
        <function-signature>java.lang.String fmtDateTime(java.util.Date)</function-signature>
    </function>
</taglib>




        2,    然后编写处理类

       public class DateUtils {
         public static String fmtDate(Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            return sdf.format(date);
         }
 
         public static String fmtDateTime(Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            return sdf.format(date);
         }

      }


    3,然后页面引用

      <%@ page language="java" pageEncoding="UTF-8"%>
      <%@ taglib uri="/cust-tags" prefix="my"%>//注意此处的uri和.tld文件中的uri保持一致,“my”就是相当于一个别名
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
        <html>
           <head>
           </head>
          <body>
            <form action="" method="post">
              <table >
           <tr>
            <td>开始时间</td>
            <td><input class="text" name="startDate" value="${my:fmtDate(startDate)}" readonly/></td>
            <td>结束时间</td>
            <td><input class="text" name="endDate" value="${my:fmtDate(endDate)}" readonly/></td>
        </tr>
      </table>
    </form>
  </body>
</html>

 

 ---------------------------------------------------------------------------------------------------


 下面介绍一下自定义jsp中的标签,
  由于下面定义了好几种标签建议大家
  一个自定义标签请先看这个标签的配置,然后看处理类,然后看jsp
 
 1,首先建立一个.tld文件
    文件内容如下:
    <taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

    <tlib-version>1.1</tlib-version>
    <short-name>cust</short-name>
    <uri>/cust-tags</uri>
         <!--1,生成一个表格,标签的属性有text,percent,width,看完配置,请大家看下面的处理类-->
    <tag>
                <!--标签名字-->
        <name>navigation</name>
                <!--标签处理类-->
        <tag-class>com.NavigateTag</tag-class>
                <!--tag标签中的内容
                  例:<my:navigation>标签体</my:navigation>
                      (1)empty:表示没有标签体
                      (2)JSP:表示标签体可以包含JSP代码
                       (3)scriptless:表示标签体可以包含EL表达式
                        和JSP动作元素,但不能包含JSP的脚本元
                      (4)tagdependent:表示标签体交由标签本身去解析处理。
                        即在标签体中所写的任何代码都会原封不动地传给标签处理器-->
        <body-content>empty</body-content>
                <!--标签的属性,就像input标签的type,name属性一样
                 有几个属性,配置几个Attribute就行-->
        <attribute>
                         <!--属性的名字-->
            <name>percent</name>
             <!--是否是必填属性-->
            <required>false</required>
                         <!--是否支持运行时取值,下面会详细介绍-->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>width</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>text</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
        
        <!--2,checkBox的默认选中-->
    <tag>
        <name>checked</name>
        <tag-class>com.MultiCheckTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>curVal</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>list</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>compare</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>text</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

        
    <!--3,错误信息的展示-->
    <tag>
        <!-- 标签名字 -->
        <name>errInfo</name>
        <!-- 标签处理类 -->
        <tag-class>com.ErrInfoTag</tag-class>
        
        <body-content>empty</body-content>
        <attribute>
            <name>key</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
    </tag>



         <!--4,隐藏一些按钮,或者特殊权限才会显示出来的内容,这里是一个权限,
              首先页面上在标签内action属性表示这个动作所要执行的action,然后处理类中取出
           Seesion中的权限列表,两者比较如果包含就代表有权限,就会展示内容,否则跳过-->
    <tag>
        <name>privShow</name>
        <tag-class>net.beifeng.mobile_scm.web.PrivShowTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>action</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
            
        </attribute>
    </tag>
   </taglib>

       





  2,标签的处理类
      (1)生成一个table表格
  public class NavigateTag extends SimpleTagSupport {
    //这里的字段与配置文件中配置的属性一致,设置set方法,保证值可以传入
    private int percent = 100;
    private int width = 1000;
    private String text;
    private String widthType = "percent";

    public void setPercent(int percent) {
        this.percent = percent;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void setWidth(int width) {
        this.widthType = "width";
        this.width = width;
    }

    @Override
    public void doTag() throws JspException, IOException {
        JspWriter out = getJspContext().getOut();
        String tableWidth = this.widthType.equals("percent") ? (percent + "%")
                : width + "";
        out.print("<table width='" + tableWidth
                + "' border='0' cellspacing='0'"
                + " cellpadding='0' align='center'><tr>");
        out.print("<td class='navTd1'></td>");
        out.print("<td class='navTd2'>" + text + "</td>");
        out.print("<td class='navTd3'></td></tr></table>");
    }

}
      




  (2)checkbox的选中
   public class MultiCheckTag extends SimpleTagSupport {

    private Object curVal;
    private Object[] list;
    private Object compare;
    private String text = "checked";

    public void setCurVal(Object curVal) {
        this.curVal = curVal;
    }

    public void setList(Object[] list) {
        this.list = list;
    }

    public void setText(String text) {
        this.text = text;
    }

    public void setCompare(Object compare) {
        this.compare = compare;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if (list != null && list.length > 0) {
            for (int i = 0; i < list.length; i++) {
                if (curVal.equals(list[i])) {
                    getJspContext().getOut().print(" " + text + " ");
                    break;
                }
            }
        } else if (compare != null) {
            if (curVal.equals(compare)) {
                getJspContext().getOut().print(" " + text + " ");
            }
        }
    }
}




(3)错误信息展示(errMap是由后端发送到前台的参数,是一个map集合,key与标签的属性中的key值一致,然后value里面记录着错误信息,在这里取出,然后展示在页面上)
  public class ErrInfoTag extends TagSupport {

    private static final long serialVersionUID = -6965422265190706575L;

    private String key;

    public void setKey(String key) {
        this.key = key;
    }

    @SuppressWarnings("unchecked")
    @Override
    public int doStartTag() throws JspException {
        Map<String, String> errMap = (Map<String, String>) this.pageContext
                .getRequest().getAttribute("errMap");
        if (errMap != null) {
            String errMess = errMap.get(key);
            if (errMess != null) {
                try {
                    this.pageContext.getOut().print(
                            "<span style='color:red'>" + errMess + "</span>");
                } catch (IOException e) {
                    throw new JspException(e);
                }
            }
        }
        return SKIP_BODY;
    }

}
         




 (4)html内容是否显示出来
   public class PrivShowTag extends TagSupport {
    private String action;
    @Override
    public int doStartTag() throws JspException {
        // TODO Auto-generated method stub
        if(action != null){
            Set<String> actionList = (Set<String>)this.pageContext.getSession()
                        .getAttribute("actionList");
            if(actionList.contains(action)){
                //执行包含的标签体
                return EVAL_BODY_INCLUDE;
            } else {
                //跳过标签体
                return SKIP_BODY;
            }
        }
        return super.doStartTag();
    }
    public String getAction() {
        return action;
    }
    public void setAction(String action) {
        this.action = action;
    }
    
}






  3,jsp页面的引用

      <%@ page language="java" pageEncoding="UTF-8"%>
      <%@ taglib uri="/cust-tags" prefix="my"%>//注意此处的uri和.tld文件中的uri保持一致,“my”就是相当于一个别名
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
        <html>
           <head>
           </head>
          <body>
            <my:navigation text="测试自定义标签1---navigation" percent="90"/>

             <!--2,测试默认选中,值自己改变-->
            <c:forEach items="${roleList}" var="role">
              <input type="checkbox" name="acc.IdList" value="${role.Id}"
                <my:checked curVal="${role.Id}" list="${acc.IdList}"/>
              />${role.roleName}
            </c:forEach>

           
            <!--3,错误信息展示,注意key属性的值与map集合中的key保持一致-->
            <my:errInfo key="nullRole"/>

            <!--4,设置一段html是否展示,符合条件展示,不符合条件不展示-->
             
                 <my:privShow action="mobStockIn_check.do">
                    <span style="color:gray">审核</span>
                  </my:privShow>
     </body>
   </html>


















----------------------------------------------------------------------------------------
关于自定义标签更详细的介绍,参考一下网站:http://blog.csdn.net/qq_33396462/article/details/52237713         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值