2012-03-15 8 views
0

データベーステーブルに値を挿入/更新できるこのフォームがあります。JSF - データベーステーブルに多くの値を挿入する方法

    <div id="settingsdiv" style="width:350px; height:400px; position:absolute; background-color:r; top:20px; left:1px"> 
        <h:form> 
        <h:panelGrid columns="2"> 
         <h:panelGroup>User Session Timeout</h:panelGroup> 
         <h:panelGroup> 
          <h:selectOneMenu value="#{ApplicationController.setting['SessionTTL']}"> 
           <f:selectItem itemValue="#{ApplicationController.setting['SessionTTL']}" itemLabel="#{ApplicationController.setting['SessionTTL']}" /> 
           <f:selectItem itemValue="two" itemLabel="Option two" /> 
           <f:selectItem itemValue="three" itemLabel="Option three" /> 
           <f:selectItem itemValue="custom" itemLabel="Define custom value" /> 
           <f:ajax render="input" /> 
          </h:selectOneMenu> 
          <h:panelGroup id="input"> 
           <h:inputText value="#{ApplicationController.setting['SessionTTL']}" rendered="#{ApplicationController.setting['SessionTTL'] == 'custom'}" required="true" /> 
          </h:panelGroup> 

         </h:panelGroup> 

         <h:panelGroup>Maximum allowed users</h:panelGroup> 
         <h:panelGroup></h:panelGroup>                  
        </h:panelGrid>       
         <h:commandButton value="Submit" action="#{ApplicationController.UpdateDBSettings()}"/> 
        </h:form>         
       </div> 

私はsetterメソッドを使用して管理対象Beanに値を送信し、SQLクエリを使用してデータベースに挿入することができることを知っています。例えば、私が40の値を持っていて、それぞれのためにセッターメソッドを書く必要がある場合はどうでしょうか? JSFページからデータベース表に多くの値を挿入するための、より迅速なソリューションがありますか?

お祈り申し上げます ピーター

ここでUPDATE

は、これまで私が行っていることのコードです:

JSFページ:

<div id="settingsdiv" style="width:350px; height:400px; position:absolute; background-color:r; top:20px; left:1px"> 
    <h:form> 
    <h:panelGrid columns="2"> 
     <h:panelGroup>User Session Timeout</h:panelGroup> 
     <h:panelGroup> 
      <h:selectOneMenu value="#{ApplicationController.settings['SessionTTL']}"> 
       <f:selectItem itemValue="#{ApplicationController.settings['SessionTTL']}" itemLabel="#{ApplicationController.settings['SessionTTL']}" /> 
       <f:selectItem itemValue="two" itemLabel="Option two" /> 
       <f:selectItem itemValue="three" itemLabel="Option three" /> 
       <f:selectItem itemValue="custom" itemLabel="Define custom value" /> 
       <f:ajax render="input" /> 
      </h:selectOneMenu> 
      <h:panelGroup id="input"> 
       <h:inputText value="#{ApplicationController.settings['SessionTTL']}" rendered="#{ApplicationController.settings['SessionTTL'] == 'custom'}" required="true" /> 
      </h:panelGroup> 

     </h:panelGroup> 

     <h:panelGroup>Maximum allowed users</h:panelGroup> 
     <h:panelGroup></h:panelGroup>                  
    </h:panelGrid>       
     <h:commandButton value="Submit" action="#{ApplicationController.UpdateDBSettings()}"/> 
    </h:form>       
</div> 

管理Bean:

package com.DX_57.SM_57; 
/* include default packages for Beans */ 
import java.io.Serializable; 
import javax.enterprise.context.SessionScoped; 
// or import javax.faces.bean.SessionScoped; 
import javax.inject.Named; 
/* include SQL Packages */ 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.HashMap; 
import javax.annotation.PostConstruct; 
import javax.sql.DataSource; 
import javax.annotation.Resource; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 
// or import javax.faces.bean.ManagedBean; 

import org.glassfish.osgicdi.OSGiService; 

@Named("ApplicationController") 
@SessionScoped 
public class Application implements Serializable { 

    /* This Hash Map will be used to store setting and value */ 
    private HashMap<String, String> settingsMap = null;  
    private HashMap<String, String> updatedSettingsMap = null; 

    public Application(){  
    } 

