上一節貼出了web應用訪問生成報告的action和service層的關鍵2個方法。並提到了調用了httpclient方法去執行報告服務器上的方法,從而返回數據流。下面主要是看報告服務器上的方法是怎麼樣的?
首先還是要說明一下,我們的web服務器都是linux環境,而之所以要用到httpclient和單獨的報告服務器就是解決jacob不支持linux服務器的問題,所以將生成word報告的工作交給了報告服務器去做,這樣無形也減輕了web應用服務器的壓力,下面從httpclient·反問開始:
如:httpclient·的url如下:
String url = "http://" + this.getRepIpUrl() + "/infoDisposal/creatdocrep.action?docType=" + docType + "&projectId=" + projectId + "&userId=" + userId + "&workgroupId=" + workgroupId + "&evtcaseInstId=" + evtcaseInstId;
注:這裏可以使用https也是可以的,看項目需要怎麼配置
然後我跟着這個地址找到了報告服務器上的類和方法:
找到了creatDocRep.action
其方法如下:
/**
* 獲取文件流對象
* @param inputPath
* @return InputStream 文件流對象
* @throws Exception
*/
public InputStream getInputStream(){
InputStream inputStream = null;
Map<String,String> paramMap = new HashMap<String,String>();
//獲取模版類型
String docType = Struts2Utils.getParameter("docType");
Integer docType_i = 0;
if(CommonUtils.isNotNull(docType)){
docType_i = Integer.parseInt(docType);
}
//獲取用戶id
String userId = Struts2Utils.getParameter("userId");
//MAP對象參數
String projectId = Struts2Utils.getParameter("projectId");
//獲取參數MAP
paramMap.put("project_id", projectId);
//獲取組組編號參數
String workgroupId = Struts2Utils.getParameter("workgroupId");
if(CommonUtils.isNotNull(workgroupId) && !workgroupId.equals("null")){
paramMap.put("workgroupId", workgroupId);
}
//獲取評估用例實例ID參數
String evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
if(CommonUtils.isNotNull(evtcaseInstId)){
paramMap.put("evtcase_inst_id", evtcaseInstId);
}
if(CommonUtils.isNotNull(userId)){
paramMap.put("userId", userId);
}
//獲取模版路徑
String xmlTempUrl = xmlPathDef.getXmlPath(docType);
//設置打開word模版路徑
String docPath = "";
//取得對應的模版路徑
TTemplIdx templIdx = templIdxService.findFileByType(Integer.parseInt(XmlPathDef.TEMPL_IDX_1),Integer.parseInt(docType));
if(templIdx != null){
docPath = xmlPathDef.getPath(XmlPathDef.getBasePath() + templIdx.getTemplFileName());
try {
String outPath = infoSystemDescService.showWordRp(xmlTempUrl, docType_i, paramMap, docPath);
if(CommonUtils.isNotNull(outPath)){
inputStream = ServletActionContext.getServletContext().getResourceAsStream(xmlPathDef.getRealRepPath(outPath,projectId,docType,workgroupId));
}
} catch (Exception e) {
logger.error("沒有創建成功");
e.printStackTrace();
}
}
return inputStream;
}
然後再看service層方法:
/**
* 生成報告(doc文檔)
* @param xmlTempUrl 模版路徑
* @param docType 要生成的報告類型
* @param paramMap 報告參數
* @param webName 要展示的報告名稱
* @param filename 報告文件名稱
* @param docId 報告文件主鍵
* @param version 報告文件版本
* @param docPath 報告路徑
* @param outRepPath 報告生成的路徑
* @return
* @throws Exception
*/
public String showWordRp(String xmlTempUrl,Integer docType,Map<String,String> paramMap,String docPath) throws Exception {
boolean boo= true;
String outRepPath = "";
try {
Long projectId = 0l;
Long workgroupId =0l;
String evtcaseInstId ="";
String userId ="";
Set<Entry<String, String>> sets = paramMap.entrySet();
Iterator<Entry<String, String>> it = sets.iterator();
while (it.hasNext()) {
Map.Entry<String,String> entry = (Map.Entry<String,String>) it.next();
String key = entry.getKey();
if(key.equals("project_id")){
projectId = Long.parseLong(entry.getValue().toString());
}else if(key.equals("workgroupId")){
workgroupId = Long.parseLong(entry.getValue().toString());
}else if(key.equals("evtcase_inst_id")){
evtcaseInstId = entry.getValue();
}else if(key.equals("userId")){
userId = entry.getValue();
}
}
//獲取Web項目名稱
//String webName = XmlPathDef.getWebName();
//獲取文檔表的最大主鍵值
String docId = this.getMaxDocId(docType, workgroupId.toString(),projectId.toString());
//獲取最大版本
String version = this.getMaxVersion(userId, docType, projectId, workgroupId.toString(), evtcaseInstId);
//獲取生成後的文檔名稱
String filename = this.getFileName(docType, projectId,docId,version);
//獲取生成後的文檔路徑
outRepPath = xmlPathDef.getPath(xmlPathDef.getCreatWordPath(userId, docType.toString(), projectId.toString(),workgroupId.toString()) + filename);
//取得標籤所對應的所有Map值
HashMap<String,Object> map = this.getAllData(xmlTempUrl, paramMap,docType.toString());
//省去了相關的業務操作..............
try {
System.out.println(" **************************報告類型爲 ---> docType: "+ docType);
Export2WordService export2WordService = new Export2WordService();
//System.out.println("*************** 開始調用 export2Word 方法 ********** 執行到InfoSystemDescService類 ");
boo = export2WordService.export2Word(docPath,outRepPath,map,docType.toString(),tbmap,tbvalue,testMap0,projectId,collect_feedback_auditValueMap,sccDatas,contentMap,sccContentMap,proEvtType);
//System.out.println("*************** 調用 export2Word 完畢方法 開始去向數據庫中添加數據 ********** 執行到InfoSystemDescService類 ");
if(boo){//說明創建報告成功,然後保存到數據庫
if(CommonUtils.isNotNull(docId)){
//生成後的word文檔對象
TProjDoc doc = new TProjDoc();
//設置需要保存的參數
doc.setDocId(docId);
doc.setDispName(repName);
doc.setFilename(filename);
doc.setPath(xmlPathDef.getRealRepPath(outRepPath,projectId.toString(),docType.toString(),workgroupId.toString()));//對應數據庫中的相對路徑
doc.setType(docType);
doc.setVersion(Integer.parseInt(version));
doc.setCreateTime(new Timestamp(System.currentTimeMillis()));
doc.setSuffix(Short.parseShort("2"));
TProject proj = new TProject();
proj.setProjectId(projectId);
doc.setTProject(proj);
doc.setUserId(userId);
doc.setWorkgroupId(workgroupId);
doc.setEvtcaseInstId(evtcaseInstId);
projDocDao.save(doc);
}
}else{
//如果沒有創建成功就刪除原來的文件
File file = new File(outRepPath);
file.delete();
}
} catch (Exception e) {
logger.error("創建 Word.Application 失敗!" + e.getMessage());
}
} catch (Exception e) {
logger.error("創建報告失敗!" + e.getMessage());
e.printStackTrace();
}
return outRepPath;
}
1.調用工具類來解析XML定義文檔,並獲取到數據集Map
2.調用jacob的封裝類,根據相關的數據集生成word報告
3,一旦word穿件成功,就往數據庫中寫入一條記錄
(未完待續)