Дополнение OGNL / Тип принуждения - PullRequest
3 голосов
/ 15 июня 2011
%{control.current + #displayRows}

- в конечном счете, заявление, которое мне нужно выполнить.У меня есть это в теге s: if, и я использую test, чтобы увидеть, находится ли это значение в определенном диапазоне.

В конечном счете, я получаю конкатенацию строк, а не сложение, потому что обе стороны сложения не рассматриваются как числовыетипы по OGNL.Немного повозившись, я вижу, что

%{control.current + control.current}

действительно приводит к числовому сложению, так что действительно значение displayRows, которое было установлено в теге s: set ранее, считается нечисловым значением.Вот мой тег s: set:

<s:set name="displayRows" value="%{#application['app_settings'].settings['MAX ACCESS FIELD TITLES ROWS']}" />

Настройки представляют карту в Java.Принимая во внимание, что ключ всегда является строкой ... ну ... значение не всегда является целым числом, потому что хранятся различные настройки приложения.Поэтому лучшее, что мы можем сделать для типа значения, это Object.И я считаю, что это проблема.OGNL не считает это чем-то, что может быть автоматически преобразовано в числовой тип.

Я ознакомился с руководством по языку на http://incubator.apache.org/ognl/language-guide.html, которое объясняет некоторые из этих концепций, но я не вижу способа сказать OGNL: «Да, этот displayRows, который содержит значение 15, ДЕЙСТВИТЕЛЬНО, являетсяцелое».Есть ли способ, чтобы это произошло?Мне нужно иметь возможность делать дополнения на лету, чтобы я не мог создавать дополнительные атрибуты в Javaland, чтобы помочь мне.Я посмотрел на OGNL, тег s: set и уровень Java, и не вижу подходящего места, где я мог бы это осуществить.

1 Ответ

6 голосов
/ 15 июня 2011

Struts считает, что #displayRows является строкой, когда нам нужно это как целое число (я предполагаю, что целое число вы сможете применить к любому встроенному типу).

Первое включение статического методадоступ в struts.xml.

Для справки вот мой struts.xml, последний константный тег - это то, что вам нужно добавить к своему:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.ui.theme" value="simple" />
    <constant name="struts.date.format" value="0,date,dd.MM.yyyy"/>
    <constant name="format.date" value="{0,date,dd.MM.yyyy}"/>
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> 
</struts>

Затем в вашем JSP выЯ сделаю что-то вроде:

<s:property value='@java.lang.Integer@valueOf("123") + @java.lang.Integer@valueOf("123")' />

, который отображает: 246

Возможно, было бы лучше сделать преобразование в теге set:

<s:set name="displayRows" value="@java.lang.Integer@valueOf(#application['app_settings'].settings['MAX ACCESS FIELD TITLES ROWS'])" />

тогда,

<s:property value="control.current + #displayRows"/>

будет вести себя как ожидалось.

...