使用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
我尽力解决我的问题,但不幸得不到任何帮助。 谷歌搜索时,我有一些基本的想法来应对这一点。我想这
<%@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()
,同时传递参数JDBC
或JSTL
INSERT INTO data VALUES (?,?,?,?,?,?,?,?);
既然你有没有提到了列名,就像我在我的例子中所做的那样,我不知道哪一列需要进行类型转换,但是你可以这样写:
INSERT INTO data VALUES (CAST(? AS INTEGER),?,?,?,?,?,?,?);
我只是假设表格的第一列为balance
,请根据表格中balance
列的位置对相应参数执行此操作。
请有人帮助我。我正在搜索最近2-3天。但没有运气。 – 2013-02-27 04:46:41