使用jstl标签解析和存储数据库中的xml数据时出错

问题描述:

我必须读取一个xml文件,以表格形式显示其内容并需要将数据存储在数据库表中。首先,我试图只在jsp中使用jstl1.2标签显示数据。它工作正常。但是,当我试图执行一些代码插入我收到此错误记录..使用jstl标签解析和存储数据库中的xml数据时出错

Can't infer the SQL type to use for an instance of org.apache.taglibs.standard.tag.common.xml.JSTLNodeList. Use setObject() with an explicit Types value to specify the type to use. 

我的JSP代码是:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 

<sql:setDataSource var="dataSource" driver="org.postgresql.Driver" 
    url="jdbc:postgresql://localhost:5432/postgres" user="postgres" password="shail" 
    scope="session" /> 

<html> 
    <head> 
    <title>cust_xml</title> 
    </head> 
    <body> 

    <h1>Customer Information</h1> 

    <c:import var="xmlFile" url="cust.xml" charEncoding="UTF-8"/> 
    <x:parse var="myDoc" xml="${xmlFile}" /> 

    <table border="1"> 
     <tr> 
     <th>Customer Number</th> 
     <th>First Name</th> 
     <th>Last Name</th> 
     <th>Street</th> 
     <th>City</th> 
     <th>State</th> 
     <th>Zipcode</th> 
     <th>Balance</th> 
     </tr> 
     <x:forEach select="$myDoc/CUSTOMERS/Customer" var="cust"> 
     <tr> 
      <td> 
       <x:out select="$cust/CustNo" /> 
       <x:set var="custno" select="$cust/CustNo" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustFirstName" /> 
       <x:set var="custfn" select="$cust/CustFirstName" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustLastName" /> 
       <x:set var="custln" select="$cust/CustLastName" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustStreet" /> 
       <x:set var="custst" select="$cust/CustStreet" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustCity" /> 
       <x:set var="custcity" select="$cust/CustCity" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustState" /> 
       <x:set var="custstate" select="$cust/CustState" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustZip" /> 
       <x:set var="custz" select="$cust/CustZip" scope="session"/> 
      </td> 
      <td> 
       <x:out select="$cust/CustBal" /> 
       <x:set var="custbal" select="$cust/CustBal" scope="session"/> 
      </td> 
     </tr> 
     </x:forEach> 
    </table> 

    <sql:update dataSource="${dataSource}" var="updatedTable"> 
     INSERT INTO data VALUES (?,?,?,?,?,?,?,?); 
     <sql:param value="${custno}" /> 
     <sql:param value="${custfn}" /> 
     <sql:param value="${custln}" /> 
     <sql:param value="${custst}" /> 
     <sql:param value="${custcity}" /> 
     <sql:param value="${custstate}" /> 
     <sql:param value="${custz}" /> 
     <sql:param value="${custbal}" /> 
    </sql:update> 
    <c:if test="${updatedTable>=1}"> 
    <font size="5" color='green'> Congratulations ! Data inserted successfully.</font> 
    </c:if> 

    </body> 
</html> 

请提供你的建议,我将用它来设置其标签插入查询参数的值?如何获取XML元素数据设置查询参数? 谢谢& Regards

+0

请有人帮助我。我正在搜索最近2-3天。但没有运气。 – 2013-02-27 04:46:41

我尽力解决我的问题,但不幸得不到任何帮助。 谷歌搜索时,我有一些基本的想法来应对这一点。我想这

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 

<sql:setDataSource var="dataSource" driver="org.postgresql.Driver" 
    url="jdbc:postgresql://localhost:5432/postgres" user="postgres" password="shail" 
    scope="session" /> 

