让JFinal Enjoy 支持中文方法

JFinal 模板引擎目前不支持中文方法,但是有些计算公式业务场景,可能需要用中文方法名 对 业务人员较为友好。

需要更改源代码 @JFinal,代码如下:

仅需修改一个类的两行代码即可实现。

com.jfinal.template.stat.CharTable


image.png


image.png


/**
 * Copyright (c) 2011-2021, James Zhan 詹波 (jfinal@126.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.template.stat;

/**
 * CharTable 空间换时间优化字符判断性能
 * 负值参数强转 char 会自动变正值,无需判断负值数组下标
 * isLetter(EOF) 不会下标越界
 */
public class CharTable {

    private static final char[] letterChars = buildLetterChars();
    private static final char[] letterOrDigitChars = buildLetterOrDigitChars();
    private static final char[] exprChars = buildExprChars();
    private static final char NULL = 0;
    private static final char SIZE = Character.MAX_VALUE;
//    private static final char SIZE = 128;

    private CharTable() {
    }

    private static char[] createCharArray() {
        char[] ret = new char[SIZE];
        for (char i = 0; i < SIZE; i++) {
            ret[i] = NULL;
        }
        //把中文汉字输入数组
        addChinese(ret);
        return ret;
    }

    public static void addChinese(char[] ret) {
        int a = (int) (4 * Math.pow(16, 3) + 14 * Math.pow(16, 2));
        int b = (int) (9 * Math.pow(16, 3) + 15 * Math.pow(16, 2) + 10 * Math.pow(16, 1)) + 5;
        for (int i = a; i <= b; i++) {
            ret[(char) i] = (char) i;
        }
    }

    public static boolean isExprChar(char c) {
        return c < SIZE && exprChars[c] != NULL;
    }


    private static char[] buildLetterChars() {
        char[] ret = createCharArray();
        for (char i = 'a'; i <= 'z'; i++) {
            ret[i] = i;
        }
        for (char i = 'A'; i <= 'Z'; i++) {
            ret[i] = i;
        }
        ret['_'] = '_';            // 包含下划线字符 '_'

        return ret;
    }

    private static char[] buildLetterOrDigitChars() {
        char[] ret = buildLetterChars();
        for (char i = '0'; i <= '9'; i++) {
            ret[i] = i;
        }
        return ret;
    }

    private static char[] buildExprChars() {
        char[] ret = createCharArray();
        ret['\t'] = '\t';
        ret['\n'] = '\n';
        ret['\r'] = '\r';
        for (char i = ' '; i <= '}'; i++) {
            ret[i] = i;
        }

        ret['#'] = NULL;
        ret['$'] = NULL;
        ret['@'] = NULL;
        ret['\\'] = NULL;
        ret['^'] = NULL;
        ret['`'] = NULL;

        return ret;
    }

    public static boolean isLetter(char c) {
        return c < SIZE && letterChars[c] != NULL;
    }
    public static boolean isLetterOrDigit(char c) {
        return c < SIZE && letterOrDigitChars[c] != NULL;
    }

    public static boolean isDigit(char c) {
        return c >= '0' && c <= '9';
    }

    public static boolean isBlank(char c) {
        return c == ' ' || c == '\t';                                // \t\r\u000C
    }

    public static boolean isBlankOrLineFeed(char c) {
        return c == ' ' || c == '\t' || c == '\r' || c == '\n';        // \t\r\n\u000C
    }

    public static boolean isHexadecimalDigit(char c) {
        return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
    }

    public static boolean isOctalDigit(char c) {
        return c >= '0' && c <= '7';
    }

}


评论区

zhangtianxiao

2020-09-27 16:21

收藏点赞666

JFinal

2020-09-27 19:51

这个改进很牛逼,一定要充分测试

小徐同学

2020-09-28 00:32

@JFinal 初步测试没问题,明天实际跑一下业务。

canca

2020-09-28 16:12

@小徐同学 试试繁体字,和一些生僻字。

JFinal

2020-09-28 21:54

尽快多测试用一用,如果没问题,我会在新版本中引入一个配置,支持中文

JFinal

2020-10-01 23:25

@小徐同学 该功能已被添加到新版本,配置方法如下:
Engine.setChineseExpression(true);

注意要在 addSharedFunction 之前配置