如何使用AJAX数据validation创建JSF表单

我正在使用JSF表单原型,使用AJAX数据validation将数据插入数据库表这是JSF页面:

         

NVIDIA.com History Center

Session ID User ID Login Time Last Refresh Time User IP

这是托管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 formMap = new HashMap(); public Database() { } /* Call the Oracle JDBC Connection driver */ @Resource(name = "jdbc/Oracle") private DataSource ds; public HashMap 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 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; } } 

我在实现表单validation方面遇到了困难。 我想传递由used输入的String并将其检入数据库,这个值已经存入数据库表。 这里我调用Java方法来检查值:

         

如何将插入的值发送到Java方法?

最好的祝愿

您需要创建一个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)); } } } 

使用方法如下:

       

请注意,您应该使用来显示validation消息。 你认为你没有任何人。 对所有其他领域应用相同的内容:

      

如果要在validation器中使用@Resource@EJB@Inject ,则将@FacesValidator注释替换为@ManagedBean或(由于某种原因您似乎使用CDI) @Named

 @Named public class SessionIdValidator implements Validator { @Resource private DataSource dataSource; @Inject private YourDataService yourDataService; // ... } 

并使用它如下

   

只需在标记h:inputText添加监听器h:inputText

  

因此,您可以检查服务器端输入的值。 当用户选中输入字段时,JSF对服务器进行ajax调用,并通过生命周期的执行部分运行名称输入组件。 这意味着JSF将在生命周期的validation过程阶段调用属性valueChangeListener中指定的名称输入的值更改侦听器。

我建议实现这个方法:

 public void validateSessionid(ValueChangeEvent e) { UIInput nameInput = e.getComponent() String sessionid = nameInput.getValue() //do SQL query } 

在ajax-call返回之后,JSF呈现h:outputText id="sessionidvalidate"