让JFinal Enjoy 支持中文方法

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

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

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

  1. com.jfinal.template.stat.CharTable


image.png


image.png


  1. /**
  2.  * Copyright (c) 2011-2021, James Zhan 詹波 (jfinal@126.com).
  3.  * <p>
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * <p>
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * <p>
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16.  
  17. package com.jfinal.template.stat;
  18.  
  19. /**
  20.  * CharTable 空间换时间优化字符判断性能
  21.  * 负值参数强转 char 会自动变正值,无需判断负值数组下标
  22.  * isLetter(EOF) 不会下标越界
  23.  */
  24. public class CharTable {
  25.  
  26.     private static final char[] letterChars = buildLetterChars();
  27.     private static final char[] letterOrDigitChars = buildLetterOrDigitChars();
  28.     private static final char[] exprChars = buildExprChars();
  29.     private static final char NULL = 0;
  30.     private static final char SIZE = Character.MAX_VALUE;
  31. //    private static final char SIZE = 128;
  32.  
  33.     private CharTable() {
  34.     }
  35.  
  36.     private static char[] createCharArray() {
  37.         char[] ret = new char[SIZE];
  38.         for (char i = 0; i < SIZE; i++) {
  39.             ret[i] = NULL;
  40.         }
  41.         //把中文汉字输入数组
  42.         addChinese(ret);
  43.         return ret;
  44.     }
  45.  
  46.     public static void addChinese(char[] ret) {
  47.         int a = (int) (4 * Math.pow(16, 3) + 14 * Math.pow(16, 2));
  48.         int b = (int) (9 * Math.pow(16, 3) + 15 * Math.pow(16, 2) + 10 * Math.pow(16, 1)) + 5;
  49.         for (int i = a; i <= b; i++) {
  50.             ret[(char) i] = (char) i;
  51.         }
  52.     }
  53.  
  54.     public static boolean isExprChar(char c) {
  55.         return c < SIZE && exprChars[c] != NULL;
  56.     }
  57.  
  58.  
  59.     private static char[] buildLetterChars() {
  60.         char[] ret = createCharArray();
  61.         for (char i = 'a'; i <= 'z'; i++) {
  62.             ret[i] = i;
  63.         }
  64.         for (char i = 'A'; i <= 'Z'; i++) {
  65.             ret[i] = i;
  66.         }
  67.         ret['_'] = '_';            // 包含下划线字符 '_'
  68.  
  69.         return ret;
  70.     }
  71.  
  72.     private static char[] buildLetterOrDigitChars() {
  73.         char[] ret = buildLetterChars();
  74.         for (char i = '0'; i <= '9'; i++) {
  75.             ret[i] = i;
  76.         }
  77.         return ret;
  78.     }
  79.  
  80.     private static char[] buildExprChars() {
  81.         char[] ret = createCharArray();
  82.         ret['\t'] = '\t';
  83.         ret['\n'] = '\n';
  84.         ret['\r'] = '\r';
  85.         for (char i = ' '; i <= '}'; i++) {
  86.             ret[i] = i;
  87.         }
  88.  
  89.         ret['#'] = NULL;
  90.         ret['$'] = NULL;
  91.         ret['@'] = NULL;
  92.         ret['\\'] = NULL;
  93.         ret['^'] = NULL;
  94.         ret['`'] = NULL;
  95.  
  96.         return ret;
  97.     }
  98.  
  99.     public static boolean isLetter(char c) {
  100.         return c < SIZE && letterChars[c] != NULL;
  101.     }
  102.     public static boolean isLetterOrDigit(char c) {
  103.         return c < SIZE && letterOrDigitChars[c] != NULL;
  104.     }
  105.  
  106.     public static boolean isDigit(char c) {
  107.         return c >= '0' && c <= '9';
  108.     }
  109.  
  110.     public static boolean isBlank(char c) {
  111.         return c == ' ' || c == '\t';                                // \t\r\u000C
  112.     }
  113.  
  114.     public static boolean isBlankOrLineFeed(char c) {
  115.         return c == ' ' || c == '\t' || c == '\r' || c == '\n';        // \t\r\n\u000C
  116.     }
  117.  
  118.     public static boolean isHexadecimalDigit(char c) {
  119.         return (>= '0' && c <= '9') || (>= 'A' && c <= 'F') || (>= 'a' && c <= 'f');
  120.     }
  121.  
  122.     public static boolean isOctalDigit(char c) {
  123.         return c >= '0' && c <= '7';
  124.     }
  125.  
  126. }


评论区

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 之前配置

热门分享

扫码入社