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

使用jstl标记在数据库中解析和存储xml数据时出错,xml,jsp,parsing,jstl,Xml,Jsp,Parsing,Jstl,我必须读取xml文件,以表的形式显示其内容,并需要将数据存储在数据库表中。首先,我尝试在jsp中仅使用jstl1.2标记显示数据。它工作得很好。但是当我试图实现一些代码来插入记录时,我得到了这个错误 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 va

我必须读取xml文件,以表的形式显示其内容,并需要将数据存储在数据库表中。首先,我尝试在jsp中仅使用jstl1.2标记显示数据。它工作得很好。但是当我试图实现一些代码来插入记录时,我得到了这个错误

 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>

cust_xml
客户信息
客户编号
名字
姓
街头
城市
陈述
Zipcode
平衡
插入数据值(?,,,,,,,,,,,?);
祝贺数据插入成功。
请提供您的建议,我应该使用哪个标签来设置插入查询参数的值?如何获取要在查询参数中设置的xml元素数据?
谢谢和问候

我努力想解决我的问题,但不幸的是没有得到任何帮助。 在谷歌搜索时,我有了一些基本的想法来处理这个问题。我试过这个

<%@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>
在我的表格中,余额(最后一列)是整数类型。 当我在谷歌上搜索时,我发现jstl标签会自动处理铸造。但默认情况下,它会将错误显示为
,将变量的值放置为字符串。

有什么想法吗?有什么帮助吗?有什么建议吗?请告诉我。

您可以使用
CAST
函数将
封装起来,并且仍然使用
setObject()
方法。
让我给你举个例子 在MySQL中存储IP地址时我的查询通常是这样的

INSERT INTO log (ip,logged_on) VALUES(inet6_aton(?),no());
 INSERT INTO data VALUES (CAST(? AS INTEGER),?,?,?,?,?,?,?);
PS:
inet6\u-aton()
对于MySQL 5.6+或者使用
inet4\u-aton()
或者只使用
inet\u-aton()

现在我转到了Postgres,它没有
inet\u aton
函数,而是将
inet
作为数据类型。不幸的是,没有
setInet()
方法,所以我想这样做

INSERT INTO log (ip,looged_on) VALUES(CAST(? AS INET),now());
有了它,我可以在
JDBC
JSTL
中传递参数时使用
setString()
setObject()

插入数据值(?,,,,,,,,,,,?)

由于您没有像我在示例中那样提到列名,我不知道哪一列需要进行类型转换,但您可以这样写

INSERT INTO log (ip,logged_on) VALUES(inet6_aton(?),no());
 INSERT INTO data VALUES (CAST(? AS INTEGER),?,?,?,?,?,?,?);

我只是假设表的第一列为
balance
请根据
balance
列在表中的位置为适当的参数执行此操作。

请有人帮助我。我在谷歌上搜索了2-3天。但是没有运气。