1、jsp 头部页面引入函数

jsp页面需要引入自定义fns函数声明: 
<%@ taglib prefix=”fns” uri=”/WEB-INF/tlds/fns.tld” %>,自定义的tld文件位于/WEB-INF/tlds/fns.tld 
一般需要C标签配合使用,同时引入C标签声明: 
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core” %>

2、fns.tld 代码,仿照jstl的fn函数fn.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">

<description>JSTL 1.1 functions library</description>
    <display-name>JSTL functions sys</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>fns</short-name>
    <uri>http://java.sun.com/jsp/jstl/functionss</uri>

<function>
        <description>获取开发公司名称</description>
        <name>getCompanyName</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getCompanyName()</function-signature>
        <example>${fns:getCompanyName()}</example>
    </function>

<function>
        <description>获取项目名称</description>
        <name>getProjectName</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getProjectName()</function-signature>
        <example>${fns:getProjectName()}</example>
    </function>

<function>
        <description>获取基本设置信息</description>
        <name>getSysBase</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.SysBase getSysBase()</function-signature>
        <example>${fns:getSysBase()}</example>
    </function>

<function>
        <description>获取管理路径</description>
        <name>getAdminPath</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getAdminPath()</function-signature>
        <example>${fns:getAdminPath()}</example>
    </function>
    <function>
        <description>获取网站路径</description>
        <name>getFrontPath</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getFrontPath()</function-signature>
        <example>${fns:getFrontPath()}</example>
    </function>
    <function>
        <description>获取网站URL后缀</description>
        <name>getUrlSuffix</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getUrlSuffix()</function-signature>
        <example>${fns:getUrlSuffix()}</example>
    </function>
    <function>
        <description>获取配置</description>
        <name>getConfig</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getConfig(java.lang.String)</function-signature>
        <example>${fns:getConfig(key)}</example>
    </function>
    <function>
        <description>获取常量</description>
        <name>getConst</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.Object getConst(java.lang.String)</function-signature>
        <example>${fns:getConst(key)}</example>
    </function>

<!-- UserUtils -->
    <function>
        <description>数字转换为中文字符串</description>
        <name>convertToChart</name>
        <function-class>com.jeeplus.common.utils.StringUtils</function-class>
        <function-signature>java.lang.String convertToChart(int)</function-signature>
        <example>${fns:convertToChart(digit)}</example>
    </function>
    <function>
        <description>获取当前用户对象</description>
        <name>getUser</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.User getUser()</function-signature>
        <example>${fns:getUser()}</example>
    </function>

<function>
        <description>根据编码获取用户对象</description>
        <name>getUserById</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.User get(java.lang.String)</function-signature>
        <example>${fns:getUserById(id)}</example>
    </function>

<function>
        <description>获取授权用户信息</description>
        <name>getPrincipal</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.security.SystemAuthorizingRealm.Principal getPrincipal()</function-signature>
        <example>${fns:getPrincipal()}</example>
    </function>

<function>
        <description>获取当前用户的菜单对象列表</description>
        <name>getMenuList</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>java.util.List getMenuList()</function-signature>
        <example>${fns:getMenuList()}</example>
    </function>

<function>
        <description>获取当前用户的菜单对象列表</description>
        <name>getTopMenu</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.Menu getTopMenu()</function-signature>
        <example>${fns:getTopMenu()}</example>
    </function>
    <function>
        <description>获取当前时间与指定时间的差值</description>
        <name>getTime</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>java.util.Date getTime(java.lang.String)</function-signature>
        <example>${fns:getTime(java.lang.String)}</example>
    </function>
    <function>
        <description>获取当前用户的区域对象列表</description>
        <name>getAreaList</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>java.util.List getAreaList()</function-signature>
        <example>${fns:getAreaList()}</example>
    </function>

<function>
        <description>获取当前用户的部门对象列表</description>
        <name>getOfficeList</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>java.util.List getOfficeList()</function-signature>
        <example>${fns:getOfficeList()}</example>
    </function>

<function>
        <description>获取当前用户缓存</description>
        <name>getCache</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>java.lang.Object getCache(java.lang.String, java.lang.Object)</function-signature>
        <example>${fns:getCache(cacheName, defaultValue)}</example>
    </function>

