如何在Primefaces中保存主题

时间:2013-03-01 01:05:28

标签: jsf jsf-2 primefaces

我想使用Primefaces ThemeSwitcher。我很有兴趣在重新加载Web应用程序时如何保存所选主题。例如,如何将主题名称设置为数据库中的变量?

5 个答案:

答案 0 :(得分:3)

你不需要ThemeSwitcher来实现你正在寻找的那种持久性。

只需在ServletContextListener中对主题执行数据库查找,然后将值存储在servlet上下文中,可能会覆盖您在web.xml中设置的任何内容

   public Class MyContextListener implements ServletContextListener{

     public void contextInitialized(ServletContextEvent sce){

      String selectedTheme = myThemeDAO.getConfiguredTheme();

      sce.getServletContext().setInitParameter("primefaces.THEME",selectedTheme);

     }


   }

答案 1 :(得分:1)

将您的ThemeSwitcher组件链接到managedBean并添加链接到ajax事件的侦听器:

<h:form id="form-theme">
<p:themeSwitcher id="defaultSwitcher" value="#{themeSwitcherBean.theme}">
<f:selectItems value="#{themeSwitcherBean.themes}" />
<p:ajax listener="#{themeSwitcherBean.saveTheme}" />
</p:themeSwitcher>
</h:form> 
在您的managedbean中

创建调用saveTheme的方法,该方法将调用一个类来保存在数据库中,并在开始获取已保存到数据库中的主题时调用该类的类:

@SessionScoped
@ManagedBean(name="themeSwitcherBean")
public class ThemeSwitcherBean implements Serializable{ 
private Map<String, String> themes;
    private String theme;
    private GuestPreferences gp;

    private void setGp(GuestPreferences gp) {
        this.gp = gp;
    }

    public Map<String, String> getThemes() {
        return themes;
    }

    public String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }

    @PostConstruct
    public void init() {
        setGp(new GuestPreferences()); // persistent class
        setTheme(gp.getTheme()); // theme from the database;

        themes = new TreeMap<String, String>();
        themes.put("Aristo", "aristo");
        themes.put("Black-Tie", "black-tie");
        themes.put("Blitzer", "blitzer");
        themes.put("Bluesky", "bluesky");
        themes.put("Bootstrap", "bootstrap");
        themes.put("Casablanca", "casablanca");
        themes.put("Cupertino", "cupertino");
        themes.put("Dark-Hive", "dark-hive");
        themes.put("Dot-Luv", "dot-luv");
        themes.put("Eggplant", "eggplant");
        themes.put("Excite-Bike", "excite-bike");
        themes.put("Flick", "flick");
        themes.put("Glass-X", "glass-x");
        themes.put("Hot-Sneaks", "hot-sneaks");
        themes.put("Humanity", "humanity");
        themes.put("Le-Frog", "le-frog");
        themes.put("Midnight", "midnight");
        themes.put("Mint-Choc", "mint-choc");
        themes.put("Overcast", "overcast");
        themes.put("Pepper-Grinder", "pepper-grinder");
        themes.put("Redmond", "redmond");
        themes.put("Rocket", "rocket");
        themes.put("Sam", "sam");
        themes.put("Smoothness", "smoothness");
        themes.put("South-Street", "south-street");
        themes.put("Start", "start");
        themes.put("Sunny", "sunny");
        themes.put("Swanky-Purse", "swanky-purse");
        themes.put("Trontastic", "trontastic");
        themes.put("UI-Darkness", "ui-darkness");
        themes.put("UI-Lightness", "ui-lightness");
        themes.put("Vader", "vader");
    }

    public void saveTheme() {           
        gp.setTheme(theme); // theme to database
    }

} 
来自类GuestPreferences的

方法主题将持久存储到数据库

@SessionScoped
public class GuestPreferences {

    public String getTheme(){        
        //return the theme from the database
    }

    public void setTheme(String theme){
        //send the theme to the database
    }

}

从数据库发送和接收数据的表单取决于您的喜好:
* jdbc
* jta
* jpa

例如,jta,创建一个persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="NAME-WHAT-YOU-WANT" transaction-type="JTA">
    <provider>CLASS-OF-YOUR-PROVIDER</provider>
    <jta-data-source>YOUR-DATASOURCE</jta-data-source>
    <class>PATH-OF.GuestPreferences</class>
    <properties>
      <property name="NAME-OF-PROPERTY-TO-FORM-A-JDBC-URL" value="VALUE-OF-PROPERTY"/>
      <property name="NAME-OF-PROPERTY-TO-FORM-A-JDBC-URL" value="VALUE-OF-PROPERTY"/>
      <property name="NAME-OF-PROPERTY-TO-FORM-A-JDBC-URL" value="VALUE-OF-PROPERTY"/>
    </properties>
  </persistence-unit>
</persistence>

在资源类中,您可以声明:

   @SuppressWarnings("unused")
   @Produces
   @PersistenceContext
   private EntityManager em;

然后,您可以在GuestPreferences类中使用它:

@Inject
private EntityManager em;

em.getTransaction().begin();
Query query = em.createQuery("SELECT u FROM user_table u where u.iduser=:iduser");
query.setParameter("iduser", "THEME-USER-ID");
User resultUser = (User) query.getResultList();
em.getTransaction().commit();
if(User!=null){ 
   return resultUser.getTheme();
 }

上面的代码假设您有一个名为user_table的表,其中用户具有iduser,name ...和主题列,并假设您有一个名为User的对象来管理用户

答案 2 :(得分:1)

还有一种方法:将样式表包含在您的页面模板中:

<h:body> <h:outputStylesheet library="primefaces-#{themesBean.theme}" name="theme.css" /> </h:body>

其中#{themesBean.theme}变量引用您主题的名称。

P.S。在PF5中测试

答案 3 :(得分:0)

我认为在会话中设置选定的主题会有所帮助:

session.setAttribute

答案 4 :(得分:0)

通过代码编辑web.xml:

http://illegalargumentexception.blogspot.co.at/2008/08/java-using-xmlbeans-to-edit-webxml.html

<context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>EDITME</param-value>
</context-param>

或者在加载页面之前创建方法以从db中选择主题。 (清洁解决方案)