jsp自定义标签、EL自定义方法

平时开发经常用到token,我们会通过ajax请求把数据在放到jsp页面的隐藏标签里面。这时自定义标签的好处就体现出来了。页面直接使用token标签,并且会获取得到后台的值。


jsp自定义标签、EL自定义方法_第1张图片


建立tld约束配置

tld其作用一般是在web项目中。jstl、c标签等用于有效性判断、权限判断等方面,对前端的一些页面标签起到约束、限制的作用。

MyTag.tld



<taglib>
    <tlib-version>1.0tlib-version>
    <jsp-version>1.2jsp-version>
    <short-name>MyTagshort-name> 
    <uri>/MyTaguri>     

    <tag>
        <name>tokenname>
        <description>token标签description>
        <body-content>emptybody-content> 
        <tag-class>tag.Tokentag-class> 
    tag>
taglib>   

web.xml 里面增加映射


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>JspTagDefineddisplay-name>

    
    <jsp-config>
        <taglib>
            <taglib-uri>/MyTagtaglib-uri>
            <taglib-location>/MyTag.tldtaglib-location>
        taglib>
    jsp-config>

web-app>

Token的实现类

继承SimpleTagSupport

public class Token extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        //使用随机数模拟token
        String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
        //放到session中,方便登录校验
        ((PageContext) this.getJspContext()).getSession().setAttribute("token", token);
        //写到隐藏的input里面
        JspWriter out = ((PageContext) this.getJspContext()).getOut();
        out.print("">");
        out.print("你的token为:" + token);
    }

}

Jsp页面使用

引入映射到web.xml的路径

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="MyTag" uri="/MyTag"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
    <MyTag:token />

body>
html>

结果:

页面里面有隐藏的input标签
jsp自定义标签、EL自定义方法_第2张图片

EL自定义方法

平时后台获取数据到页面上,经常会有空字符串或者空值。以及对很多的数据代号进行字典转化,一个个写c:if也行,每个页面都会重复一份,贼恶心。使用el自定义方法进行字典转化,后台只需要维护一份就可以了。

新建Function.tld


<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <description>自定义方法description>
    <tlib-version>1.0tlib-version>
    <short-name>fnsshort-name>


    <function>
        <description>判断是否为空返回true or falsedescription>
        <name>isNullname>
        <function-class>tag.Functionfunction-class>
        <function-signature>
        java.lang.boolean isNull(java.lang.String)
        function-signature>
        <example>${fns:isNull(str)}example>
    function> 

    <function>
        <description>字典转换description>
        <name>changename>
        <function-class>tag.Functionfunction-class>
        <function-signature>
        java.lang.String change(java.lang.String)
        function-signature>
        <example>${fns:change(str)}example>
    function>

taglib>

标签:返回类型 方法名 参数类型

实际处理类Function

/** 
 * @author: 07
 * @date: 2017年9月12日 下午2:25:39 
 * @version 1.0
 * @parameter test
 * @return  
 */
public class Function {
    /** 判断字符串是否为空 */
    public static boolean isNull(String str){
        if(str ==null || "".equals(str)){
            return true;
        }else{
            return false;
        }
    }
    public static String change(String string){
        String str=null;
        switch (string) {
        case "R":
            str="无卡快捷";
            break;
        case "Q":
            str="QQ钱包";
            break;
        case "Z":
            str="支付宝支付";
            break;
        default:
            break;
        }
        return str;

    }
}

页面调用:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="MyTag" uri="/MyTag"%>

<%@ taglib prefix="fns" uri="/Function.tld"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
    <MyTag:token />
    <br>
    <span>文本判断内容:${fns:isNull('')}span>
    <br>
    <span>字典转换:${fns:change('Q') }span>
    <br>
    <c:out value="hello">c:out>

body>
html>

结果:
jsp自定义标签、EL自定义方法_第3张图片


细心的小伙伴们会发现,自定义标签的引入和自定义方法的引入为什么不一样,都是tld约束。

<%@ taglib prefix="MyTag" uri="/MyTag"%>

<%@ taglib prefix="fns" uri="/Function.tld"%>

后者相当于直接引用本地项目中的tld,前者通过web再映射到MyTag.tld,只是写法上的差异。
后者相当省事,不用注册。但是碰到要本项目提供给其他项目使用约束的时候就必须得映射了。

后面附上代码:github地址。

你可能感兴趣的:(Jsp)