#struts2 #freemarker
#struts2 #freemarker
Вопрос:
В моем приложении struts2 я хотел бы привязать логическое свойство (назовем его fropped с помощью средства получения isFrobbed()) на моем контроллере к паре переключателей «да» и «нет» (я знаю, что я мог бы использовать флажок, но по разным причинам мы предпочли бы явное «да» и «нет»).
С помощью флажка я бы сделал что-то вроде этого:
<@s.checkbox name="frobbed" label="would you like this to be frobbed?" />
Однако с переключателями я полностью потерян. Я знаю, что есть тег struts2 с именем «radio», но я не уверен, как он используется. Например, это не работает.
<@s.radio name="frobbed" value="true" label="Please frob this object" />
<@s.radio name="frobbed" value="false" label="No frobbing, thanks." />
Я бы хотел, чтобы это было привязано к значению ‘fropped’ в контроллере, чтобы, например, когда значение равно true, автоматически выбиралась радиокнопка «да».
Есть идеи?
Ответ №1:
Этот синтаксис работает с FreeMarker для логического выбора:
<@s.radio label="" name="frob" list="#@java.util.LinkedHashMap@{true:'Frob it',false:'Leave unfrobbed'}" />
Комментарии:
1. Это работает! Но … как? Я даже не знал, что существует литерал, который создает / инициализирует объект, подобный LinkedHashMap. Не могли бы вы прислать мне ссылку на главу документации, которая охватывает это? Я не мог найти его нигде в freemarker.sourceforge.net/docs/index.html . Еще раз спасибо!
2. Онлайн-документация, которую я обнаружил до сих пор, не самая ясная по этой теме, но то, что содержится в значении атрибута list, является выражением OGNL. В документах Apache OGNL есть некоторая информация о выражениях, связанных с картами здесь commons.apache.org/proper/commons-ognl/language-guide.html
3. потрясающе: D именно то, что мне было нужно
Ответ №2:
Когда выбор является простым Да / Нет, Истина / Ложь — я предпочитаю определять варианты на месте в jsp. Что-то вроде ..
<s:radio label="Frobbed?" list="#{true:'Frob Me',false:'Leave me Frobless'}" name="frobbed" value="%{frobbed}"></s:radio>
С уважением
Комментарии:
1. Согласен; для кратких, неизменных вещей, которые не нуждаются в каком-либо тестировании, это проще.
2. Мне нравится идея сделать это таким образом, но я не смог заставить его работать с синтаксисом freemarker.
Ответ №3:
Обычно <s:radio>
тег используется со списком опций (или картой). Например, для карты ключом будут значения радио (например Boolean.TRUE
, и Boolean.FALSE
в этом случае), а значением будет метка переключателя («Frob away», «Я выбираю оставаться без frobbedless»).
<s:radio list="yesNo" name="frobbed"/>
Значением yesNo
атрибута является этот список или карта.
(Со списком вы должны предоставить объект с меткой и значением и использовать атрибуты «listKey» и «listValue» <s:radio>
. (IIRC))
Комментарии:
1. Я думаю, это сработало бы, но мне нравится идея определения хэш-карты «на лету» (как предложено в другом ответе). Есть идеи, каков синтаксис для этого в freemarker?
2. Вероятно, что-то вроде
list="%{{key: value, ...}}"
: сначала FM-разметка, затем OGNL, но мне нужно было бы ее протестировать.3. К вашему сведению, в этом формате ftl нет кубиков, но получение хэша от контроллера работает, поэтому я пока буду работать с этим. Спасибо!
4. @NobodyMan Не парься; позвольте мне проверить синтаксис этого.
5. @NobodyMan Я не мог понять, как заставить синтаксис FM и OGNL хорошо сочетаться друг с другом; это вполне может быть ограничением самого FM или того, как OGNL выбирает для оценки выражения / переменной FM.