0

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

4

5 回答 5

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);

     }


   }
于 2013-03-01T14:14:39.000 回答
1

另一种方法是:将样式表包含到您的页面模板中:

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

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

PS在PF5中测试

于 2014-06-07T01:26:08.127 回答
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> 

在您的托管bean中创建调用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 的对象来管理用户

于 2013-03-02T15:19:29.260 回答
0

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

session.setAttribute
于 2013-03-01T05:47:35.947 回答
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 中选择主题。(更清洁的解决方案)

于 2013-03-01T09:10:29.827 回答