簡體   English   中英

JSF-如何將許多值插入數據庫表

[英]JSF - how to insert into database table many values

我有這種形式,可以將值插入/更新到數據庫表中。

                  <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頁面中的許多值插入數據庫表嗎?

彼得的祝福

更新

到目前為止,這是我已經完成的代碼:

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


}

我想這段代碼是正確的,並且可以正常工作。

我不認為有問題。 只需像現在一樣將它們保存在Map ,則只需要一個getter。 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>

請注意,您不需要為一個setter settings JSF將使用Map自己的put()方法來使用提交的值更新地圖。 這同樣適用於引用數組或集合或嵌套bean的所有其他復雜屬性,例如Object[]List<E>SomeBeanSomeBean僅用於簡單屬性,如StringInteger等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM