Java 通过实现Spring';s主题资源类
有人知道如何在春季使用自定义主题资源吗?我已经看到了许多关于如何使用ResourceBundleThemeSource将主题与属性文件一起使用的示例。然而,关于如何使用hibernate存储各种属性(例如单个css属性),如何使用自定义主题资源读取属性,以及如何在jsp中使用spring主题标记,我还没有看到任何内容 我知道我可以使用hibernate创建一个控制器并从数据库中获取这些属性,但我更感兴趣的是了解如何使用Spring的ThemeSource实现来实现这一点 如果有人有任何想法或例子,我将不胜感激Java 通过实现Spring';s主题资源类,java,hibernate,spring,themes,Java,Hibernate,Spring,Themes,有人知道如何在春季使用自定义主题资源吗?我已经看到了许多关于如何使用ResourceBundleThemeSource将主题与属性文件一起使用的示例。然而,关于如何使用hibernate存储各种属性(例如单个css属性),如何使用自定义主题资源读取属性,以及如何在jsp中使用spring主题标记,我还没有看到任何内容 我知道我可以使用hibernate创建一个控制器并从数据库中获取这些属性,但我更感兴趣的是了解如何使用Spring的ThemeSource实现来实现这一点 如果有人有任何想法或例子
感谢要在web应用程序中使用主题,必须设置
org.springframework.ui.context.ThemeSource
界面的实现。要使用自定义主题资源实现,可以在应用程序上下文中使用保留名称ThemeSource
注册bean。web应用程序上下文自动检测具有该名称的bean并使用它
以下是主题资源
界面:
package org.springframework.ui.context;
public interface ThemeSource {
Theme getTheme(String themeName);
}
这里唯一的黑马是主题
类型,实际上它只不过是:
package org.springframework.ui.context;
public interface Theme {
String getName();
MessageSource getMessageSource();
}
事实上,Spring=>
请注意,ThemeSource需要Spring,这意味着在您的情况下,存储在数据库中的主题属性需要“转换”以与MessageSource
接口一起使用
您可以编写自己的数据库驱动消息源
,也可以从
现在,所有这些变量都准备好了,下面是一个定制的数据库主题资源
(它将成为主题资源
bean):
tolitius给出的答案很好,但对于实际应用,我认为需要加入某种缓存 对你网站的每一个请求都需要你的主题,但你是否希望每一个请求都进入你的数据库只是为了查找一些颜色?主题通常不是很大,也不会经常改变。因此,它们是加载到内存并保存在内存中的一个很好的候选者。这就是我们对运行的站点所做的,我们在内存中保留大约50个主题,这些主题在启动时从Hibernate加载。这使得服务主题请求非常快速 当然,核心类是您的
DatabaseThemeSource
bean,它实现了ThemeSource
。如果你有一个可用的缓存库,比如Ehcache,你可以使用它,但是大多数人只有很少的主题,所以一个简单的映射就可以了。我们使用这样的方法:
@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();
}
}
}
最终的结果是速度很快。所有主题都保存在内存中,通过简单的Map
查找可以快速访问主题元素。我们已经用了一段时间了,它对我们非常有效。我接受了另一个答案后,你一定马上回答了。这很有道理。我们走了不同的方向,允许最终用户创建自己的主题。css文件在保存时创建,并存储在当前随每个请求访问的数据库中。我还没有实现缓存解决方案,但计划这样做。我很感激你的回答,但我现在所能做的就是修改你的答案。
@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();
}
}
}
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);
}
}