<!-- DictUtils -->
    <function>
        <description>获取字典标签</description>
        <name>getDictLabel</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getDictLabel(java.lang.String, java.lang.String, java.lang.String)</function-signature>
        <example>${fns:getDictLabel(value, type, defaultValue)}</example>
    </function>

<function>
        <description>获取字典标签(多个)</description>
        <name>getDictLabels</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getDictLabels(java.lang.String, java.lang.String, java.lang.String)</function-signature>
        <example>${fns:getDictLabels(values, type, defaultValue)}</example>
    </function>

<function>
        <description>获取字典值</description>
        <name>getDictValue</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getDictValue(java.lang.String, java.lang.String, java.lang.String)</function-signature>
        <example>${fns:getDictValue(label, type, defaultValue)}</example>
    </function>

<!--获取字典对象列表 start-->
    <function>
        <description>获取字典对象列表</description>
        <!--EL页面调用名字-->
        <name>getDictList</name>
        <!--指定标签的处理类,指定了标签由哪个Java类来处理。-->
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <!--指定EL页面调用名字中实际调用的方法.指定处理类的实际方法.参数和回调函数要写完整路径-->
        <function-signature>java.util.List getDictList(java.lang.String)</function-signature>
        <!--举例说明-->
        <example>${fns:getDictList(type)}</example>
    </function>
    <!--获取字典对象列表 end-->

<function>
        <description>获取字典对象列表</description>
        <!--EL页面调用名字-->
        <name>getDictListForQuestion</name>
        <!--指定标签的处理类,指定了标签由哪个Java类来处理。-->
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <!--指定EL页面调用名字中实际调用的方法.指定处理类的实际方法.参数和回调函数要写完整路径-->
        <function-signature>java.util.List getDictListForQuestion(java.lang.String)</function-signature>
        <!--举例说明-->
        <example>${fns:getDictListForQuestion(type)}</example>
    </function>

<!--获取字典对象列表 start-->
    <function>
        <description>获取字典对象列表</description>
        <!--EL页面调用名字-->
        <name>getDictList2</name>
        <!--指定标签的处理类,指定了标签由哪个Java类来处理。-->
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <!--指定EL页面调用名字中实际调用的方法.指定处理类的实际方法.参数和回调函数要写完整路径-->
        <function-signature>java.util.List getDictList2(java.lang.String,java.lang.String)</function-signature>
        <!--举例说明-->
        <example>${fns:getDictList2(type,keyValue)}</example>
    </function>
    <!--获取字典对象列表 end-->

<function>
        <description>获取系统常量对象列表</description>
        <!--EL页面调用名字-->
        <name>getConsList</name>
        <!--指定标签的处理类,指定了标签由哪个Java类来处理。-->
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <!--指定EL页面调用名字中实际调用的方法.指定处理类的实际方法.参数和回调函数要写完整路径-->
        <function-signature>java.util.List getConsList(java.lang.String)</function-signature>
        <!--举例说明-->
        <example>${fns:getConsList(type)}</example>
    </function>

<function>
        <description>获取系统常量对象列表-增加所有**选项</description>
        <!--EL页面调用名字-->
        <name>getConsList2</name>
        <!--指定标签的处理类,指定了标签由哪个Java类来处理。-->
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <!--指定EL页面调用名字中实际调用的方法.指定处理类的实际方法.参数和回调函数要写完整路径-->
        <function-signature>java.util.List getConsList2(java.lang.String,java.lang.String)</function-signature>
        <!--举例说明-->
        <example>${fns:getConsList2(type,keyValue)}</example>
    </function>

<function>
        <description>获取字典对象列表</description>
        <name>getDictListJson</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getDictListJson(java.lang.String)</function-signature>
        <example>${fns:getDictListJson(type)}</example>
    </function>

<function>
        <description>获取对象的属性值</description>
        <name>getValue</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getValue(java.lang.Object, java.lang.String)</function-signature>
        <example>${fns:getValue(obj, name)}</example>
    </function>

<function>
        <description>获取两级对象的属性值</description>
        <name>getObjectValue</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>java.lang.String getObjectValue(java.lang.Object, java.lang.String)</function-signature>
        <example>${fns:getObjectValue(obj, name)}</example>
    </function>

