/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.web.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.exception.ExceptionEncoder;
import com.jinhe.tss.core.sso.context.RequestContext;
import com.jinhe.tss.core.util.XMLDocUtil;
import com.jinhe.tss.core.web.RewriteableHttpServletRequest;
import com.jinhe.tss.core.web.dispaly.XmlPrintWriter;
import com.jinhe.tss.core.web.dispaly.xmlhttp.XmlHttpDecoder;
import com.jinhe.tss.core.web.wrapper.RewriteableHttpServletRequestWrapper;
/**
* <p> MultiRequestServlet.java </p>
* 解析合并请求的Servlet。
*
*@see com.jinhe.tss.core.web.servlet.SSOIntegrateTest
*/
public class MultiRequestServlet extends HttpServlet {
private static final long serialVersionUID = 2840752639965867560L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
XmlPrintWriter writer = new XmlPrintWriter(response.getWriter());
writer.println("<Responses>");
List<Element> requestNodes = XMLDocUtil.selectNodes(parseRequestXML(request), "/Requests/Request");
if (requestNodes != null) {
for (Element requestNode : requestNodes) {
String servletPath = requestNode.attributeValue("url"); //获取子请求的ServletPath
RewriteableHttpServletRequest rRequest = RewriteableHttpServletRequestWrapper.getRewriteableHttpServletRequest(request);
rRequest.setHeader(RequestContext.MULTI_REQUEST, "true");
rRequest.setServletPath(servletPath);
XmlHttpDecoder.decode(requestNode, rRequest);
RequestDispatcher rd = request.getRequestDispatcher(servletPath);
try {
// 将多个单功能的文件例如.jsp文件、servlet请求 整合成一个总的Servlet文件,相当于:jsp中 include file="xyz.jsp"
rd.include(rRequest, response);
} catch (Exception e) {
ExceptionEncoder.encodeException(response, e);
}
}
}
writer.println("</Responses>");
}
/**
* <p>
* 解析合并请求xml数据流
* </p>
*
* @param request
*/
private Document parseRequestXML(HttpServletRequest request) {
try {
ServletInputStream is = request.getInputStream();
SAXReader saxReader = new SAXReader();
try {
return saxReader.read(is);
} catch (DocumentException e) {
throw new BusinessException("解析合并请求的xml数据流失败", e);
} finally {
is.close();
}
} catch (IOException e) {
throw new BusinessException("获取合并请求数据流失败", e);
}
}
}