<html> 
    <head> 
    <title>cust_xml</title> 
    </head> 
    <body bgcolor="skyblue"> 

    <h1 align="center">Customer Information Stored In XMl File</h1> 

    <c:import var="xmlFile" url="cust.xml" charEncoding="UTF-8"/> 
    <x:parse var="myDoc" xml="${xmlFile}" /> 

    <table border="1" cellspacing="1" cellpadding="1" bgcolor="pink" align="center"> 
     <tr> 
     <th>Customer Number</th> 
     <th>First Name</th> 
     <th>Last Name</th> 
     <th>Street</th> 
     <th>City</th> 
     <th>State</th> 
     <th>Zipcode</th> 
     <th>Balance</th> 
     </tr> 
     <x:forEach select="$myDoc/CUSTOMERS/Customer" var="cust"> 
     <tr> 
      <td> 
       <c:set var="custno" > 
       <x:out select="$cust/CustNo" /> 
       </c:set> 
       <x:out select="$cust/CustNo" /> 
      </td> 
      <td> 
       <c:set var="custfn" > 
       <x:out select="$cust/CustFirstName" /> 
       </c:set> 
       <x:out select="$cust/CustFirstName" /> 
      </td> 
      <td> 
       <c:set var="custln" > 
       <x:out select="$cust/CustLastName" /> 
       </c:set> 
       <x:out select="$cust/CustLastName" /> 
      </td> 
      <td> 
       <c:set var="custst" > 
       <x:out select="$cust/CustStreet" /> 
       </c:set> 
       <x:out select="$cust/CustStreet" /> 
      </td> 
      <td> 
       <c:set var="custcity" > 
       <x:out select="$cust/CustCity" /> 
       </c:set> 
       <x:out select="$cust/CustCity" /> 
      </td> 
      <td> 
       <c:set var="custstate" > 
       <x:out select="$cust/CustState" /> 
       </c:set> 
       <x:out select="$cust/CustState" /> 
      </td> 
      <td> 
       <c:set var="custz" > 
       <x:out select="$cust/CustZip" /> 
       </c:set> 
       <x:out select="$cust/CustZip" /> 
      </td> 
      <td> 
       <c:set var="custbal" > 
       <x:out select="$cust/CustBal" /> 
       </c:set> 
       <x:out select="$cust/CustBal" /> 
      </td> 
     </tr> 
     <sql:update dataSource="${dataSource}" var="updatedTable"> 
     INSERT INTO data VALUES (?,?,?,?,?,?,?,?); 
     <sql:param value="${custno}" /> 
     <sql:param value="${custfn}" /> 
     <sql:param value="${custln}" /> 
     <sql:param value="${custst}" /> 
     <sql:param value="${custcity}" /> 
     <sql:param value="${custstate}" /> 
     <sql:param value="${custz}" /> 
     <sql:param value="${custbal}" /> 

    </sql:update> 
    <c:set var="rowcount" value="${updatedTable+rowcount}"/> 
     </x:forEach> 

    <c:if test="${rowcount>=1}"> 
     <tr> 
     <td colspan="8" align="center"> 
    <font size="5" color='red' align="center"> 
    Congratulations ! <c:out value="${rowcount}" /> Rows inserted successfully in DB Table.</font> 
     </td> 
     </tr> 
    </c:if> 
    </table> 
    </body> 
</html> 

但我得到这个错误:

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: 
     INSERT INTO data VALUES (?,?,?,?,?,?,?,?); 
ERROR: column "balance" is of type integer but expression is of type character varying 
    Hint: You will need to rewrite or cast the expression. 

正如我在表余额(最后一栏)是整型。 当我谷歌搜索时,我得到了jstl标签自动照顾铸造。但它显示错误为by default <c:set > tag places value for variable as string. 任何想法?任何帮助?任何建议?请告诉我。

您可以用CAST功能附上?并仍然使用setObject()方法。
让我给你举个例子 虽然存储IP地址的MySQL我的查询使用是这样

INSERT INTO log (ip,logged_on) VALUES(inet6_aton(?),no()); 

PS:inet6_aton()为MySQL 5.6+使用别的inet4_aton()或只是inet_aton()

现在我转移到Postgres,它不具有inet_aton函数,但inet作为数据类型。不幸的是,没有setInet()方法,所以我最好要做到这一点

INSERT INTO log (ip,looged_on) VALUES(CAST(? AS INET),now()); 

有了这个,我可以用setString()setObject(),同时传递参数JDBCJSTL

INSERT INTO data VALUES (?,?,?,?,?,?,?,?);

既然你有没有提到了列名,就像我在我的例子中所做的那样,我不知道哪一列需要进行类型转换,但是你可以这样写:

INSERT INTO data VALUES (CAST(? AS INTEGER),?,?,?,?,?,?,?); 

我只是假设表格的第一列为balance,请根据表格中balance列的位置对相应参数执行此操作。