`
iehyou
  • 浏览: 135446 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet 接受解析HTTP请求XML数据,返回XML

    博客分类:
  • J2EE
阅读更多
项目需要Servlet接受http提交过来的XML解析后,返回数据.

OutputStream output = null;
		HttpURLConnection conn = null;
		Document document = null;
        SAXReader reader = new SAXReader();
        URL _url;
		
		if (StringUtil.isNotEmpty(xml)) {
			try {
				_url = new URL(url);
				conn = (HttpURLConnection) _url.openConnection();
				conn.setDoOutput(true);
				conn.setRequestMethod("POST");
				output = conn.getOutputStream();
				output.write(xml.getBytes());
				output.flush();
				document = reader.read(new InputStreamReader(conn.getInputStream(), "GBK"));
				
				document.setXMLEncoding("GBK");
				return document.asXML();
			} catch (MalformedURLException e1) {
//				log.error(e1.toString());
				e1.printStackTrace();
			} catch (IOException e2) {
//				log.error(e2.toString());
				e2.printStackTrace();
			} catch (DocumentException e3) {
//				log.error(e3.toString());
				e3.printStackTrace();
			} finally {
	            try {
	            	if (output != null) {
	            		output.close();
	            	}
	            	if (conn != null) {
	            		conn.disconnect();
	            	}
				} catch (IOException e) {
					e.printStackTrace();
				}
	        }
		}
		return "";

服务器的Servlet使用DOM4J调用解析.原先的一个项目这样调用是可以的.
SAXReader reader = new SAXReader();
document = reader.read(request.getInputStream());

不知道什么原因报错了..
org.dom4j.DocumentException: Error on line -1 of document  : Premature end of file. Nested exception: Premature end of file.
at org.dom4j.io.SAXReader.read(SAXReader.java:482)
at org.dom4j.io.SAXReader.read(SAXReader.java:343)
at com.wasu.itv.web.servlet.ObjectServlet.execute(ObjectServlet.java:75)
at com.wasu.itv.web.servlet.ObjectServlet.doPost(ObjectServlet.java:66)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145)
at org.extremecomponents.table.filter.AbstractExportFilter.doFilter(Unknown Source)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:165)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:139)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2460)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:119)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:157)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:595)
Nested exception: 

查了很久,还是不知道什么原因引起的.环境也是和原先的一样.郁闷死了,只有想其他的方法了.通过调试查看request对象,发现xml还是被作为参数保存.参数名是"<?xml version",
就写成如下:
SAXReader reader = new SAXReader();
		StringBuffer doc=new StringBuffer("<?xml version=");
		doc.append(request.getParameter("<?xml version"));
		InputStream   inputStream   =   new   ByteArrayInputStream(doc.toString().getBytes());
		document = reader.read(inputStream);

下面就是解析XML和创建XML返回数据.
public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		Document document = null;
		SAXReader reader = new SAXReader();
		
		StringBuffer doc=new StringBuffer("<?xml version=");
		doc.append(request.getParameter("<?xml version"));
		InputStream   inputStream   =   new   ByteArrayInputStream(doc.toString().getBytes());
		XMLWriter writer = null; 
		Document resDoc=null;
		try {
			document = reader.read(inputStream);
			if (document!= null) {
				Node objectType=document.selectSingleNode("//req/objectType");
				Node objectTitle=document.selectSingleNode("//req/objectTitle");
				if(objectTitle!=null&&objectType!=null&&objectType.getText().equals(Constants.VOTE.toString())){
					voteManager=(VoteManagerImpl)SpringWebUtils.getApplicationContext(request).getBean("voteManager");
					List votes=voteManager.loadAllByQuery(objectTitle.getText(),null, null, null, null, null, null);
					VoteDTO dto=null;
					if(votes.size()>0){
						dto=(VoteDTO)votes.get(0);
						dto=voteManager.load(dto.getVoteId());
						List<VoteOpt> opts=dto.getVoteOpts();
						resDoc = DocumentHelper.createDocument();   
						Element resElement = resDoc.addElement("res");   
						Element codeElement = resElement.addElement("code");
						codeElement.setText("0");   
						Element descElement =resElement.addElement("desc");
						descElement.setText("查询成功");   
						Element otElement =resElement.addElement("objectTitle");
						otElement.setText(dto.getVoteTitle());   
						Element optionsElement =resElement.addElement("options");
						for (Iterator iterator = opts.iterator(); iterator
						.hasNext();) {
							VoteOpt opt = (VoteOpt) iterator.next();
							Element optionElement =optionsElement.addElement("option");
							
							Element optValueElement =optionElement.addElement("optValue");
							optValueElement.setText(opt.getOptValue());
							Element optNameElement =optionElement.addElement("optName");
							optNameElement.setText(opt.getOptName());
							Element optCountElement =optionElement.addElement("optCount");
							optCountElement.setText(opt.getOptCount().toString());
						}
					}
					else{
						resDoc=getErrorDocument("没有此主题");
					}
				}
				else{
					resDoc=getErrorDocument("请求主题类型不正确");
				}
			}
			else{
				resDoc=getErrorDocument("请求报文格式错误");
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
			log.error(ex.toString());	
			resDoc=getErrorDocument("请求处理出现错误:"+ex.toString());
		} finally {
			OutputFormat format = OutputFormat.createCompactFormat();   
			format.setEncoding("GBK");   
			writer = new XMLWriter(response.getOutputStream(),   
                    format); 
			writer.write(resDoc);   
            writer.close();   
			if (writer != null) {
				writer.close();
			}
		}
	}
	
	public Document getErrorDocument(String msg){
		Document resDoc = DocumentHelper.createDocument();   
		Element resElement = resDoc.addElement("res");   
		Element codeElement = resElement.addElement("code");
		codeElement.setText("-1");   
		Element descElement =resElement.addElement("desc");
		descElement.setText(msg);   
		return resDoc;
	}

分享到:
评论
1 楼 bmpbhg 2012-07-10  
和你的类似,不过我这边报的是
org.dom4j.DocumentException: Error on line 1 of document  : Premature end of file. Nested exception: Premature end of file.
而且时有时无,很是郁闷,用的是你第一种写法;
你现在找到原因了么?
不行我也试试你第二种写法;

相关推荐

    Servlet利用SAX解析XML文档

    3. **获取XML文件**:Servlet可能从HTTP请求的POST或GET参数中接收XML数据,或者从服务器上的文件系统中读取XML文件。使用`HttpServletRequest`对象来获取XML数据。 4. **创建SAX解析器**:使用`SAXParserFactory`...

    C#调用servlet 发送XML

    3. Servlet端配置接收POST请求并解析XML数据。 在实际应用中,可能还需要处理身份验证、错误处理、超时设置等细节。同时,为了提高效率和安全性,可以考虑使用异步操作、HTTPS以及合适的XML序列化/反序列化库。总之...

    (jsp+servlet+xml)xml绑定

    在项目"XMLhomework"中,很可能是设计了一个Web应用,用户通过JSP页面提交修改XML的请求,这些请求被Servlet捕获,处理后更新XML文件,然后可能将更新后的XML内容返回给JSP页面展示。JSP页面可能包含一些表单元素,...

    XML OVER HTTP的测试servlet

    1. **解析请求**:Servlet通过`HttpServletRequest`对象获取请求数据,包括XML数据。这可能涉及到读取请求体,因为XML通常作为POST请求的一部分发送。 2. **处理XML**:解析XML数据,可以使用Java的DOM(Document ...

    dxServlet.java处理Http Post的表单请求xml

    本文将深入探讨 `dxServlet.java` 文件中涉及的核心概念和技术细节,帮助开发者更好地理解如何在 Java Servlet 中处理 HTTP POST 请求携带的 XML 数据。 #### 核心知识点 1. **Servlet 的基本概念与功能** 2. **...

    Servlet读取XML文件实现JSP分页(新上传的含有源代码)

    当用户点击分页链接时,新的请求会被发送到Servlet,Servlet再次读取XML并返回对应页的数据。 在提供的`Pagination`压缩包中,应该包含了Servlet的Java源代码、XML数据文件,以及JSP页面的HTML和Java代码。通过研究...

    Servlet读取XML文件实现JSP简单分页

    通过遍历DOM树,Servlet可以轻松访问和操作XML数据。例如,找到包含分页信息的元素,如总记录数、每页记录数等。 4. **分页逻辑**: 分页的基本原理是根据用户请求的页码计算出应显示的数据范围。Servlet需要根据...

    Tocat中请求xml及解析,和hangler的机制与用法详解

    本篇文章将详细讲解如何在Tomcat服务器环境下请求XML数据,并进行解析,以及Handler机制和用法。 首先,让我们了解Tomcat。Tomcat是一款开源的Java Servlet容器,它是Apache软件基金会的Jakarta项目的一部分。...

    ajax练手程序,简单的异步交互,请求、解析xml等例子

    这个练手程序旨在帮助你理解并实践Ajax的基本用法,包括如何发起异步请求以及如何解析XML数据。** ### 1. Ajax基础概念 Ajax的核心是JavaScript对象XMLHttpRequest,它允许浏览器在后台与服务器进行数据交换。通过...

    Servlet报表+读取xml+flash

    2. Servlet接收到请求后,解析请求参数,确定需要展示的报表类型和数据。 3. Servlet读取指定的XML文件,使用DOM或SAX等解析器解析XML数据。 4. Servlet从XML中提取出报表数据,根据需求进行计算和处理。 5. Servlet...

    xml解析之天气预报

    这种级联选择可以通过Ajax异步请求实现,利用JavaScript库如jQuery向服务器发送XMLHttpRequest,服务器端使用Servlet处理请求,解析XML数据并返回响应。 在Servlet中,我们可以使用Java的内置XML解析库,如JAXB...

    AjaxWithServlet解析xm字符串及xml文件

    当Ajax请求到达Servlet时,Servlet会解析请求中的数据,然后对XML字符串或XML文件进行处理。 对于XML字符串的解析,JavaScript提供了DOM(Document Object Model)API。XML文档被解析为一个节点树,可以通过DOM方法...

    Servlet 工作原理解析

    Servlet 是 Java Web 技术的核心组件,它负责处理来自客户端(如浏览器)的请求并返回响应。要理解 Servlet 的工作原理,首先要了解Servlet容器,如Tomcat,因为Servlet是在容器中运行的。Servlet与Servlet容器之间...

    java实现xml的生成、解析等各种操作

    例如,用户发送一个包含XML数据的POST请求,servlet可以解析这个XML并根据内容执行相应的业务逻辑,然后返回结果,也可以生成XML响应。 ```java import javax.servlet.*; import javax.servlet.http.*; import java...

    jquery+servlet展示XML树形结构

    在本例中,Servlet接收来自前端的Ajax请求,读取XML文件,可能进行一些处理(如过滤、排序),然后将处理后的XML数据返回给前端。Servlet通过`doGet`或`doPost`方法处理HTTP请求,使用`response.getWriter().print()...

    Servlet读取XML文件实现JSP分页

    总的来说,Servlet读取XML文件实现JSP分页涉及了Java的文件I/O、XML解析、数据处理、HTTP请求处理和页面渲染等多个环节,是一个综合性的Web开发任务。通过这种方式,我们可以构建一个灵活且可扩展的分页系统,满足...

    servlet接收form表单提交的数据

    1. **解析请求**: 在Servlet的`doGet()`或`doPost()`方法中,我们可以获取请求参数。对于GET请求,使用`request.getParameter()`;对于POST请求,如果数据是标准的表单编码(application/x-www-form-urlencoded),...

    JSP与XML与Servlet帮助

    Servlet是Java中的一个接口,用于扩展服务器的功能,处理来自客户端的HTTP请求并返回响应。Servlet生命周期包括加载、初始化、服务、销毁四个阶段。开发者通过实现Servlet接口或者继承HttpServlet抽象类来创建自定义...

    请求响应案例资源xml

    - 压缩包中的"JavaWeb开发-请求响应案例"可能包含了具体的代码示例,演示了如何接收包含XML数据的HTTP请求,然后使用Java进行解析,并生成含有XML响应的JavaWeb应用。 - 案例可能涵盖了请求参数的获取、XML数据的...

    ajax + div +js +xml+ servlet 实现无限级动态目录树(原创)

    4. 数据返回:Servlet将XML数据以HTTP响应的形式返回给前端。 5. JavaScript解析:前端JavaScript接收到响应后,解析XML数据,动态生成新的Div节点,添加到DOM中,完成目录树的扩展。 在整个过程中,关键在于...

Global site tag (gtag.js) - Google Analytics