2012-03-15 68 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个值,我必须为它们中的每一个写setter方法。有没有其他更快速的解决方案将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中,那么你只需要一个吸气剂。 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()方法用提交的值更新地图。这同样也适用于所有其它复杂的属性引用的阵列或集合或嵌套豆状Object[]List<E>SomeBean等设定器仅称为像StringInteger简单性等

+0

是否有任何示例这可以如何实施? – 2012-03-15 20:41:25

+0

对不起,我不确定你不清楚什么。你已经将'settings'映射为bean的属性。你已经将它绑定到输入字段。 JSF将在那里设置提交的值。你只需要在DB中保存相同的'settings'映射。我已经用一个基本的例子更新了答案。 – BalusC 2012-03-15 20:44:31

+0

谢谢你的例子。我在更新帖子后看到了您的示例。 – 2012-03-15 21:15:20

相关问题