Учебник по основам синтаксиса Ognl

Java

В этой статье мы попытаемся использовать самый простой язык и примеры для ознакомления с грамматическими правилами OGNL.Основное содержание статьи относится к официальным документам.Commons.Apache.org/proper/com…

  • Эта статья в основном представляет собой введение в грамматику, а сам бой находится в следующей статье.
  • Потому что эта статья будет послеquick-fixВерсия 2.0 поддерживает преамбулу ognl, которая будет выпущена заранее

1. Введение

ognl, полное название языка объектной графической навигации (язык объектной графической навигации), собирает оператор выражения, который легко читается и выполняется в соответствии с некоторыми простыми согласованными правилами.

Например, следующее типичное выражение

"name".toCharArray()[0].numericValue.toString()

Даже если вы совсем не понимаете ognl, вы можете понять его просто обладая базовыми знаниями java, и в этом прелесть ognl (можно начать сразу после изучения кое-чего)

2. Позиционирование объекта

Обратите внимание, содержание этого раздела классифицировано мной для удобства понимания, а не официально.

Мы знаем, что в java все является объектом, поэтому наше выражение ognl должно начинаться с определенного объекта, обычно в ognl целевой объект, который необходимо выполнить, можно разделить на три категории.

  • Простые объекты: (такие как базовые типы данных, String)
  • Непростые объекты: (непростые объекты, доступ к экземпляру)
  • статический объект: (статический класс)

В грамматике гол вышеперечисленные три падежа отмечены по разным началам.

статический объект

Проще говоря, я хочу получить доступ к методу статического класса (или к члену статического класса)

@java.lang.Math

грамматические правила@Start, за которым следует полное имя класса

Случай экземпляра выглядит следующим образом, что эквивалентно вызову непосредственно в коде JavaMath.max(10, 20)

@java.lang.Math@max(10, 20)

непростой объект

Члены обычного объекта

#demo

грамматические правила#В начале следует имя объекта (указано, что этот объект должен находиться в контексте Ognl и может быть однозначно расположен в соответствии с именем объекта)

простой объект

То есть базовый тип доступа к объекту без префикса можно использовать напрямую, как показано ниже.

// 字符串的长度
"name".length()

// 数字计算
1+2

// boolean
true

3. Вызов метода

Выполнить метод целевого объекта, правила следующие

// 非基本对象的方法访问,#开头,对象与方法之间用.连接
#obj.method( 参数 )

// 静态对象的方法访问,@开头,对象与方法之间用@连接
@xxx@method( 参数 )

// 基本对象的方法访问,和非基本对象方法方式一致
"name".length()

4. Доступ для участников

Доступ к членам целевого объекта, правила следующие

// 非基本对象的成员访问,#开头,对象与成员之间用.连接
#obj.field

// 静态对象的成员访问,@开头,对象与成员之间用@连接
@xxx@field

// 基本对象的成员访问,和非基本对象成员方式一致
"name".hash

5. Коллекция

ognl имеет специальную поддержку часто используемых коллекций.

List

Используйте {} для создания списка и используйте [] для доступа к элементам индекса объекта.

Следующие средства для создания списка с тремя элементами: 1,2,3 Получить элемент с индексом 2 в списке

{1, 2, 3}[2]

Arrays

Массивы, которые можно использовать вместе с новыми

new int[] {1,2,3}

Map

#{k:v, k:v} способ создания карты

Следующее утверждение означает создание карты и получение элемента, ключ которого является именем

#{ "name" : "一灰灰Blog", "age" :  18}["name"]

6. Операторы выражений

Передняя часть представляет собой простой базовый доступ к членам, вызов метода, и есть более мощные способы использования, которые поддерживают выполнение выражений.

назначение члена

#demo.name = "一灰灰blog"

Оценка выражения

500 + 20 - 30 * 3

Тернарный оператор

"name".length() % 2 == 0 ? "偶数长度" : "奇数长度"

Поддержка коллекции

Сделано несколько упрощений для коллекций, чтобы облегчить вызов

// in 语句,判断列表中是否包含
"name" in {"name", "hello"}

// 遍历集合,获取所有的偶数
{1,2,3,4,5,6}.{? #this % 2 == 0}

// 遍历集合,获取第一个满足条件的元素
{1,2,3,4,5,6}.{^ #this % 2 == 0}

// 遍历集合,获取最后一个满足条件的元素
{1,2,3,4,5,6}.{$ #this % 2 == 0}

создание объекта

Объект может быть создан непосредственно через new, что может быть очень полезно, когда параметры целевого метода, который нам нужно выполнить, являются небазовыми типами.

// new + 完整的类名
new java.lang.String("hello world")

связанное заявление

Что такое оператор цепочки?

Немного похоже на шаблон Builder в шаблоне проектирования, я хочу выполнить ряд операций и, наконец, получить цель

Правила определения следующие, заключены в круглые скобки, разделены запятыми, выполняются последовательно, и последнее из них является целью, которую необходимо вернуть.

(step1, step2,..., result)

В сочетании с описанным выше созданием объектов можно реализовать очень мощные функции.

package git.hui;
class User {
  public String name;
  public Integer age;
}

Непосредственно создайте доступный объект пользователя.После завершения следующего выполнения непосредственно получите объект пользователя, свойства которого были инициализированы.

(#user=new git.hui.User(),  #user.name="一灰灰Blog", #user.age=18, #user)

лямбда-выражение

Это немного высококлассно. Сначала определите лямбда-выражение, а затем вызовите его с помощью предыдущего цепного метода. Ниже приведен случай факториала.

#fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(3)

II. Другое

1. серый блог:liuyueyi.github.io/hexblog

Серый личный блог, записывающий все посты блога по учебе и работе, приглашаю всех в гости

2. Заявление

Это не так хорошо, как письмо веры.Контент уже был размещен, и это чисто из семьи.Из-за ограниченных личных возможностей неизбежно будут упущения и ошибки.Если вы найдете ошибки или лучше предложения, вы можете критиковать и исправлять их.

3. Сканируйте внимание

серый блог

QrCode

планета знаний

goals