我有这个表单,可以将值插入/更新到数据库表中。
<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页面中的许多值插入到数据库表中?
祝福 彼得
更新
以下是我到目前为止的代码:
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;
}
}
我认为这段代码是正确的并且可行。
答案 0 :(得分: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()
方法使用提交的值更新地图。这同样适用于引用数组或集合或嵌套bean的所有其他复杂属性,例如Object[]
,List<E>
,SomeBean
等。只对像{这样的简单属性调用setter {1}},String
等