- - PR -
サーブレットによるXMLデータのレスポンス方法について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-02-28 21:56
JAVAを勉強中です。つまらない質問ですがご教授お願いします
サーブレットを使用してMySQLより取得したデータをXML形式で表示させたいと思うのですが ((XmlDocument)doc).write(writer,encoding.toString()); の処理のところで : at java.lang.Thread.run(Unknown Source)が出力されます 発環境 ・OS:Windows2000 Server ・jakarta-tomcat-4.1.30 ・j2sdk-1_4_2_04 ・wtp-all-in-one-sdk-1.0 初心で汚いソースではありますが下記にソースを記載いたします。 どうかご教授よろしくお願いいたいます。 PS.他に方法などありましたら教えて下さい ------------------------------------------------------- package hoge; import java.io.IOException; import java.io.StringWriter; import java.sql.*; import javax.sql.DataSource; import java.sql.Connection; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.crimson.tree.XmlDocument; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; public class samp{ public Statement stat; public int i = 0; public ResultSetMetaData rm = null; public ResultSet rs = null; samp(DataSource dss){ DataSource dsr = (DataSource)dss; try { Connection con = dsr.getConnection(); stat = con.createStatement(); } catch (SQLException e) { e.printStackTrace(); } } public String firstsqlGet() throws ParserConfigurationException, IOException{ String encoding = "Shift-JIS"; StringWriter writer = new StringWriter(); String Reslf = null; try{ rs = stat.executeQuery("SELECT * FROM TEST"); rm = rs.getMetaData(); i = rm.getColumnCount(); xmlNode xml = new xmlNode(); xml.init(); Element root = xmlNode.doc.createElement("root"); xmlNode.doc.appendChild(root); while(rs.next()){ Element elm = xmlNode.doc.createElement("FIL"); root.appendChild(elm); for(int n=1; n<=i; n++){ Element el = xmlNode.doc.createElement(rm.getColumnName(n).toString()); Text txt = xmlNode.doc.createTextNode(rs.getObject(n).toString()); el.appendChild(txt); elm.appendChild(el); } } Reslf = xmlNode.xmlWriteString(encoding,writer); } catch(Exception e){ e.printStackTrace(); } return Reslf; } } class xmlNode { DocumentBuilderFactory dbf; DocumentBuilder db; DOMImplementation domi; static Document doc; static org.apache.crimson.tree.XmlDocument xdoc; static Element root; public void init(){ dbf = DocumentBuilderFactory.newInstance(); try { db = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } domi = db.getDOMImplementation(); doc = db.newDocument(); } static String xmlWriteString( String encoding, StringWriter writer){ try { ((XmlDocument)doc).write(writer,encoding.toString()); ← ここでエラー } catch (IOException e) { e.printStackTrace(); } String result = writer.toString(); return result; } } | ||||
|
投稿日時: 2006-03-01 00:23
肝心なところをわざわざ省略しないで、スタックトレースを全部載せてください。 | ||||
|
投稿日時: 2006-03-01 09:24
大変もうしわけありませんでした
スタックトレースを記載いたします よろしくお願いいたします java.lang.ClassCastException at hoge.xmlNode.xmlWriteString(samp.java:96) at hoge.samp.firstsqlGet(samp.java:61) at hoge.postServlet.doPost(postServlet.java:54) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Unknown Source) | ||||
|
投稿日時: 2006-03-01 13:04
エラーの一番下でなくて一番上が問題でしょう。
>java.lang.ClassCastException >at hoge.xmlNode.xmlWriteString(samp.java:96) Document doc; を XmlDocument doc; として扱(cast)おうとしたけど、できなかった。 というエラーです。 はずしてるかもしれませんが http://java-house.jp/ml/archive/j-h-b/044051.html は参考になりませんか? | ||||
|
投稿日時: 2006-03-01 15:04
まんま書いてあるとおりdocがXmlDocument型のオブジェクトではないのでキャストできない、
ということですね。この質問に答えるのは実は3回目です http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18325&forum=12 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13263&forum=12 | ||||
|
投稿日時: 2006-03-02 09:56
的確なご指導有難うございました。沢山事例がありました。調査不足で申し訳ありません
方法といたしましては、 javax.xml.transform.Transformer. transform(Source xmlSource, Result outputTarget) を使用し問題解決する事ができました。 同時にご確認したいことがあります レスポンスの送信を作成したxmlSourceの内容としたい場合、 javax.xml.transform.Result res = new StreamResult(response.getWriter()); transform(xmlSource, res) で実装する事はできたのですが、この方法でよろしいのでしょうか? 最終的にやりたい事は、生成されてXMLデータを CURLにて取得しデータとして処理させたい事です。 |
1