<!-- Encodes -->
    <function>
        <description>URL编码</description>
        <name>urlEncode</name>
        <function-class>com.jeeplus.common.utils.Encodes</function-class>
        <function-signature>java.lang.String urlEncode(java.lang.String)</function-signature>
        <example>${fns:urlEncode(part)}</example>
    </function>
    <function>
        <description>URL解码</description>
        <name>urlDecode</name>
        <function-class>com.jeeplus.common.utils.Encodes</function-class>
        <function-signature>java.lang.String urlDecode(java.lang.String)</function-signature>
        <example>${fns:urlDecode(part)}</example>
    </function>
    <function>
        <description>HTML编码</description>
        <name>escapeHtml</name>
        <function-class>com.jeeplus.common.utils.Encodes</function-class>
        <function-signature>java.lang.String escapeHtml(java.lang.String)</function-signature>
        <example>${fns:escapeHtml(html)}</example>
    </function>
    <function>
        <description>HTML解码</description>
        <name>unescapeHtml</name>
        <function-class>com.jeeplus.common.utils.Encodes</function-class>
        <function-signature>java.lang.String unescapeHtml(java.lang.String)</function-signature>
        <example>${fns:unescapeHtml(html)}</example>
    </function>

<!-- StringUtils -->
    <function>
        <description>从后边开始截取字符串</description>
        <name>substringAfterLast</name>
        <function-class>org.apache.commons.lang3.StringUtils</function-class>
        <function-signature>java.lang.String substringAfterLast(java.lang.String, java.lang.String)</function-signature>
        <example>${fns:substringAfterLast(str,separator)}</example>
    </function>
    <function>
        <description>判断字符串是否以某某开头</description>
        <name>startsWith</name>
        <function-class>org.apache.commons.lang3.StringUtils</function-class>
        <function-signature>boolean startsWith(java.lang.CharSequence, java.lang.CharSequence)</function-signature>
        <example>${fns:startsWith(str,prefix)}</example>
    </function>
    <function>
        <description>判断字符串是否以某某结尾</description>
        <name>endsWith</name>
        <function-class>org.apache.commons.lang3.StringUtils</function-class>
        <function-signature>boolean endsWith(java.lang.CharSequence, java.lang.CharSequence)</function-signature>
        <example>${fns:endsWith(str,suffix)}</example>
    </function>
    <function>
        <description>缩写字符串,超过最大宽度用“...”表示</description>
        <name>abbr</name>
        <function-class>com.jeeplus.common.utils.StringUtils</function-class>
        <function-signature>java.lang.String abbr(java.lang.String, int)</function-signature>
        <example>${fns:abbr(str,length)}</example>
    </function>
    <function>
        <description>替换掉HTML标签</description>
        <name>replaceHtml</name>
        <function-class>com.jeeplus.common.utils.StringUtils</function-class>
        <function-signature>java.lang.String replaceHtml(java.lang.String)</function-signature>
        <example>${fns:replaceHtml(html)}</example>
    </function>
    <function>
        <description>转换为JS获取对象值,生成三目运算返回结果。</description>
        <name>jsGetVal</name>
        <function-class>com.jeeplus.common.utils.StringUtils</function-class>
        <function-signature>java.lang.String jsGetVal(java.lang.String)</function-signature>
        <example>${fns:jsGetVal('row.user.id')}  返回:!row?'':!row.user?'':!row.user.id?'':row.user.id</example>
    </function>

