В этой статье мы попытаемся использовать самый простой язык и примеры для ознакомления с грамматическими правилами 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. Заявление
Это не так хорошо, как письмо веры.Контент уже был размещен, и это чисто из семьи.Из-за ограниченных личных возможностей неизбежно будут упущения и ошибки.Если вы найдете ошибки или лучше предложения, вы можете критиковать и исправлять их.
- Адрес вейбо:Блог Маленького Серого
- QQ: серо-серый / 3302797840
3. Сканируйте внимание
серый блог
планета знаний