需求:
网上投诉建议接口,将投诉内容封装成xml格式生成xml文件到服务器,并读取该文件调用其他接口实现投诉建议功能
技术:
1.webservice方式
2.流的应用
3.独立获取request对象,使用ThreadLocal获取
4.xml与实体时间的转换
代码:
实体的拼装:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(value=XmlAccessType.FIELD) //访问类型改为字段
public class PROPERTIES {
@XmlElement
private String DOCID;
@XmlElement
private String DOCVERSION;
@XmlElement
private String DOCTYPE;
@XmlElement
private String DOCPUBTIME;
@XmlElement
private String CRUSER;
@XmlElement
private String CRTIME;
@XmlElement
private String DOCFLAG;
@XmlElement
private String ATTRIBUTE;
@XmlElement
private String ATTACHPIC;
@XmlElement
private String DOCLINK;
@XmlElement
private String DOCFILENAME;
@XmlElement
private String DOCCHANNEL;
@XmlElement
private String DOCTITLE;
@XmlElement
private String DOCPEOPLE;
@XmlElement
private String DOCSOURCENAME;
@XmlElement
private String DOCSTATUS;
@XmlElement
private String DOCCONTENT;
@XmlElement
private String DOCHTMLCON;
@XmlElement
private String DOCWORDSCOUNT;
@XmlElement
private String DOCABSTRACT;
@XmlElement
private String DOCKEYWORDS;
@XmlElement
private String DOCAUTHOR;
@XmlElement
private String DOCRELTIME;
@XmlElement
private String TITLECOLOR;
@XmlElement
private String SUBDOCTITLE;
@XmlElement
private String EDITOR;
@XmlElement
private String CHNLNAME;
public String getDOCID() {
return DOCID;
}
public void setDOCID(String dOCID) {
DOCID = dOCID;
}
public String getDOCVERSION() {
return DOCVERSION;
}
public void setDOCVERSION(String dOCVERSION) {
DOCVERSION = dOCVERSION;
}
public String getDOCTYPE() {
return DOCTYPE;
}
public void setDOCTYPE(String dOCTYPE) {
DOCTYPE = dOCTYPE;
}
public String getDOCPUBTIME() {
return DOCPUBTIME;
}
public void setDOCPUBTIME(String dOCPUBTIME) {
DOCPUBTIME = dOCPUBTIME;
}
public String getCRUSER() {
return CRUSER;
}
public void setCRUSER(String cRUSER) {
CRUSER = cRUSER;
}
public String getCRTIME() {
return CRTIME;
}
public void setCRTIME(String cRTIME) {
CRTIME = cRTIME;
}
public String getDOCFLAG() {
return DOCFLAG;
}
public void setDOCFLAG(String dOCFLAG) {
DOCFLAG = dOCFLAG;
}
public String getATTRIBUTE() {
return ATTRIBUTE;
}
public void setATTRIBUTE(String aTTRIBUTE) {
ATTRIBUTE = aTTRIBUTE;
}
public String getATTACHPIC() {
return ATTACHPIC;
}
public void setATTACHPIC(String aTTACHPIC) {
ATTACHPIC = aTTACHPIC;
}
public String getDOCLINK() {
return DOCLINK;
}
public void setDOCLINK(String dOCLINK) {
DOCLINK = dOCLINK;
}
public String getDOCFILENAME() {
return DOCFILENAME;
}
public void setDOCFILENAME(String dOCFILENAME) {
DOCFILENAME = dOCFILENAME;
}
public String getDOCCHANNEL() {
return DOCCHANNEL;
}
public void setDOCCHANNEL(String dOCCHANNEL) {
DOCCHANNEL = dOCCHANNEL;
}
public String getDOCTITLE() {
return DOCTITLE;
}
public void setDOCTITLE(String dOCTITLE) {
DOCTITLE = dOCTITLE;
}
public String getDOCPEOPLE() {
return DOCPEOPLE;
}
public void setDOCPEOPLE(String dOCPEOPLE) {
DOCPEOPLE = dOCPEOPLE;
}
public String getDOCSOURCENAME() {
return DOCSOURCENAME;
}
public void setDOCSOURCENAME(String dOCSOURCENAME) {
DOCSOURCENAME = dOCSOURCENAME;
}
public String getDOCSTATUS() {
return DOCSTATUS;
}
public void setDOCSTATUS(String dOCSTATUS) {
DOCSTATUS = dOCSTATUS;
}
public String getDOCCONTENT() {
return DOCCONTENT;
}
public void setDOCCONTENT(String dOCCONTENT) {
DOCCONTENT = dOCCONTENT;
}
public String getDOCHTMLCON() {
return DOCHTMLCON;
}
public void setDOCHTMLCON(String dOCHTMLCON) {
DOCHTMLCON = dOCHTMLCON;
}
public String getDOCWORDSCOUNT() {
return DOCWORDSCOUNT;
}
public void setDOCWORDSCOUNT(String dOCWORDSCOUNT) {
DOCWORDSCOUNT = dOCWORDSCOUNT;
}
public String getDOCABSTRACT() {
return DOCABSTRACT;
}
public void setDOCABSTRACT(String dOCABSTRACT) {
DOCABSTRACT = dOCABSTRACT;
}
public String getDOCKEYWORDS() {
return DOCKEYWORDS;
}
public void setDOCKEYWORDS(String dOCKEYWORDS) {
DOCKEYWORDS = dOCKEYWORDS;
}
public String getDOCAUTHOR() {
return DOCAUTHOR;
}
public void setDOCAUTHOR(String dOCAUTHOR) {
DOCAUTHOR = dOCAUTHOR;
}
public String getDOCRELTIME() {
return DOCRELTIME;
}
public void setDOCRELTIME(String dOCRELTIME) {
DOCRELTIME = dOCRELTIME;
}
public String getTITLECOLOR() {
return TITLECOLOR;
}
public void setTITLECOLOR(String tITLECOLOR) {
TITLECOLOR = tITLECOLOR;
}
public String getSUBDOCTITLE() {
return SUBDOCTITLE;
}
public void setSUBDOCTITLE(String sUBDOCTITLE) {
SUBDOCTITLE = sUBDOCTITLE;
}
public String getEDITOR() {
return EDITOR;
}
public void setEDITOR(String eDITOR) {
EDITOR = eDITOR;
}
public String getCHNLNAME() {
return CHNLNAME;
}
public void setCHNLNAME(String cHNLNAME) {
CHNLNAME = cHNLNAME;
}
}
package com.ylzinfo.psBusiness.checkAuthor.dto;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(value=XmlAccessType.FIELD) //访问类型改为字段
public class WCMDOCUMENT {
@XmlElement
private PROPERTIES PROPERTIES;
@XmlAttribute(name="Version")
private String Version;// 本子集属性
public PROPERTIES getPROPERTIES() {
return PROPERTIES;
}
public void setPROPERTIES(PROPERTIES pROPERTIES) {
PROPERTIES = pROPERTIES;
}
public String getVersion() {
return Version;
}
public void setVersion(String version) {
Version = version;
}
}
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "WCMDOCUMENTS") // XML文件中的根标识
@XmlAccessorType(value=XmlAccessType.FIELD) //访问类型改为字段
public class WCMDOCUMENTS {
@XmlElement
private List<WCMDOCUMENT> WCMDOCUMENT;
public List<WCMDOCUMENT> getWCMDOCUMENT() {
return WCMDOCUMENT;
}
public void setWCMDOCUMENT(List<WCMDOCUMENT> wCMDOCUMENT) {
WCMDOCUMENT = wCMDOCUMENT;
}
}
工具类的应用:
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import com.ylzinfo.util.HttpRequest;
public class SingtonRequest implements ServletRequestListener{
private static ThreadLocal<HttpServletRequest> httpServletRequestHolder =
new ThreadLocal<HttpServletRequest>();
@Override
public void requestInitialized(ServletRequestEvent requestEvent) {
HttpServletRequest request = (HttpServletRequest) requestEvent.getServletRequest();
httpServletRequestHolder.set(request); // 绑定到当前线程
}
@Override
public void requestDestroyed(ServletRequestEvent requestEvent) {
httpServletRequestHolder.remove(); // 清理资源引用
}
public static HttpServletRequest getHttpServletRequest() {
return httpServletRequestHolder.get();
}
}
/**
* 将对象直接转换成String类型的 XML输出
*
* @param obj
* @return
*/
public static String objToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
return sw.toString();
}
/**
* 将String类型的xml转换成对象
*/
public static Object XmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
package com.ylzinfo.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class CMyFile {
public static byte[] readBytesFromFile(String filePath) {
FileInputStream fileInputStream = null;
byte[] bytesArray = null;
try {
File file = new File(filePath);
bytesArray = new byte[(int) file.length()];
//read file into bytes[]
fileInputStream = new FileInputStream(file);
fileInputStream.read(bytesArray);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bytesArray;
}
}
正式的接口调用类:
public class MhwebAdviceService extends AbstractService{
public String importDoc(String sZipFile){
String sTargetEndpointAddress = "http://ip:port/。。";
ResponseEntity resEntity = new ResponseEntity();
resEntity.setParaName(new String[]{"showtype"});
resEntity.setParaValue(new String[]{"1"});
// 记录集
ResultSet resultSet = new ResultSet();
// 设置数据集的属性
resultSet.setName("list01");// 数据集名称
resultSet.setView(false);// 数据集是否有对应的数据库表
resultSet.setTableName("");// 数据集对应的数据库表的名称
String columnName = "返回结果:result";
resultSet.setColumns(columnName);
resultSet.setTotalNum(2);// 符合查询条件的记录有1条。(分页查询使用)
List<HashMap<String, String>> result = new ArrayList<HashMap<String,String>>();
HashMap<String, String> hm = new HashMap<String, String>();
String msg="";
Service service = new Service();
Call call = null;
try {
call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(sTargetEndpointAddress));
call.setOperationName(new QName("http://www.sx.hrss.gov.cn/wcm/services/trswcm:ImportService","importDocuments"));
call.invoke(new Object[] {CMyFile.readBytesFromFile(sZipFile), "zip"});
} catch (Exception e) {
e.printStackTrace();
hm.put("result",e.toString());
result.add(hm);
resultSet.setResultSet(result);
resEntity.setResultSet(resultSet);
msg = ReaderSoapXmlOut.readerSoapXMLOut(resEntity);
System.out.println("msg------"+msg);
return msg;
}
hm.put("result","操作成功");
result.add(hm);
resultSet.setResultSet(result);
resEntity.setResultSet(resultSet);
msg = ReaderSoapXmlOut.readerSoapXMLOut(resEntity);
System.out.println("msg------"+msg);
return msg;
}
public String createRequestFile(String CRTIME,String DOCCHANNEL
,String CHNLNAME,String username,String sex,String phonenumber,
String email,String address,String realdate,String content,
String fenlei,String department,String title) throws Exception {
WCMDOCUMENTS wcdocuments=new WCMDOCUMENTS();
List<WCMDOCUMENT> listDucument=new ArrayList<WCMDOCUMENT>();
WCMDOCUMENT wcdocument=new WCMDOCUMENT();
wcdocument.setVersion("6.0");
PROPERTIES properties=new PROPERTIES();
properties.setDOCID("0");
properties.setDOCVERSION("0");
properties.setDOCTYPE("10");
properties.setDOCPUBTIME("");
properties.setCRUSER("CDATA[system]");
properties.setCRTIME(CRTIME);
properties.setDOCFLAG("1");
properties.setATTRIBUTE("[CDATA[IP=提交ip&RandomSerial=查询编码]");
properties.setATTACHPIC("0");
properties.setDOCLINK("");
properties.setDOCFILENAME("");
properties.setDOCCHANNEL(DOCCHANNEL);
properties.setDOCTITLE("<CDATA[标题]");
properties.setDOCPEOPLE("");
properties.setDOCSOURCENAME("");
properties.setDOCSTATUS("1");
String contentXML="";
DocContent doc=new DocContent();
doc.setUsername(username);
doc.setSex(sex);
doc.setRealdate(realdate);
doc.setAddress(address);
doc.setDepartment(department);
doc.setContent(content);
doc.setEmail(email);
doc.setTitle(title);
doc.setPhonenumber(phonenumber);
doc.setFenlei(fenlei);
String docToXml = RXMLUtil.objToXml(doc);
System.out.println("docToXml="+docToXml);
docToXml = docToXml.replaceAll("encoding=\"UTF-8\" standalone=\"yes\"?", "encoding=\"UTF-8\"")
.replaceAll("<DocContent>", "").replaceAll("</DocContent>", "");
System.out.println("docToXml处理后=\n"+docToXml);
properties.setDOCCONTENT(docToXml);
properties.setDOCHTMLCON("");
properties.setDOCWORDSCOUNT("");
properties.setDOCABSTRACT("");
properties.setDOCKEYWORDS("");
properties.setDOCAUTHOR("");
properties.setDOCRELTIME(CRTIME);
properties.setTITLECOLOR("");
properties.setSUBDOCTITLE("");
properties.setEDITOR("");
properties.setCHNLNAME(CHNLNAME);
wcdocument.setPROPERTIES(properties);
listDucument.add(wcdocument);
wcdocuments.setWCMDOCUMENT(listDucument);
String wcdocumentsToXml = RXMLUtil.objToXml(wcdocuments);
System.out.println("wcdocumentsToXml="+wcdocumentsToXml);
wcdocumentsToXml = wcdocumentsToXml.replaceAll("encoding=\"UTF-8\" standalone=\"yes\"?", "encoding=\"UTF-8\"")
.replaceAll("<", "<").replaceAll(">", ">");
byte[] bytes=null;
DataOutputStream dataOs =null;
ZipOutputStream zipOut =null;
ByteArrayInputStream bin =null;
ByteArrayOutputStream baos =null;
String filepath="";
try {
bytes = wcdocumentsToXml.getBytes("utf-8");
System.out.println("wcdocumentsToXml处理后=\n"+wcdocumentsToXml);
HttpServletRequest request = SingtonRequest.getHttpServletRequest();
filepath= request.getSession().getServletContext().getRealPath("/");
Date date = new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss-S");
String formatime = sdf.format(date);
filepath=filepath+"advicefile\\"+formatime+".zip";
// filepath="D://advicefile//"+formatime+".zip";
bin = new ByteArrayInputStream(bytes);
baos = new ByteArrayOutputStream();//字符串输出流
int len = 0;
while ((len = bin.read(bytes)) != -1) {
baos.write(bytes, 0, len);
}
//声明ZipOutputStream,用来输出zip文件。
zipOut = new ZipOutputStream(new FileOutputStream(filepath)); //zip流包装
ZipEntry zipEntry = new ZipEntry(formatime+"wcdocumentsToXml.xml");
//将entry加入到zipOut中。
zipOut.putNextEntry(zipEntry);
//利用DataOutputStream对ZipOutputStream进行包装。
dataOs = new DataOutputStream(zipOut);
//输出zip文件。
dataOs.write(bytes);
// importDoc(filepath);
System.out.println("filepath="+filepath);
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);
}finally{
if (dataOs!=null) {
try {
dataOs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (zipOut!=null) {
try {
zipOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (baos!=null) {
try {
baos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (bin!=null) {
try {
bin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return filepath;
}
}