我对我实习的项目有一点问题。我必须创建一个可以从页面接收数据并将其插入数据库的网页,然后我可以通过表格显示它。我正在使用带有primefaces,bootstrap和javascript的JSF,并且正在尝试将数据发送到托管bean,托管bean将处理它并将其插入数据库。
这是我的xhtml页面:
<form id="CargarM">
<center>
<table class="table">
<thead>
<tr class="success">
<th colspan="2">Fecha</th>
<th>AUDIT</th>
<th>TTRAN</th>
<th>INPUT</th>
<th>HORA INICIO</th>
<th>HORA FIN</th>
</tr>
</thead>
<tbody>
<tr>
<td id="spanDate" colspan="2"></td>
<td colspan="1"><input type="number" name="Audit" value="#{CargarController.audit}"/></td>
<td><input type="number" name="Ttran" value="#{CargarController.ttran}"/></td>
<td><input type="number" name="Input" value="#{CargarController.input}"/></td>
<td><input type="time" id="HoraInicio" name="HoraInicio" value="#{CargarController.inicio}"/></td>
<td><input type="time" id="HoraFin" name="HoraFin" value="#{CargarController.fin}"/></td>
</tr>
</tbody>
</table>
<!--<button type="submit" class="btn btn-success">Cargar</button>-->
<p:button onclick="#{CargarController.CargaDatosMar()}" value="Cargar"></p:button>
<p:button class="btn btn-success">Resetear</p:button>
<a href="#menu-toggle" class="btn btn-success" id="menu-toggle">Toggle Menu</a>
</center>
</form>
用户将能够输入所有必需的信息,并将其发送到managedbean CargarController中的方法CargarDatosMar,如下所示:
public void CargaDatosMar() throws Exception {
System.out.println("Entre");
if (audit != null) {
System.out.println("Entre otra vez");
Connection con;
PreparedStatement sql = null;
Conexion conn = new Conexion();
con = conn.getConnection();
try {
dia = new Date().toString();
sql = con.prepareStatement("INSERT INTO CierreMar VALUES ('(?)','(?)','(?)','(?)','(?)','(?)')");
sql.setString(1, dia);
sql.setString(2, audit);
sql.setString(3, ttran);
sql.setString(4, input);
sql.setString(5, inicio);
sql.setString(6, fin);
int rs = sql.executeUpdate();
System.out.println("Sali");
} catch (SQLException e) {
throw e;
}
}
}
我还创建了所需的Getter和Setter方法
public String getDia() {
return dia;
}
public void setDia(String dia) {
this.dia = dia;
}
public String getAudit() {
return audit;
}
public void setAudit(String audit) {
this.audit = audit;
}
public String getTtran() {
return ttran;
}
public void setTtran(String ttran) {
this.ttran = ttran;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getInicio() {
return inicio;
}
public void setInicio(Object inicio) {
this.inicio = inicio.toString();
}
public String getFin() {
return fin;
}
public void setFin(Object fin) {
this.fin = fin.toString();
}
最后,我将展示我用来创建与我正在使用的SQL Server数据库的连接的方法。
public class Conexion {
public static Connection getConnection(){
String username="BODCOMVE\\peferrer";
String password="";
String url="jdbc:sqlserver://PEFERRER\\SQLEXPRESS;databaseName=PasantiasBOD";
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(url,username,password);
return con;
}catch(Exception ex){
System.out.println("Error al establecer la conexion" + ex.getMessage());
return null;
}
}
public static void close(Connection con){
try{
con.close();
}catch(Exception ex){
}
}
}
既然我已经谈了很多话,我就会直接了解它。我在过去几天一直在研究这个问题,我注意到由于某些原因,当我开始页面时,CargarDatosMar方法会在我的页面开始加载时被调用,这当然意味着变量它&# 39;尝试访问的是null,因此它抛出一个NullPointer。这就是我将代码放在if(audit!= null)中的原因,因为它是访问页面的唯一方法。我还发现了这一点,这要归功于我在该代码上面提供的打印消息。
我一直试图弄清楚为什么这个方法会在页面启动时被调用以及如何修复它,但遗憾的是,无论我在哪里,我都无法找到这样的问题。我已经尝试更改我在提交按钮上的onClick调用,而是通过xhtml表单中的Action将数据发送到类,但它也给出了同样的问题。
总结一下:我不知道为什么在我完成页面输入之前运行了managebean,当然一旦运行它就不会再次运行它。我想我读到这实际上是ManageBeans应该做的事情,但如果是这样的话那么我应该做些什么来阻止它在开始时运行并实际让我进入,或者我可以使用什么否则作为将数据发送到我的数据库的一种方式。