Spring темы с Hibernate путем реализации класса ThemeSource Spring - PullRequest
2 голосов
/ 26 сентября 2011

Кто-нибудь знает, как использовать собственный ThemeSource весной?Я видел много примеров того, как использовать темы с файлами свойств, используя ResourceBundleThemeSource.Тем не менее я ничего не видел о том, как использовать hibernate для хранения различных свойств (например, одного свойства css), чтения свойств с помощью пользовательского ThemeSource и возможности использовать теги темы Spring в jsp.

Я знаю, что могу создать контроллер и получить эти свойства из базы данных с помощью hibernate, но мне больше интересно узнать, как это сделать с помощью реализации ThemeSource в Spring.

Если у кого-то есть какие-либо идеи или примеры, я был бы признателен за это..

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Чтобы использовать темы в своем веб-приложении, необходимо настроить реализацию интерфейса org.springframework.ui.context.ThemeSource.Чтобы использовать пользовательскую реализацию ThemeSource, вы можете зарегистрировать бин в контексте приложения с зарезервированным именем themeSource.Контекст веб-приложения автоматически обнаруживает бин с этим именем и использует его.

Вот интерфейс ThemeSource:

package org.springframework.ui.context;

public interface ThemeSource {
    Theme getTheme(String themeName);
}

Единственный темный конь здесь - это тип Theme,который на самом деле является не чем иным, как:

package org.springframework.ui.context;

public interface Theme {
    String getName();
    MessageSource getMessageSource();
}

И на самом деле уже есть удобная реализация типа Theme из Spring => SimpleTheme

Обратите внимание, чтоThemeSource ожидает a SpringS MessageSource , что означает, что атрибуты темы, которые хранятся в базе данных, в вашем случае, должны быть "преобразованы" для использования с MessageSource интерфейсом,

Вы можете либо написать свой DatabaseDrivenMessageSource, либо просто взять его из здесь

Теперь, имея все эти переменные на месте, вот пользовательский DatabaseThemeSource(это станет themeSource bean):

public class DatabaseThemeSource implements ThemeSource {

    private YourThemeDao themeDao;

    public Theme getTheme( String themeName ) {

        if (themeName == null) { return null; }

        MessageSource messageSource = new DatabaseDrivenMessageSource( themeDao );

        theme = new SimpleTheme( themeName, messageSource );

        return theme;
    }

    // init your themeDao
}
1 голос
/ 11 октября 2011

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

Каждый запрос на ваш сайт будет нуждаться в вашей теме, но хотите ли вы, чтобы каждый запрос попадал в вашу базу данных, просто чтобы посмотреть некоторые цвета? Темы обычно не очень большие и меняются не очень часто. Таким образом, они являются хорошим кандидатом для загрузки в память и хранения их там. Это то, что мы делаем с сайтом, который мы запускаем, мы храним около 50 тем в памяти, которые загружаются из Hibernate при запуске. Это делает обслуживание запросов к теме очень быстрым.

Основной класс - это, конечно, ваш компонент DatabaseThemeSource, который реализует ThemeSource. Если у вас есть доступная библиотека кеша, такая как Ehcache, вы можете использовать ее, но у большинства людей довольно мало тем, и для этого кеша подойдет простой Map. Мы используем что-то вроде этого:

@Component("themeSource")
public class DatabaseThemeSource implements ThemeSource {

    @Autowired
    ThemeDAO themeDAO;

    private final Map<String, Theme> themeCache;


    public DatabaseThemeSource() {
        themeCache = new HashMap<String, Theme>();
    }

    /**
     * @see org.springframework.ui.context.ThemeSource#getTheme(java.lang.String)    
     */
    @Override
    public Theme getTheme(String themeName) {
        if (themeName == null) {
            return null;
        }
        Theme theme = themeCache.get(themeName);
        if (theme == null) {
            Theme theme = themeDAO.getTheme(themeName);
            if (theme != null) {
                MessageSource messageSource = new ThemeMessageSource(theme);
                theme = new SimpleTheme(themeName, messageSource);
                synchronized (this.themeCache) {
                    themeCache.put(themeName, theme);
                }
            }
        }
        return theme;
    }

    /**
     * Clears the cache of themes. This should be called whenever the theme is updated in the database.
     */
    public void clearCache() {
        synchronized (this.themeCache) {
            themeCache.clear();
        }
    }
}

Затем вам нужно реализовать MessageSource, который содержит все отдельные компоненты вашей темы. Стоит скопировать отдельные элементы вашей темы из объекта Hibernate в выделенный MessageSource, чтобы у вас не возникало проблем с закрытыми сеансами Hibernate, исключениями LazyLoadingException и т. Д. Это также более эффективно, поскольку вы можете создать необходимый MessageFormat объекты только один раз вместо того, чтобы делать это при каждом запросе:

public class ThemeMessageSource extends AbstractMessageSource {

    private final Map<String, MessageFormat> messages;

    public ThemeMessageSource(Theme theme) {
        messages = new HashMap<String, MessageFormat>();
        messages.put("heading1", createMessageFormat(theme.getHeading1(), null));
        messages.put("heading2", createMessageFormat(theme.getHeading2(), null));
        messages.put("colour1", createMessageFormat(theme.getColour1(), null));
        messages.put("colour2", createMessageFormat(theme.getColour2(), null));
    }

    public ThemeMessageSource(Map<String, MessageFormat> messages) {
        this.messages = messages;
    }

    @Override
    protected MessageFormat resolveCode(String code, Locale locale) {
        return messages.get(code);
    }

}

Конечным результатом является то, что это быстро. Все ваши темы хранятся в памяти, и к элементам тем можно быстро получить доступ посредством простого поиска Map. Мы использовали это некоторое время, и это очень хорошо работает для нас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...