Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过实现Spring';s主题资源类_Java_Hibernate_Spring_Themes - Fatal编程技术网

Java 通过实现Spring';s主题资源类

Java 通过实现Spring';s主题资源类,java,hibernate,spring,themes,Java,Hibernate,Spring,Themes,有人知道如何在春季使用自定义主题资源吗?我已经看到了许多关于如何使用ResourceBundleThemeSource将主题与属性文件一起使用的示例。然而,关于如何使用hibernate存储各种属性(例如单个css属性),如何使用自定义主题资源读取属性,以及如何在jsp中使用spring主题标记,我还没有看到任何内容 我知道我可以使用hibernate创建一个控制器并从数据库中获取这些属性,但我更感兴趣的是了解如何使用Spring的ThemeSource实现来实现这一点 如果有人有任何想法或例子

有人知道如何在春季使用自定义主题资源吗?我已经看到了许多关于如何使用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);
    }

}