我正在使用JSF表单原型,使用AJAX数据验证将数据插入数据库表这是JSF页面:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<ui:insert name="header">
<ui:include src="header.xhtml"/>
</ui:insert>
</h:head>
<h:body>
<h1><img src="resources/css/images/icon.png" alt="NVIDIA.com" /> History Center</h1>
<!-- layer for black background of the buttons -->
<div id="toolbar" style="margin: 0 auto; width:1180px; height:30px; position:relative; background-color:black">
<!-- Include page Navigation -->
<ui:insert name="Navigation">
<ui:include src="Navigation.xhtml"/>
</ui:insert>
</div>
<div id="logodiv" style="position:relative; top:35px; left:0px;">
<h:graphicImage alt="Demo Insert Form" style="position:relative; top:-20px; left:9px;" value="resources/images/logo_databasez.png" />
</div>
<div id="main" style="margin: 0 auto; width:1190px; height:700px; position:absolute; background-color:transparent; top:105px">
<div id="mainpage" style="margin: 0 auto; width:1190px; height:500px; position:absolute; background-color:transparent; top:80px">
<div id="settingsHashMap" style="width:350px; height:400px; position:absolute; background-color:r; top:20px; left:1px">
<h:form>
<div id="settingsdiv" style="width:750px; height:400px; position:absolute; background-color:r; top:20px; left:1px">
<h:panelGrid columns="2">
<h:panelGroup>Session ID</h:panelGroup>
<h:panelGroup>
<h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" >
<f:validateLength minimum="0" maximum="15"/>
<f:ajax render="sessionidvalidate" event="blur"/>
</h:inputText>
<h:outputText id="sessionidvalidate" rendered="#{DatabaseController.validateSessionid}" value="session is already registered" />
</h:panelGroup>
<h:panelGroup>User ID</h:panelGroup>
<h:panelGroup>
<h:inputText id="userid" value="#{DatabaseController.formMap['userid']}" >
<f:validateLength minimum="0" maximum="15"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>Login Time</h:panelGroup>
<h:panelGroup>
<h:inputText id="logintime" value="#{DatabaseController.formMap['logintime']}" >
<f:validateLength minimum="0" maximum="35"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>Last Refresh Time</h:panelGroup>
<h:panelGroup>
<h:inputText id="lastrefreshtime" value="#{DatabaseController.formMap['lastrefreshtime']}" >
<f:validateLength minimum="0" maximum="35"/>
</h:inputText>
</h:panelGroup>
<h:panelGroup>User IP</h:panelGroup>
<h:panelGroup>
<h:inputText id="userip" value="#{DatabaseController.formMap['userip']}" >
<f:validateLength minimum="0" maximum="15"/>
</h:inputText>
</h:panelGroup>
</h:panelGrid>
</div>
<div id="settingstwodiv" style="width:150px; height:60px; position:absolute; background-color:transparent; top:380px; left:800px">
<h:commandButton value="Create User" action="#{DatabaseController.saveData}"/>
</div>
</h:form>
</div>
</div>
</div>
</h:body>
</html>
这是托管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.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
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;
// Demo Insert Form
@Named("DatabaseController")
@SessionScoped
public class Database implements Serializable {
private HashMap<String, String> formMap = new HashMap<>();
public Database() {
}
/* Call the Oracle JDBC Connection driver */
@Resource(name = "jdbc/Oracle")
private DataSource ds;
public HashMap<String, String> getformMap() {
return formMap;
}
/*
CREATE TABLE ACTIVESESSIONS(
SESSIONID VARCHAR2(30 ) NOT NULL,
USERID VARCHAR2(30 ) NOT NULL,
LOGINTIME TIMESTAMP(6),
LASTREFRESHTIME TIMESTAMP(6),
USERIP VARCHAR2(30 )
)
/
*/
@PostConstruct
public void hashMapGenerate() {
/* Initialize the hashmap */
formMap.put("sessionid", null);
formMap.put("userid", null);
formMap.put("logintime", null);
formMap.put("lastrefreshtime", null);
formMap.put("userip", null);
}
public int saveData() throws SQLException, java.text.ParseException {
// formMap = new HashMap<String, String>();
String SqlStatement = null;
if (ds == null) {
throw new SQLException();
}
Connection conn = ds.getConnection();
if (conn == null) {
throw new SQLException();
}
PreparedStatement ps = null;
/*
CREATE TABLE ACTIVESESSIONS(
SESSIONID VARCHAR2(30 ) NOT NULL,
USERID VARCHAR2(30 ) NOT NULL,
LOGINTIME TIMESTAMP(6),
LASTREFRESHTIME TIMESTAMP(6),
USERIP VARCHAR2(30 )
)
/
*/
try {
conn.setAutoCommit(false);
boolean committed = false;
try { /* insert into Oracle the default system(Linux) time */
SqlStatement = "INSERT INTO ACTIVESESSIONS"
+ " (SESSIONID, USERID, LOGINTIME, LASTREFRESHTIME, USERIP)"
+ " VALUES (?, ?, ?, ?, ?)";
ps = conn.prepareStatement(SqlStatement);
ps.setString(1, formMap.get("sessionid"));
ps.setString(2, formMap.get("userid"));
ps.setTimestamp(3, toTimeStamp(formMap.get("logintime")));
ps.setTimestamp(4, toTimeStamp(formMap.get("lastrefreshtime")));
ps.setString(5, formMap.get("userip"));
ps.executeUpdate();
conn.commit();
committed = true;
}
finally
{
if (!committed) {
conn.rollback();
}
}
} finally {
/* Release the resources */
ps.close();
conn.close();
}
return 0;
}
private Timestamp toTimeStamp(String s) throws java.text.ParseException
{
Timestamp ts = null;
java.util.Date date = null;
if (s == null || s.trim().isEmpty()) return ts;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S");
date = (java.util.Date) sdf.parse(s);
ts = new Timestamp(date.getTime());
return ts;
}
/* Validators section */
public boolean getvalidateSessionid(){
//do SQL query
return true;
}
}
我在实施表单验证方面遇到了困难。我想传递由used输入的String并将其检入数据库,这个值已经进入数据库表。在这里,我调用Java方法来检查值:
<h:panelGroup>
<h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}" >
<f:validateLength minimum="0" maximum="15"/>
<f:ajax render="sessionidvalidate" event="blur"/>
</h:inputText>
<h:outputText id="sessionidvalidate" rendered="#{DatabaseController.validateSessionid}" value="session is already registered" />
</h:panelGroup>
如何将插入的值发送到Java方法?
祝福
答案 0 :(得分:9)
您需要创建Validator
。
开球示例:
@FacesValidator("sessionIdValidator")
public class SessionIdValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// ...
if (yourDataService.existSessionId(value)) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Session ID is already in use, please choose another.", null));
}
}
}
按如下方式使用:
<h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}">
<f:validateLength minimum="0" maximum="15" />
<f:validator validatorId="sessionIdValidator" />
<f:ajax event="blur" render="sessionidMessage" />
</h:inputText>
<h:message id="sessionidMessage" for="sessionid" />
请注意,您应使用<h:message>
来显示验证消息。你认为你没有任何人。对所有其他领域应用相同的内容:
<h:inputText id="userid" value="#{DatabaseController.formMap['userid']}">
<f:validateLength minimum="0" maximum="15" />
<f:ajax event="blur" render="useridMessage" />
</h:inputText>
<h:message id="useridMessage" for="userid" />
如果您想在验证器中使用@Resource
或@EJB
或@Inject
,请将@FacesValidator
注释替换为@ManagedBean
或(因为您似乎出于某种原因使用CDI)@Named
:
@Named
public class SessionIdValidator implements Validator {
@Resource
private DataSource dataSource;
@Inject
private YourDataService yourDataService;
// ...
}
并改为使用
<f:validator binding="#{sessionIdValidator}" />
答案 1 :(得分:1)
只需在标记h:inputText
中添加侦听器:
<h:inputText id="sessionid" value="#{DatabaseController.formMap['sessionid']}"
valueChangeListener="#{DatabaseController.validateSessionid}">
因此,您可以检查服务器端输入的值。当用户选中输入字段时,JSF对服务器进行ajax调用,并通过生命周期的执行部分运行名称输入组件。这意味着JSF将在生命周期的验证过程阶段调用属性valueChangeListener
中指定的名称输入的值更改侦听器。
我建议实施这种方法:
public void validateSessionid(ValueChangeEvent e) {
UIInput nameInput = e.getComponent()
String sessionid = nameInput.getValue()
//do SQL query
}
在ajax-call返回后,JSF呈现h:outputText id="sessionidvalidate"
。