<!-- DateUtils -->
    <function>
        <description>获取当前日期</description>
        <name>getDate</name>
        <function-class>com.jeeplus.common.utils.DateUtils</function-class>
        <function-signature>java.lang.String getDate(java.lang.String)</function-signature>
        <example>${fns:getDate(pattern)}</example>
    </function>
    <function>
        <description>获取过去的天数</description>
        <name>pastDays</name>
        <function-class>com.jeeplus.common.utils.DateUtils</function-class>
        <function-signature>long pastDays(java.util.Date)</function-signature>
        <example>${fns:pastDays(date)}</example>
    </function>
    <function>
        <description>将日期对象Date转为标准格式字符串yyyy-mm-dd hh:mm:ss显示</description>
        <name>formatDateTime</name>
        <function-class>com.jeeplus.common.utils.DateUtils</function-class>
        <function-signature>java.lang.String formatDateTime(java.util.Date)</function-signature>
        <example>${fns:formatDateTime(date)}</example>
    </function>
    <function>
        <description>将日期对象Date转为几小时前,几天前显示</description>
        <name>formatDateDiff</name>
        <function-class>com.jeeplus.common.utils.DateUtils</function-class>
        <function-signature>java.lang.String formatDateDiff(java.util.Date)</function-signature>
        <example>${fns:formatDateDiff(date)}</example>
    </function>
    <!-- JsonMapper -->
    <function>
        <description>对象转换JSON字符串</description>
        <name>toJson</name>
        <function-class>com.jeeplus.common.mapper.JsonMapper</function-class>
        <function-signature>java.lang.String toJsonString(java.lang.Object)</function-signature>
        <example>${fns:toJson(object)}</example>
    </function>

<function>
        <description>根据编码获取用户对象</description>
        <name>getByLoginName</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.User getByLoginName(java.lang.String)</function-signature>
        <example>${fns:getByLoginName(loginName)}</example>
    </function>

<function>
        <description>根据当前用户id获取用户头像</description>
        <name>getUserPhoto</name>
        <function-class>com.jeeplus.modules.sys.utils.UserUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.entity.User getUserPhoto(java.lang.String)</function-signature>
        <example>${fns:getUserPhoto(userId)}</example>
    </function>

<!-- 绑定学年 -->
    <function>
        <description>绑定学年</description>
        <name>getSchoolYearList</name>
        <function-class>com.jeeplus.modules.sys.utils.DictUtils</function-class>
        <function-signature>com.jeeplus.modules.sys.utils.DictUtils getSchoolYearList()</function-signature>
        <example>${fns:getSchoolYearList()}</example>  
    </function>

<function>
        <description>获取项目盘符地址</description>
        <name>getPubEnclosureDirPath</name>
        <function-class>com.jeeplus.common.config.Global</function-class>
        <function-signature>java.lang.String getPubEnclosureDirPath()</function-signature>
        <example>${fns:getPubEnclosureDirPath()}</example>
    </function>

</taglib>

3、 为表达式函数(标签函数)提供后台服务类:common.config.Global

/**
 * Copyright &copy; 2015-2020 <a href="http://www.runyu.com/">RunYu</a> All rights reserved.
 */
package com.jeeplus.common.config;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.ibatis.io.Resources;
import org.springframework.core.io.DefaultResourceLoader;

import com.ckfinder.connector.ServletContextFactory;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jeeplus.common.utils.CacheUtils;
import com.jeeplus.common.utils.PropertiesLoader;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.sys.entity.SysBase;

/**
 * 全局配置类
 * 
 * @author runyu
 * @version 2014-06-25
 */
