[英]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>
, SomeBean
等SomeBean
僅用於簡單屬性,如String
, Integer
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.