Поддержка динамических и переведенных заголовков в Apache Tiles

У меня есть проект Spring MVC, в котором используются плитки Apache. Я реализовал так, чтобы заголовки можно было прочитать из источника сообщения следующим образом:

<tiles-definitions>    
    <definition name="some-definition" extends="public.base">
        <put-attribute name="title" value="some-definition.title" cascade="true" />
    </definition>
</tiles-definitions>

И в моем файле шаблона (определенном public.base) я делаю следующее:

<title><spring:message text="" code="${title}" /></title>

Теперь это отлично работает для статических переведенных заголовков, но я также хочу поддерживать динамические заголовки, например. для отображения названия компании. Я мог бы сделать это так:

<tiles-definitions>    
    <definition name="some-definition" extends="public.base">
        <put-attribute name="title" expression="${company.name}" />
    </definition>
</tiles-definitions>

А потом просто вывести заголовок в моем шаблоне вот так: <c:out value="${title}" />. Однако проблема в том, что мой код ломается, потому что значение атрибута title больше не является ключом сообщения. Я хочу иметь возможность поддерживать следующие сценарии:

  1. Статические заголовки, например. "О нас"
  2. Чисто динамические заголовки, например. "${компания.название}"
  3. Динамические заголовки с переведенным содержанием, например. "Добро пожаловать в ${company.name}"

В идеале я мог бы использовать язык выражений в источнике сообщений, но не смог заставить его работать. Я довольно много экспериментировал с различными решениями, но не могу найти достойного. Если бы я мог использовать язык выражений в своем источнике сообщений, это было бы легко. Например, можно ли как-то сделать следующее?

some-definition.title = Hello there, ${company.name}

И в моем шаблоне:

<spring:message text="" code="some-definition.title" var="test" />
<c:out value="${test}" />

Вышеприведенное не работает, так как выводит ${company.name}, а не фактическое содержимое переменной. Есть ли способ заставить что-то подобное работать? Или есть ли какие-либо другие способы, которыми я могу поддерживать сценарии, перечисленные выше?

Я думал о создании пользовательского тега JSTL, в котором я бы анализировал строковое выражение в простом коде Java (строка, которая была переведена), но я понял, что мне, вероятно, придется явно указать корневой объект для «замены переменной» для работы , как описано здесь. Тогда это не кажется таким динамичным решением.

Есть ли способ, которым я могу выполнить эту задачу? Любая помощь высоко ценится!


person ba0708    schedule 07.04.2015    source источник
comment
Привет, Энди, я использую Thymeleaf (с плитками), и ваш вопрос напоминает мне о том, как мне впервые приходится иметь дело с сообщениями: thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#messages   -  person Leandro Carracedo    schedule 07.04.2015
comment
Спасибо за ссылку, @PatrickLC. Вы правы в том, что вы обычно делаете это так, и я поступал так в прошлом. Однако я все еще не уверен, как это сделать в моем конкретном случае без необходимости явно передавать параметры при переводе текста. Возможно, даже невозможно сделать то, что я хочу, я не уверен.   -  person ba0708    schedule 07.04.2015


Ответы (3)


поможет ли вообще локализация определений тайлов? ссылка http://tiles.apache.org/framework/tutorial/advanced/l10n.html

в противном случае я бы посмотрел на ViewPreparer, который расширяет для вас весенние сообщения.

person mck    schedule 12.04.2015
comment
Локализованные определения плиток помогают, если мои заголовки не содержат динамического содержимого. Раньше я думал о попытке реализовать ViewPreparer, и это может быть выходом. Спасибо вам за ваши предложения! - person ba0708; 15.04.2015

Определение плитки может определять атрибут с именем «controllerClass». Этот класс должен реализовывать интерфейс org.apache.struts.tiles.Controller, а его переопределенный метод execute() вызывается перед визуализацией определения плитки.

Метод execute имеет доступ для чтения/записи к парам "имя-значение" атрибута плитки, а также к объекту HttpServletRequest. Вы можете найти свой атрибут и динамически изменить значения или заменить его полустатическим значением из файла свойств.

<definition name="some-definition" extends="public.base" controllerClass="pkgName.CustomController">
        <put-attribute name="title" expression="${company.name}" />
    </definition>

И затем в вашем классе CustomController вы можете изменить атрибуты

public class CustomController implements Controller{
       public void execute(ComponentContext tileContext,
            HttpServletRequest request, HttpServletResponse response,
            ServletContext servletContext) throws ServletException, IOException {       
          String attrName = (String)tileContext.getAttribute("title");
          String attrVal = request.getAttribute("pageTitle"); //get a dynamic value or else retrieve from a resource bundle
          tileContext.putAttribute(attrName,attrVal);
    }

    public void perform(ComponentContext tileContext,
            HttpServletRequest request, HttpServletResponse response,
            ServletContext servletContext) throws ServletException, IOException {
        execute(tileContext, request, response, servletContext);
    }
}
person ramp    schedule 16.04.2015

Вы не можете использовать Tiles для этого, просто используйте Spring-Model:

В контроллере:

@RequestMapping(value = { "/page1" }, method = RequestMethod.GET)
public String page1() {
    model.addAttribute("titre_page", messageSource.getMessage("home.hello", null,null)
}

В layout.jsp:

...
<title>${titre_page}</title>
...
<tiles:insertAttribute name="body" />
....
person question_maven_com    schedule 26.01.2017