java - 从 servlet 中的查询结果返回 XML

标签 java oracle servlets sax

我正在尝试根据我的查询结果返回一个 XML 文件。我对此很陌生,所以我不确定我哪里出错了。这是执行此操作的现实方法还是更简单的方法?现在我得到了这些异常(exception):

Error performing query: javax.servlet.ServletException: org.xml.sax.SAXParseException: Content is not allowed in prolog.

如果我在 isql*plus 中运行我的查询,它会执行

import java.io.*;
import java.util.*;
import java.sql.*;           // JDBC packages
import javax.servlet.*;
import javax.servlet.http.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class step5 extends HttpServlet {

   public static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
   public static final String URL = "jdbc:odbc:rreOracle";
   public static final String username = "cm485a10";
   public static final String password = "y4e8f7s5";

   SAXParserFactory factory;

   public void init() throws ServletException {

      factory = SAXParserFactory.newInstance();
   }

   public void doGet (HttpServletRequest  request,
                      HttpServletResponse response)
      throws ServletException, IOException
      {
      PrintWriter out = response.getWriter();
      Connection con = null;

      try {

            Class.forName(DRIVER);

            con = DriverManager.getConnection(URL,username,password);

            try {
               Statement stmt = con.createStatement();
               ResultSet rs = stmt.executeQuery("SELECT sale_id, home_id, agent_id, customer_id FROM sale");

               String xml = "";
               xml = xml + "<sales_description>";
               xml = xml + "<sale>";

               boolean courseDataDone = false;
               while (rs.next()) {
                  String sale_id = rs.getString(1);
                  String home_id = rs.getString(2);
                  String agent_id = rs.getString(3);
                  String customer_id = rs.getString(4);

                  if (!courseDataDone) {
                     xml = xml + "<sale_id>" + sale_id + "</sale_id>" +
                                 "<home_id>" + home_id + "</home_id>" +
                                 "<agent_id>" + agent_id + "</agent_id>" +
                                 "<customer_id>" + customer_id + "</customer_id>" +
                                 "" +
                                 "";
                     courseDataDone = true;
                  }

               }

               xml = xml + "</sale>" +
                           "</sales_description>";

               try {
                  SAXParser parser = factory.newSAXParser();
                  InputSource input = new InputSource(new StringReader(xml));
                  parser.parse(input, new DefaultHandler());
               } catch (ParserConfigurationException e) {
                  throw new ServletException(e);
               } catch (SAXException e) {
                  throw new ServletException(e);
               }

               response.setContentType("text/xml;charset=UTF-8");
               out.write(xml);

            } catch(Exception ex) {
               out.println("Error performing query: " + ex);
               con.close();
               return;
            }

         } catch(Exception ex) {
            out.println("Error performing DB connection: " + ex);
            return;
         }

   }
}

如有任何帮助/提示,​​我们将不胜感激。

最佳答案

您错过了序言。将此添加到 XML 的开头:

<?xml version="1.0" encoding="UTF-8"?>

顺便说一下,这里不需要 SAX 解析器。您根本没有修改 XML。摆脱解析器,直接将 xml 写入响应。您也没有在 try-with-resources 中正确处理 JDBC 资源.这是改进的一个基本示例:

response.setContentType("text/xml;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
writer.append("<sales_description>");

try (
    Connection connection = dataSource.getConnection();
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT sale_id, home_id, agent_id, customer_id FROM sale");
) {
    if (resultSet.next()) {
        writer.append("<sale>");
        writer.append("<sale_id>").append(resultSet.getString("sale_id")).append("</sale_id>");
        writer.append("<home_id>").append(resultSet.getString("home_id")).append("</home_id>");
        writer.append("<agent_id>").append(resultSet.getString("agent_id")).append("</agent_id>");
        writer.append("</sale>");
    }
} catch (SQLException e) {
    throw new ServletException(e);
}

writer.append("</sales_description>");

要写入所有记录,只需将if (resultSet.next())替换为while (resultSet.next())即可。

为了更优雅地处理异常,即抛出一个以错误页面结束的 ServletException 而不是半生不熟的 XML,您需要使用 StringBuilder 构建 XML .只需将 PrintWriter 替换为 new StringBuilder(),然后在最后执行 response.getWriter().write(builder.toString())

关于java - 从 servlet 中的查询结果返回 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3484185/

相关文章:

java - 用于分析大型 Java 堆转储的工具

java - 这是 “unreachable statement”怎么样?

java - Spring JdbcTemplate 实现审计列的 @PrePersist 和 @PreUpdate

sql - 为什么 ORA_ROWSCN 可以在 SELECT 子句中使用,但不能在 GROUP BY 子句中使用

c# - 具有 Entity Framework 上下文的devart web api调用过程

java - ServletContext - 应用程序范围的 session 对象返回 null

java - 为什么 Java Collections 不能直接存储 Primitives 类型?

java - 优化Java代码以实现快速响应

java - 将请求参数从action方法发送到jsp

java - request.getRemoteHost() 是否返回浏览器主机的 IP?