jquery - jsp中抛出的数据类型异常

标签 jquery json ajax jsp servlets

我正在编写一个 Web 应用程序,其中有一个要使用 Ajax 生成的表。这些数据实际上是从数据库中提取的。下面是我的代码。

Index.jsp

<html>
<head>
</head>
<body>
    <marquee>
        <h1>This is an example of ajax</h1>
    </marquee>
    <form name="vinform">
        Enter id:<input type="button" id="somebutton" value="Click Me">
    </form>

    <span id="somediv"> </span>
    <script src="//code.jquery.com/jquery-1.10.2.js"></script>
    <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <script type="text/javascript" src="tableGenerator.js"></script>
</body>
</html>

tableGenerator.js

$('#somebutton').click(
        function() {
            $.getJSON('Controller', function(searchList) {
                var $table = $('<table>').appendTo($('#somediv'));
                $.each(searchList, function(index, userBean) {
                    $('<tr>').appendTo($table).append(
                            $('<td>').text(userBean.caseNumber)).append(
                            $('<td>').text(userBean.caseOwner)).append(
                            $('<td>').text(userBean.status)).append(
                            $('<td>').text(userBean.issue)).append(
                            $('<td>').text(userBean.reason)).append(
                            $('<td>').text(userBean.dateOpened));
                });
            });
        });

UserBean.java

package org.bean;

public class UserBean {
    private int age;
    private String caseOwner, status, issue, reason, dateOpened, caseNumber, resolution, finalStatus, startDate,
            endDate;
    private Double totalTimeTaken;

    public String getStartDate() {
        return startDate;
    }

    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }

    public String getEndDate() {
        return endDate;
    }

    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }

    public String getCaseNumber() {
        return caseNumber;
    }

    public void setCaseNumber(String caseNumber) {
        this.caseNumber = caseNumber;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCaseOwner() {
        return caseOwner;
    }

    public void setCaseOwner(String caseOwner) {
        this.caseOwner = caseOwner;
    }

    public String getStatus() {
        return status;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getIssue() {
        return issue;
    }

    public void setIssue(String issue) {
        this.issue = issue;
    }

    public String getDateOpened() {
        return dateOpened;
    }

    public void setDateOpened(String dateOpened) {
        this.dateOpened = dateOpened;
    }

    public String getResolution() {
        return resolution;
    }

    public void setResolution(String resolution) {
        this.resolution = resolution;
    }

    public String getFinalStatus() {
        return finalStatus;
    }

    public void setFinalStatus(String finalStatus) {
        this.finalStatus = finalStatus;
    }

    public double getTotalTimeTaken() {
        return totalTimeTaken;
    }

    public void setTotalTimeTaken(Double totalTimeTaken) {
        this.totalTimeTaken = totalTimeTaken;
    }

    public UserBean() {

    }

    public UserBean(String caseNumber, String caseOwner, String issue, int age, String reason, String dateOpened,
            String status, String finalStatus, String resolution, String startDate, String endDate,
            Double totalTimeTaken) {
        this.caseNumber = caseNumber;
        this.caseOwner = caseOwner;
        this.issue = issue;
        this.reason = reason;
        this.age = age;
        this.dateOpened = dateOpened;
        this.status = status;
        this.resolution = resolution;
        this.finalStatus = finalStatus;
        this.startDate = startDate;
        this.endDate = endDate;
        this.totalTimeTaken = totalTimeTaken;
    }
}

Controller.java(Servlet)

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.bean.UserBean;

import com.dao.DataDao;
import com.google.gson.Gson;

@WebServlet("/Controller")
public class Controller extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            // String id = request.getParameter("val");

            DataDao dataDao = new DataDao();
            ArrayList<UserBean> list = dataDao.getFrameWork();
            String searchList = new Gson().toJson(list);
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(searchList);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }
}

DBUtility.java

package com.dao;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtility {
    private static Connection connection = null;

    public static Connection getConnection() throws Exception {
        if (connection != null)
            return connection;
        else {
            // Store the database URL in a string
            String userName = "sa";
            String password = "T!ger123";
            String url = "jdbc:sqlserver:XXXXXX;DatabaseName=TEST";

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            // set the url, username and password for the databse
            connection = DriverManager.getConnection(url, userName, password);
            return connection;
        }
    }
}

DataDao.java

package com.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.bean.UserBean;

public class DataDao {
    private Connection connection;

    public DataDao() throws Exception {
        connection = DBUtility.getConnection();
    }

    public ArrayList<UserBean> getFrameWork() throws SQLException {
        ArrayList<UserBean> list = new ArrayList<UserBean>();
        PreparedStatement ps = null;
        try {

            ps = connection.prepareStatement("select * from statusTable");
            // ps.setString(1, frameWork);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                UserBean userBean = new UserBean();
                userBean.setCaseNumber(rs.getString(1));
                userBean.setCaseOwner(rs.getString(2));
                userBean.setStatus(rs.getString(3));
                userBean.setIssue(rs.getString(4));
                userBean.setReason(rs.getString(5));
                userBean.setDateOpened(rs.getString(6));
                userBean.setAge(rs.getInt(7));
                list.add(userBean);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return list;
    }
}

我刚开始使用 Ajax/Jquery/JSON 技术。我已经按照教程 How to use Servlets and Ajax? 进行操作作者:@BalusC。

这里我有 2 个疑问。

  1. 当我将下面的 block 放入 <head> 时,它不起作用。

    <script src="//code.jquery.com/jquery-1.10.2.js"></script>
    <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <script type="text/javascript" src="tableGenerator.js"></script>
    
  2. 当我将上面相同的代码放入<body>时,它向我抛出以下异常。

    将 varchar 值转换为 JDBC 数据类型 INTEGER 时出错。

当我做了sp_help statusTable时(这是相当于 Oracle 的 desc statusTable 的 sqlserver 查询)。我得到的结果如下面的屏幕截图所示。

enter image description here

无法理解哪里存在数据类型不匹配。

请让我知道我哪里出了问题以及如何解决。

谢谢

最佳答案

SQL Server 列出的列顺序与 JDBC 结果集中的列顺序之间似乎不匹配。特别是,第 7 列似乎与 Age 列不对应。

要检查哪个列名对应哪个列号,您可以使用结果集的元数据:

 ResultSetMetaData meta = rs.getMetaData();
 String name = meta.getColumnName(7);

这可能是更明智的选择:

  • 在查询中显式列出列名称,而不是使用 SELECT *;或
  • 通过指定列名称而不是索引号来检索数据。

关于您的第一个问题,如果您将 Javascript 放在 header 中,则 #somebutton clickhandler 会在元素加载到 DOM 之前实例化,因此它不起作用。

关于jquery - jsp中抛出的数据类型异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651581/

相关文章:

java - 使用 JSONArray 返回的值(整数)

javascript - json 数组,数组中返回错误?错误的字符串

javascript - JSON 访问数据 - 奇怪的行为

javascript - 如何将 $.get 的结果传递给另一个函数的返回

javascript - 在 Javascript 中插入图标​​ - PHP 下拉菜单

php - 我的 Ajax 没有将值传递到 php 页面

javascript - 如何知道点击了哪个链接/按钮,然后替换内容?

PHP 将每个元素追加到数组中

php - jquery ajax 从 php 脚本中获取的值不超过一个

javascript - $(this) 表单选择的值,具有相同字段名称的许多表单