【问题标题】:Unable to Insert data into database in jsf Application无法在 jsf 应用程序中将数据插入数据库
【发布时间】:2015-05-28 12:14:57
【问题描述】:

我正在尝试将数据插入名为 mtdb 的数据库中,表 userDB 我正在用 JSF 编写我的网络应用程序,我能够呈现我的代码中包含的 primeface 元素,当我点击提交时,它没有向数据库中插入任何内容,你能帮帮我吗

我的 XHTML 页面是

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"  
      xmlns:f="http://java.sun.com/jsf/core"  
      xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Simple Web App</title>
</h:head>
<h:body>
<h:form>
    <p:outputLabel>Name:</p:outputLabel> <p:inputText id="nmn" value="#{sgbean.nmn}" />
    <p:outputLabel>Password:</p:outputLabel> <p:inputText id="pwd" value="#{sgbean.pwd}" />
    <p:commandButton id="btn" value="Submit" type="Submit" action="sgbean.add" />
</h:form>
</h:body>
</html>

托管 Bean 代码:

package jsfappTest;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;


@SuppressWarnings("unused")
@ManagedBean(name="sgbean")
@RequestScoped
public class BeanGs {

    PreparedStatement ps = null;
    Connection con = null; 
    int i=0;
    private String nmn;
    private String pwd;
    private String msg;
    
    public String getNmn() {
        return nmn;
    }
    public void setNmn(String nmn) {
        this.nmn = nmn;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    
    public String getMsg() {
        return msg;   }
                            
    public void add(){

        try{
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mtdb", "root", " ");
            String sql = "INSERT INTO userDB(name,pwd) VALUES(?,?)";
                        ps= con.prepareStatement(sql); 
                        ps.setString(1, nmn);
                        ps.setString(2, pwd);
                        i = ps.executeUpdate();
                        System.out.println("Data Added Successfully");
                }

        catch(Exception e)
                {
                        System.out.println(e); 
                }
        finally
        {
        try
        {
        con.close();
        ps.close();
        }
                    
        catch(Exception e)
        {
        e.printStackTrace();
        }
        }
        
   }
}

【问题讨论】:

  • 有什么例外吗?用你的命令按钮试试 ajax="false"
  • 我试过了,但没有成功,添加代码后页面正在刷新,但没有将任何数据添加到数据库中,甚至没有产生错误
  • 有交易吗?还是在某处提交?很可能不是。在那种情况下,它完全是 jsf/primefaces 不相关,但 jdbc
  • jdbc的语句需要改吗?
  • 假设数据提交到字段并调用方法:如果没有自动提交,我想你最好阅读一些关于提交和事务的jdbc教程......

标签: mysql jsf jdbc jsf-2


【解决方案1】:

我更新了上面显示的 managedBean "try" 和 "catch" 块以识别错误

 try
            {
                     Class.forName("com.mysql.jdbc.Driver");
                     con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mtdb", "root", "");
                     con.setAutoCommit(false);

                     Statement stmt = con.createStatement();
                     String sql = "INSERT INTO userdb(name,pwd) VALUES('"+nmn+"','"+pwd+"')";

                     stmt.executeUpdate(sql);
                     con.commit();


            }

Catch 块更新为

catch(Exception e)
            {
                   throw new FacesException(e);
            }

然后我在 lib 文件夹下包含了“mysql-connector-java-5.0.8-bin.jar”文件,它工作得非常好感谢所有的帮助,最后我能够使用提供的提示来解决这个问题

【讨论】:

  • 首先,我肯定会尝试更新的mysql-connector。其次,您现在将自动提交显式设置为 false 并使用显式提交。您是否检查过自动提交是否一开始就为假(因为默认情况下它在 mysql/jdbc 中为真)?还是有例外?
  • 如果我们从 autocommit=true 开始,这是默认的,它是不可能提交的,它会导致我一个错误“javax.servlet.ServletException: javax.faces.FacesException: java.sql.SQLException: Can' t 在 autocommit=true 时调用 commit" 但是当我删除 con.setAutoCommit(false);和 con.commit(),它正常工作,就好像它与包含的两个语句一起工作。
  • 正确,使用 autocommit=true 您不需要手动提交,因此会出现错误...但是自动提交是真的(不是从 java 或其他设置,甚至可能在数据库上级别)当您第一次发布您的问题时? (在你的代码中设置它之前打印con.getAutoCommit() 并检查它是真还是假)
  • 默认情况下应该是正确的,当时我不知道自动提交,提出的主要问题是连接器语句,我不小心将密码设置为“”而不是“”我是在我使用“throw new FacesException(e);”之前无法识别该错误,这向我展示了错误的根本原因并快速修复了它
  • 默认情况下它显示“False”,当我提交表单时,值更改为“true”
【解决方案2】:

p:commandbutton 上的 action 属性应为 action="#{sgbean.add()}

【讨论】:

  • 不,没有必要这样做。由于 action 属性默认不需要 value 表达式,因此不需要 ()
  • 为什么是-1? @sam_bam 你在他教的动作中也错过了#{ }。他不只是在谈论()
  • 我没有给出-1,即使我没有任何特权给出“-1”,因为我的代表不是必需的@Sarz
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2012-04-13
相关资源
最近更新 更多