0

Primefaces ThemeSwitcherを使いたいです。Web アプリケーションをリロードするときに、選択したテーマを保存する方法に興味があります。たとえば、データベースからテーマ名を変数として設定するにはどうすればよいですか?

4

5 に答える 5

3

探している種類の持続性を実現するために ThemeSwitcher は必要ありません。

ServletContextListenerでテーマのデータベース ルックアップを実行し、その値をサーブレット コンテキストに格納するだけで、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

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

上記のコードは、ユーザーがiduser、name ...、およびテーマ列を持つuser_tableというテーブルがあり、ユーザーを管理するためのUserというオブジェクトがあることを前提としています。

于 2013-03-02T15:19:29.260 に答える
1

これを行うもう 1 つの方法: ページ テンプレートにスタイルシートを含めます。

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

変数#{themesBean.theme}はテーマの名前を参照します。

PF5 で PS テスト済み

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