    /* Call the Oracle JDBC Connection driver */ 
    @Resource(name = "jdbc/Oracle") 
    private DataSource ds; 


    /* Hash Map 
    * Send this hash map with the settings and values to the JSF page 
    */ 
    public HashMap<String, String> getsettings(){ 
     return settingsMap;   
    } 

    /* Hash Map 
    * Returned from the JSF page with the updated settings 
    */ 
    public HashMap<String, String> setsettings(){ 
     return updatedSettingsMap; 
    } 

    /* Get a Hash Map with settings and values. The table is genarated right 
    * after the constructor is initialized. 
    */ 
    @PostConstruct 
    public void initSettings() throws SQLException 
    {   
     settingsMap = new HashMap<String, String>(); 

     if(ds == null) { 
       throw new SQLException("Can't get data source"); 
     } 
     /* Initialize a connection to Oracle */ 
     Connection conn = ds.getConnection(); 

     if(conn == null) { 
       throw new SQLException("Can't get database connection"); 
     } 
     /* With SQL statement get all settings and values */ 
     PreparedStatement ps = conn.prepareStatement("SELECT * from GLOBALSETTINGS"); 

     try 
     { 
      //get data from database   
      ResultSet result = ps.executeQuery(); 
      while (result.next()) 
      { 
       settingsMap.put(result.getString("SettingName"), result.getString("SettingValue")); 
      }    
     } 
     finally 
     { 
      ps.close(); 
      conn.close();   
     }   
    } 

    /* Update Settings Values */ 
    public String UpdateDBSettings(String userToCheck) throws SQLException { 


     //here the values from the updatedSettingsMap will be inserted into the database 

      String storedPassword = null;   
      String SQL_Statement = null; 

      if (ds == null) throw new SQLException();  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException();  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
         SQL_Statement = "Update GLOBALSETTINGS where sessionttl = ?"; 

         PreparedStatement updateQuery = conn.prepareStatement(SQL_Statement); 
         updateQuery.setString(1, userToCheck); 

         ResultSet result = updateQuery.executeQuery(); 

         if(result.next()){ 
          storedPassword = result.getString("Passwd"); 
         } 

         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 

     return storedPassword;  
     }  


} 

このコードは正しいと思われ、うまくいくはずです。

答えて

3

私は問題を認めません。あなたがすでに持っているようにMapのままにしておけば、ゲッターが1つだけ必要です。 JSFは既にMapに更新された値を設定します。 service.update(settings)に電話するだけです。


更新:要求されたとして、それだけで次のようになります。

@ManagedBean 
@ViewScoped 
public class Admin { 

    private Map<String, String> settings; 

    @EJB 
    private SettingsService service; 

    @PostConstruct 
    public void init() { 
     settings = service.getAll(); 
    } 

    public void save() { 
     service.update(settings); 
    } 

    public Map<String, String> getSettings() { 
     return settings; 
    } 

} 

<h:form> 
    <h:inputSomething value="#{admin.settings['key1']}" ... /> 
    <h:inputSomething value="#{admin.settings['key2']}" ... /> 
    <h:inputSomething value="#{admin.settings['key3']}" ... /> 
    <h:inputSomething value="#{admin.settings['key4']}" ... /> 
    <h:inputSomething value="#{admin.settings['key5']}" ... /> 
    ... 
    <h:commandButton value="Save" action="#{admin.save}" /> 
</h:form> 

とあなたが ないを行う settings用セッターを必要としています。 JSFは Mapの独自の put()メソッドを使用して、送信された値でマップを更新します。同じことがまた

+0

など、セッターのみStringIntegerのような単純な性質のために呼ばれるなど、配列またはコレクションまたはObject[]List<E>SomeBeanのようなネストされたBeanを参照する他のすべての複雑なプロパティに適用される任意の例ありこれはどのように実装できますか? –

+0

申し訳ありませんが、私はあなたのために不明なものはわかりません。 beanのプロパティとして既に 'settings'マップがあります。入力フィールドにバインドしました。 JSFはそこに提出された値を設定します。まったく同じ 'settings'マップをDBに残すだけです。私は基本的な例で答えを更新しました。 – BalusC

+0

ありがとうございます。私はポストを更新した直後にあなたの例を見ました。 –

関連する問題