文档章节

jsp页面使用el表达式获取静态常量值

L
 L龙志
发布于 2017/05/31 19:49
字数 522
阅读 57
收藏 0

在jsp页面中,为了避免硬编码,想办法写了一个jsp页面获取静态常量值的方法,写得不好各位大佬勿喷啊!有什么错误和不足还望帮忙指正和完善,谢谢!

主要使用的常量类:

package com.milo.base.common.constant;

public class Constants {

    private Constants() {}

    public static final Integer YES = 1;

    public static final Integer NO = 0;

    /**
     * 支付超时时间 2小时
     */
    public static final Long PAY_TIMEOUT = 2 * 60 * 60 * 1000L;

    /**
     * 支付最短失效时间间隔 5分钟
     */
    public static final Long MIN_PAY_TIME_INTERVAL = 5 * 60 *1000L;


    /**
     * 支付类型
     */
    public class PayType {
        /**
         * 支付宝
         */
        public static final String ALIPAY = "alipay";

        /**
         * 微信
         */
        public static final String WEIXIN = "weixin";
    }

}

反射获取常量值工具类:

package com.milo.base.common.constant;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

public class ConstantUtil {

    private static final Logger log = Logger.getLogger(ConstantUtil.class);

    private ConstantUtil() {}

    /**
     * 获取常量值
     * @param key
     * @return
     */
    public static Object get(String key) {
        log.info(String.format("获取常量值【key:%s】", key));

        if (StringUtils.isBlank(key)) {
            throw new IllegalArgumentException("获取常量的key不能为空");
        }

        String classPath = null;
        String fieldName = key;
        if (key.contains(".")) {
            classPath = StringUtils.substringBeforeLast(key, ".");
            fieldName = StringUtils.substringAfterLast(key, ".");
        }

        Class clazz = null;
        // 默认常量类
        if (StringUtils.isEmpty(classPath)) {
            clazz = Constants.class;
        } else {
            try {
                clazz = Class.forName(Constants.class.getName() + "$" + classPath.replace(".", "$"));
            } catch (ClassNotFoundException e) {
                log.info(String.format("【%s】不是直接在Constants内部类取的常量", key));
            }
        }

        // 带包名类,根文件夹下常量类暂不考虑
        while (null == clazz && StringUtils.contains(classPath, '.')) {
            try {
                clazz = Class.forName(classPath);
            } catch (ClassNotFoundException e) {
                String className = StringUtils.substringBeforeLast(classPath, ".");
                String innerClass = StringUtils.substringAfterLast(classPath, ".");
                classPath = className + "$" + innerClass;
            }
        }

        if (null == clazz) {
            throw new IllegalArgumentException("找不到常量类");
        }

        try {
            return clazz.getField(fieldName).get(null);
        } catch (NoSuchFieldException e) {
            throw new IllegalArgumentException("常量名不存在");
        } catch (Exception e) {
            throw new IllegalArgumentException("找不到对应常量");
        }
    }

    public static void main(String[] args) {
        System.out.println(get("PayType.WEIXIN"));
    }
}

tld文件constant.tld:

<?xml version="1.0" encoding="UTF-8"?>
<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">     
    <!-- 定义函数版本 -->  
    <tlib-version>1.0</tlib-version>  
    <!-- 定义函数名称 -->  
    <short-name>constant</short-name>
    <uri>/constant-tags</uri>
    <!-- 定义第一个函数 -->  
    <function>  
        <!-- 定义第一个函数:reverse -->  
        <name>get</name>
        <!-- 定义函数处理类 -->  
        <function-class>com.milo.base.common.constant.ConstantUtil</function-class>
        <!-- 定义函数的对应方法 -->  
        <function-signature>  
            java.lang.Object get(java.lang.String)
        </function-signature>
    </function>
</taglib>

 

使用:

jsp页面引入

<%@ taglib prefix="constant" uri="/constant-tags" %>

获取值

${constant:get("PayType.WEIXIN")}

${constant:get("YES")}

${constant:get("com.milo.base.common.constant.Constants.PayType.WEIXIN")}

<c:if test='${constant:get("PayType.WEIXIN") == item.payType}'>
    ...
</c:if>

 

© 著作权归作者所有

共有 人打赏支持
L
粉丝 0
博文 2
码字总数 534
作品 0
广州
(JavaEE-09)JSP中的MVC与三层架构

JSP开发模式 SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式 JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用...

_-Leon-_
2014/07/11
0
2
javaweb开发之EL和JSTL

一、EL 1.概述 EL 全名为Expression Language。 EL表达式可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码。 EL主要作用如下: (1)获取数据: EL表达式主要用于替换JSP页面中的...

小米米儿小
2013/12/05
0
0
JSP——Java Server Pages

简介 1. Jsp技术:Jsp是一种 html代码+ Java代码 + Jsp页面代码的技术,而且其不用像Servlet哪样需要配置访问路径。 2. Jsp执行原理:第一次访问服务器web项目中的jsp页面时,会首先把jsp页面...

江左煤郎
09/13
0
0
JavaWeb12-HTML篇笔记(二)

Ø 为什么学习JSTL: JSTL和EL结合 替换页面中<%%> Ø JSTL版本: JSTL1.0 :不支持EL表达式. JSTL1.1 和 1.2 :支持EL表达式. Ø JSTL的标签库:包含了五类标签. core(核心标签),fmt(国际化标签)...

我是小谷粒
05/28
0
0
JSP 学习总结---学习笔记

什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的对象 HttpServletResponse表示服务端到客户端的...

知止内明
04/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
1
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
2
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
12
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
0
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部