public class Global {

/**
     * 当前对象实例
     */
    private static Global global = new Global();

/**
     * 保存全局属性值
     */
    private static Map<String, String> map = Maps.newHashMap();

/**
     * 属性文件加载对象
     */
    private static PropertiesLoader loader = new PropertiesLoader("runyu.properties");

/**
     * 显示/隐藏
     */
    public static final String SHOW = "1";
    public static final String HIDE = "0";

/**
     * 是/否
     */
    public static final String YES = "1";
    public static final String NO = "0";

/**
     * 对/错
     */
    public static final String TRUE = "true";
    public static final String FALSE = "false";

/**
     * 上传文件基础虚拟路径
     */
    public static final String USERFILES_BASE_URL = "/userFiles/";

/**
     * 上传文件基础虚拟路径
     */
    public static final String USERFILES_URL = "/admin/logo/";

/**
     * 上传图片基础虚拟路径
     */
    public static final String IMAGE_BASE_URL = "/logo/";

/**
     * 获取当前对象实例
     */
    public static Global getInstance() {
        return global;
    }

public static boolean doAuthorization = false;
    public static final String AUTHORIZATIONCACHE = "AuthorizationCache";
    public static final String AUTHORIZATIONCACHEKEY = "Authorization";

/**
     * 获取配置
     * 
     * @see ${fns:getConfig('adminPath')}
     */
    @SuppressWarnings("unchecked")
    public static String getConfig(String key) {
        // 验证拦截器是否已经被调用。如果没有被调用,抛出错误
//      System.out.println("--------------------------------------------doAuthorization:" + doAuthorization
//              + "--------------------------------------------");
//      if (doAuthorization) {
//          HashMap<String, Boolean> mapAuthorization = (HashMap<String, Boolean>) CacheUtils.get(AUTHORIZATIONCACHE,
//                  AUTHORIZATIONCACHEKEY);
//          String sdate = "";
//          Date ddate = new Date();
//          sdate = (new SimpleDateFormat("yyyyMMdd")).format(ddate);
//          System.out.println("--------------------------------------------sdate:" + sdate
//                  + "--------------------------------------------");
//          if (mapAuthorization == null) {
//              System.out.println("--------------------------------------------mapAuthorization == null:" + true
//                      + "--------------------------------------------");
//
//          } else {
//              System.out.println("--------------------------------------------mapAuthorization == null:" + false
//                      + "--------------------------------------------");
//
//          }
//          // mapAuthorization=null;
//          if (mapAuthorization == null) {
//
//              // 缓存为空时,重新调用api接口重置缓存
//              doAuthorization = false;
//              HttpUtils.RemoteAuthorizationCheck();
//              mapAuthorization = (HashMap<String, Boolean>) CacheUtils.get(AUTHORIZATIONCACHE, AUTHORIZATIONCACHEKEY);
//              doAuthorization = true;
//          }
//          System.out.println("--------------------------------------------mapAuthorization:" + mapAuthorization
//                  + "--------------------------------------------");
//
//          if (mapAuthorization.get(sdate) == null) {
//              // 缓存为空时,重新调用api接口重置缓存
//              doAuthorization = false;
//              HttpUtils.RemoteAuthorizationCheck();
//              mapAuthorization = (HashMap<String, Boolean>) CacheUtils.get(AUTHORIZATIONCACHE, AUTHORIZATIONCACHEKEY);
//              doAuthorization = true;
//              mapAuthorization = (HashMap<String, Boolean>) CacheUtils.get(AUTHORIZATIONCACHE, AUTHORIZATIONCACHEKEY);
//              System.out.println("--------------------------------------------mapAuthorization22222:"
//                      + mapAuthorization + "--------------------------------------------");
//
//              // 重置后如果仍为空,抛出错误
//              if (mapAuthorization.get(sdate) == null) {
//                  throw new NullPointerException();
//              }
//              System.out.println("--------------------------------------------result:" + mapAuthorization.get(sdate)
//                      + "--------------------------------------------");
//
//          } else {
//              System.out.println("--------------------------------------------result2:" + mapAuthorization.get(sdate)
//                      + "--------------------------------------------");
//
//              if (mapAuthorization.get(sdate) == false) {
//                  throw new NullPointerException();
//              }
//          }
//      }

String value = map.get(key);
        if (value == null) {
            value = loader.getProperty(key);
            map.put(key, value != null ? value : StringUtils.EMPTY);
        }
        return value;
    }

/**
     * 获取管理端根路径
     */
    public static String getAdminPath() {
        return getConfig("adminPath");
    }

/**
     * 获取前端根路径
     */
    public static String getFrontPath() {
        return getConfig("frontPath");
    }

/**
     * 获取URL后缀
     */
    public static String getUrlSuffix() {
        return getConfig("urlSuffix");
    }

/**
     * 是否是演示模式,演示模式下不能修改用户、角色、密码、菜单、授权
     */
    public static Boolean isDemoMode() {
        String dm = getConfig("demoMode");
        return "true".equals(dm) || "1".equals(dm);
    }

/**
     * 上传服务器IP
     */
    public static String uploadUrl() {
        String uploadUrl = getConfig("UPLOADURL");
        return uploadUrl;
    }

/**
     * 在修改系统用户和角色时是否同步到Activiti
     */
    public static Boolean isSynActivitiIndetity() {
        String dm = getConfig("activiti.isSynActivitiIndetity");
        return "true".equals(dm) || "1".equals(dm);
    }

/**
     * 页面获取常量
     * 
     * @see ${fns:getConst('YES')}
     */
    public static Object getConst(String field) {
        try {
            return Global.class.getField(field).get(null);
        } catch (Exception e) {
            // 异常代表无配置,这里什么也不做
        }
        return null;
    }

/**
     * 获取上传文件的根目录
     * 
     * @return
     */
    public static String getUserfilesBaseDir() {
        String dir = getConfig("userfiles.basedir");
        if (StringUtils.isBlank(dir)) {
            try {
                dir = ServletContextFactory.getServletContext().getRealPath("/");
            } catch (Exception e) {
                return "";
            }
        }
        if (!dir.endsWith("/")) {
            dir += "/";
        }
        // System.out.println("userfiles.basedir: " + dir);
        return dir;
    }

/**
     * 获取工程路径
     * 
     * @return
     */
    public static String getProjectPath() {
        // 如果配置了工程路径,则直接返回,否则自动获取。
        String projectPath = Global.getConfig("projectPath");
        if (StringUtils.isNotBlank(projectPath)) {
            return projectPath;
        }
        try {
            File file = new DefaultResourceLoader().getResource("").getFile();
            if (file != null) {
                while (true) {
                    File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");
                    if (f == null || f.exists()) {
                        break;
                    }
                    if (file.getParentFile() != null) {
                        file = file.getParentFile();
                    } else {
                        break;
                    }
                }
                projectPath = file.toString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return projectPath;
    }

/**
     * 获取根目录路径
     * 
     * @return
     */
    public static String getDirPath() {
        String projectPath = getProjectPath();
        Properties prop = System.getProperties();
        String os = prop.getProperty("os.name");
        if (os.startsWith("win") || os.startsWith("Win"))
            projectPath = projectPath.split(":")[0].toString() + ":\\userFiles\\";
        else
            projectPath = "/home/userFiles/";
        return projectPath;
    }

/**
     * 获取项目盘符地址
     * 
     * @return
     */
    public static String getPubEnclosureDirPath() {
        String projectPath = HttpUtils.getPubEnclosureDirPath();
        return projectPath;
    }

/**
     * 获取项目名称
     * 
     * 
     */
    public static String getProjectName() {
        String ProjectName = "";
        Gson gson = new Gson();
        String param = "";
        String json = "";

try {
            json = HttpUtils.doPost("sys/dictInterface/findBaseConfig", param);
        } catch (Exception e) {
            e.printStackTrace();
        }
        SysBase result = null;
        try {
            result = gson.fromJson(json, new TypeToken<SysBase>() {
            }.getType());

} catch (Exception e) {
            // TODO: handle exception
        }
        ProjectName = result.getProjectname().trim();
        return ProjectName;
    }

/**
     * 获取开发公司名称
     * 
     * 
     */
    public static String getCompanyName() {
        String CompanyName = "";
        Gson gson = new Gson();
        String param = "";
        String json = "";

try {
            json = HttpUtils.doPost("sys/dictInterface/findBaseConfig", param);
        } catch (Exception e) {
            e.printStackTrace();
        }
        SysBase result = null;
        try {
            result = gson.fromJson(json, new TypeToken<SysBase>() {
            }.getType());

} catch (Exception e) {
            // TODO: handle exception
        }
        CompanyName = result.getCompanyname().trim();
        return CompanyName;
    }

/**
     * 获取是否可以从网盘选择文件
     * 
     * 
     */
    public static SysBase getSysBase() {

Gson gson = new Gson();
        String param = "";
        String json = "";

try {
            json = HttpUtils.doPost("sys/dictInterface/findBaseConfig", param);
        } catch (Exception e) {
            e.printStackTrace();
        }
        SysBase result = null;
        try {
            result = gson.fromJson(json, new TypeToken<SysBase>() {
            }.getType());

} catch (Exception e) {
            // TODO: handle exception
        }

return result;
    }

/**
     * 写入properties信息
     *
     * @param key
     *            名称
     * @param value
     *            值
     */
    public static void modifyConfig(String key, String value) {
        try {
            // 从输入流中读取属性列表(键和元素对)
            Properties prop = getProperties();
            prop.setProperty(key, value);
            String path = Global.class.getResource("/runyu.properties").getPath();
            FileOutputStream outputFile = new FileOutputStream(path);
            prop.store(outputFile, "modify");
            outputFile.close();
            outputFile.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

/**
     * 返回 Properties
     * 
     * @param fileName
     *            文件名 (注意:加载的是src下的文件,如果在某个包下.请把包名加上)
     * @param
     * @return
     */
    public static Properties getProperties() {
        Properties prop = new Properties();
        try {
            Reader reader = Resources.getResourceAsReader("/runyu.properties");
            prop.load(reader);
        } catch (Exception e) {
            return null;
        }
        return prop;
    }

}

4、在jsp页面或js中使用自定义的表达式函数fns:

--------------------- 
作者:__心诺 
来源:CSDN 
原文:https://blog.csdn.net/moxiaoya1314/article/details/80483086 
版权声明:本文为博主原创文章,转载请附上博文链接!

自定义 jstl 标签 fns相关推荐

  1. 自定义 jstl 标签 fns:jsp中tld的function自定义方法扩展

    转自:  https://blog.csdn.net/FORLOVEHUAN/article/details/82623647 自定义 jstl 标签 fns: https://blog.csdn.n ...

  2. 自定义EL函数、自定义JSTL标签

    自定义EL函数 1.做一个类(静态) package com.maya.el;public class ELBiaoDaoShi {public static String TiHuan(String ...

  3. 自定义jstl标签库

    开发环境:Spring+SpringMVC +Maven +Mybatis JSTL 标签库的配置: 导入对应的 jstl.jar 和 standard.jar ,我使用的配置如下: <prop ...

  4. JSP中自定义jstl标签

    本期精彩: 之前的博客中有介绍jstl标签和EL表达式:web知识之域对象&EL表达式&JSTL标签_小阿飞_的博客-CSDN博客_web域对象JSP中,关于域对象.EL.JSTLht ...

  5. JSP之自定义jstl标签

    目录 一,什么是JSP

  6. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  7. Java-Web JSTL标签库、自定义标签库和MVC设计模式

    目录 一.JSTL标签库 1.什么是JSTL 2.JSTL标签库 3.使用taglib指令导入标签库 4.core标签库常用标签 (1)out和set (2)remove (3)url (4)if ( ...

  8. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  9. JAVAWEB开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)

    JSTL  JSTL简介: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用:   提供给Java Web开发人员一个标准通用的标签函数库   和EL ...

最新文章

  1. jquery控制只监听数字_jQuery老矣,尚能饭否
  2. 小白学python系列-(4)list
  3. .NET 项目 在 Visual Studio 各种版本间的转换
  4. 基础知识(四)Dijkstra算法
  5. 10硬盘锁怎么解除_鉴定二手iPad是否拼装,扩容,隐藏ID锁的详细方法
  6. js将时间转换为时间戳
  7. CentOS 7源码安装Apache
  8. ZXing条码扫描----竖屏解决方案
  9. 服务器上添加信任网站,如何将网站添加到信任站点
  10. Geek Uninstaller
  11. [架构之路-32]:目标系统 - 系统软件 - Linux OS用户空间程序的启动、关闭、监管 -- init进程
  12. linux mint17.2 安装fcitx输入法
  13. 个人项目——二柱子程序升级版
  14. 高中学生计算机科技创新课题,论高中计算机教学中如何培养学生的创新能力
  15. 08.甲流疫情死亡率
  16. 机械类计算机专业毕业设计题目
  17. c语言线性表写的数据库系统(数据结构)
  18. Java开发组装电脑_设计模式-组装电脑入门简单工厂
  19. NSIS制作安装包软件
  20. 汉字怎么利用计算机处理,汉字信息在计算机中的处理

热门文章

  1. 性能测试怎么做?性能测试重点和各项性能测试流程(超级详细)
  2. Socket连接与断开重连
  3. 中国国际智能产业博览会区块链高峰论坛重庆举行 区块链产业也将加快集聚发展
  4. 数据库连接对象Connection对象的获取及相关知识总结
  5. 前瞻《飞驰人生》陈一愚:变与不变是韩寒自我经历投射
  6. 【转】JAVA之动态代理
  7. ProcessExplorer使用分享
  8. 福特计划在美国销售中国制造的汽车
  9. Linux 命令行 rm 无法删除文件
  10. java学习class4