2012-03-16 111 views
0

顯示數據我有這樣的JSF頁面:JSF - 無法從HashMap的

<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:

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;  

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

    /* 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 void updateDBSettings() throws SQLException { 

      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 " + 
              "SET \"SettingValue\" = " + 
               "CASE " + 
               "WHEN \"SettingName\" = 'SessionTTL' THEN ? " + 
               "WHEN \"SettingName\" = 'MaxUsersActive' THEN ? " + 
               "END " + 
             "WHERE \"SettingName\" IN ('SessionTTL', 'MaxUsersActive')"; 


         PreparedStatement updateQuery = conn.prepareStatement(SQL_Statement); 
         updateQuery.setString(1, settingsMap.get("SessionTTL")); 
         updateQuery.setString(2, settingsMap.get("MaxUsersActive")); 

         updateQuery.executeQuery(); 

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

       } 

     }  


} 

當我嘗試了一些數據輸入到輸入框,然後點擊提交按鈕我當我重新加載JSF頁面時,沒有看到任何數據。我可以看到SQL開發人員將更新數據庫表中的數據。你有沒有在代碼中發現任何問題?

最良好的祝願 彼得

回答

0

如果你創建一個方法

public void setMapValue(String value) { 
    settingsMap.put("SessionTTL", value); 
} 

,並在XHTML頁面使用什麼:

<h:inputText value="#{ApplicationController.mapValue}" />