springboot+freemarker导出word

最近做了各项目,需求上写着富文本导出,我这暴脾气直接把需求丢给前端,让他们使用html5导出。后来…,反正就是不行,必须用后台导出。没办法只能写一个,直接上代码吧。
项目准备 核心html解析包

org.jsoup
jsoup
1.7.3

核心代码
package com.information.platform.utils.word.xml;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @Description:富文本Html处理器,主要处理图片及编码
 * 
 */
public class RichHtmlHandler {

private Document doc = null;
private String html;

private String docSrcParent = "blogTemplate.files";     //在 template.ftl 文件里面找到,检索 “Content-Location”
private String docSrcLocationPrex = "file:///C:/213792E5";   //在 template.ftl 文件里面找到,检索 “Content-Location”
private String nextPartId = "01D349D2.A93551C0";     //在paper.ftl文件里面找到,最末行
private String shapeidPrex = "_x56fe__x7247__x0020";
private String spidPrex = "_x0000_i";
private String typeid = "#_x0000_t75";

private String handledDocBodyBlock;
private List<String> docBase64BlockResults = new ArrayList<String>();
private List<String> xmlImgRefs = new ArrayList<String>();

private String srcPath = "";

public RichHtmlHandler(){}

public String getDocSrcLocationPrex() {
	return docSrcLocationPrex;
}

public void setDocSrcLocationPrex(String docSrcLocationPrex) {
	this.docSrcLocationPrex = docSrcLocationPrex;
}

public String getNextPartId() {
	return nextPartId;
}

public void setNextPartId(String nextPartId) {
	this.nextPartId = nextPartId;
}

/**
 * 获取被被转化的富文本内容
 * @createUser shandianlala
 * @createDate 2017年10月21日
 * @return
 */
public String getHandledDocBodyBlock() {
	String raw=   WordHtmlGeneratorHelper.string2Ascii(doc.getElementsByTag("body").html());
	return raw.replace("=3D", "=").replace("=", "=3D");
}

public String getRawHandledDocBodyBlock() {
	String raw=  doc.getElementsByTag("body").html();
	return raw.replace("=3D", "=").replace("=", "=3D");
}
public List<String> getDocBase64BlockResults() {
	return docBase64BlockResults;
}

public List<String> getXmlImgRefs() {
	return xmlImgRefs;
}

public String getShapeidPrex() {
	return shapeidPrex;
}

public void setShapeidPrex(String shapeidPrex) {
	this.shapeidPrex = shapeidPrex;
}

public String getSpidPrex() {
	return spidPrex;
}

public void setSpidPrex(String spidPrex) {
	this.spidPrex = spidPrex;
}

public String getTypeid() {
	return typeid;
}

public void setTypeid(String typeid) {
	this.typeid = typeid;
}

public String getDocSrcParent() {
	return docSrcParent;
}

public void setDocSrcParent(String docSrcParent) {
	this.docSrcParent = docSrcParent;
}

public String getHtml() {
	return html;
}

public void setHtml(String html) {
	this.html = html;
}

public RichHtmlHandler(String html, String srcPath) {
	this.html = html;
	this.srcPath = srcPath;
	doc = Jsoup.parse(wrappHtml(this.html));
	try {
		handledHtml(false);
	} catch (IOException e) {
		
		e.printStackTrace();
	}
}

public void re_init(String html){
	doc=null;
	doc = Jsoup.parse(wrappHtml(html));
	docBase64BlockResults.clear();
	xmlImgRefs.clear();
}

/**
 *  获得已经处理过的HTML文件
 * @param isWebApplication
 * @return String
 * @throws IOException 
 * @throws
 */
public void handledHtml(boolean isWebApplication)
		throws IOException {
	//给html中的table边框加上默认颜色
	Elements tables = doc.getElementsByTag("table");
	for (Element element : tables) {
		element.attr("style", "border: 1px solid #ccc;border-left: 1px solid #ccc;");
		Elements th = element.select("th");
		th.attr("style", "border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;");
		Elements td = element.select("td");
		td.attr("style", "border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; padding: 3px 5px;text-align: center;");
	}
	Elements imags = doc.getElementsByTag("img");
	if (imags == null || imags.size() == 0) {
		// 返回编码后字符串
		return;
		//handledDocBodyBlock = WordHtmlGeneratorHelper.string2Ascii(html);
	}

	// 转换成word mht 能识别图片标签内容,去替换html中的图片标签
	for (Element item : imags) {
		// 把文件取出来
		String src = item.attr("src");
		String srcRealPath = srcPath + src;
		System.out.println(srcRealPath);

		}
		
		File imageFile = new File(srcRealPath);
		String imageFielShortName = imageFile.getName();
		String fileTypeName = WordImageConvertor.getFileSuffix(srcRealPath);

		String docFileName = "image" + UUID.randomUUID().toString() + "."+ fileTypeName;
		String srcLocationShortName = docSrcParent + "/" + docFileName;

		String styleAttr = item.attr("style"); // 样式
		//高度
		String imagHeightStr=item.attr("height");
		if(StringUtils.isEmpty(imagHeightStr)){
			imagHeightStr = getStyleAttrValue(styleAttr, "height");
		}
		//宽度
		String imagWidthStr=item.attr("width");;
		if(StringUtils.isEmpty(imagWidthStr)){
			imagWidthStr = getStyleAttrValue(styleAttr, "width");
		}

		imagHeightStr = imagHeightStr.replace("px", "");
		imagWidthStr = imagWidthStr.replace("px", "");
		if(StringUtils.isEmpty(imagHeightStr)){
			//去得到默认的文件高度
			imagHeightStr="0";
		}
		if(StringUtils.isEmpty(imagWidthStr)){
			imagWidthStr="0";
		}
		int imageHeight = Integer.parseInt(imagHeightStr);
		int imageWidth = Integer.parseInt(imagWidthStr);
		
		// 得到文件的word mht的body块
		String handledDocBodyBlock = WordImageConvertor.toDocBodyBlock(srcRealPath,
				imageFielShortName, imageHeight, imageWidth,styleAttr,
				srcLocationShortName, shapeidPrex, spidPrex, typeid);

		//这里的顺序有点问题:应该是替换item,而不是整个后面追加
		//doc.rreplaceAll(item.toString(), handledDocBodyBlock);
		item.after(handledDocBodyBlock);

		String base64Content = WordImageConvertor.imageToBase64(srcRealPath);
		String contextLoacation = docSrcLocationPrex + "/" + docSrcParent + "/" + docFileName;

		String docBase64BlockResult = WordImageConvertor.generateImageBase64Block(nextPartId, contextLoacation,
						fileTypeName, base64Content);
		docBase64BlockResults.add(docBase64BlockResult);

		String imagXMLHref = "<o:File HRef=3D\"" + docFileName + "\"/>";
		xmlImgRefs.add(imagXMLHref);

	}

}

private String getStyleAttrValue(String style, String attributeKey) {
	if (StringUtils.isEmpty(style)) {
		return "";
	}

	// 以";"分割
	String[] styleAttrValues = style.split(";");
	for (String item : styleAttrValues) {
		// 在以 ":"分割
		String[] keyValuePairs = item.split(":");
		if (attributeKey.equals(keyValuePairs[0])) {
			return keyValuePairs[1];
		}
	}

	return "";
}

private String wrappHtml(String html){
	// 因为传递过来都是不完整的doc
	StringBuilder sb = new StringBuilder();
	sb.append("<html>");
	sb.append("<body>");
	sb.append(html);

	sb.append("</body>");
	sb.append("</html>");
	return sb.toString();
}	

public String getData(List<String> list){
	String data = "";
	if (list != null && list.size() > 0) {
		for (String string : list) {
			data += string + "\n";
		}
	}
	return data;
}
}


		/**
 * 下载单篇或多篇博客文章提取的公共方法
 * @param out 输出流
 * @param blogNote 博客文章
 * @param response http响应
 * @throws IOException
 */
private void downloadSingleBlog(OutputStream out,  Employment blogNote, HttpServletResponse response) throws IOException{
	Template template = getTemplate();
	if(template != null) {
        Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("createTime", DateUtils.getDateToStringByPattern(blogNote.getUserDate(), "YYYY年MM月dd日  hh:mm"));
		RichHtmlHandler handler = new RichHtmlHandler(blogNote.getContent(), appRootPath );
		System.out.println(handler.getHandledDocBodyBlock());
		blogNote.setContent(handler.getHandledDocBodyBlock());
		handledBase64Block += handler.getData(handler.getDocBase64BlockResults());
		xmlimaHref += handler.getData(handler.getXmlImgRefs());
		dataMap.put("imagesBase64String", handledBase64Block);
        dataMap.put("imagesXmlHrefString", xmlimaHref);
        dataMap.put("blogNote", blogNote);
        Writer wb = null;
		try {
			wb = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
			template.process(dataMap, wb);//写数据到模板
			wb.close();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}
        
	}
}

导出controller层

@RequestMapping("downloadBlog")
@RequiresPermissions("world:downloadBlog")
public void downloadBlog(String guids, HttpServletResponse response, HttpServletRequest request) throws IOException {
String[] blogIdArr = guids.split(",");
	if (blogIdArr != null && blogIdArr.length == 1) {
		//单个博客文章下载     
		handledBase64Block = "";
		xmlimaHref = "";
		Employment findByEmployment = employmentService.findByEmploymentGuId(blogIdArr[0]);
		// 设置response参数,可以打开下载页面
		String fileName = findByEmployment.getTitle() + "_" + DateUtils.getDateToStringByPattern(new Date(), "yyyyMMddHHmmss");
		 response.setContentType("multipart/form-data");
			response.setContentType("application/octet-stream");
			response.setContentType("application/json");// 设置response内容的类型
	         response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1") + ".doc");
	         response.setHeader("filename",fileName);
	         response.setHeader("Pragma", "No-cache");  
	         response.setHeader("Cache-Control", "No-cache");  
	         response.setDateHeader("Expires", 0);
        ServletOutputStream out = response.getOutputStream();
		downloadSingleBlog(out, findByEmployment, response);
	}
}

模板格式:模板一定要用word文件转成ftl文件,改下后缀就可以了,打开样式,wps没问题office样式会没有

MIME-Version: 1.0
Content-Type: multipart/related; boundary="----=_NextPart_01D349D2.A93551C0"

此文档为“单个文件网页”,也称为“Web 档案”文件。如果您看到此消息,但是您的浏览器或编辑器不支持“Web 档案”文件。请下载支持“Web 档案”的浏览器,如 Windows? Internet Explorer?。

------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.htm
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset="utf-8"

<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
xmlns:o=3D"urn:schemas-microsoft-com:office:office"
xmlns:w=3D"urn:schemas-microsoft-com:office:word"
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml"
xmlns=3D"http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dutf-8">
<meta name=3DProgId content=3DWord.Document>
<meta name=3DGenerator content=3D"Microsoft Word 15">
<meta name=3DOriginator content=3D"Microsoft Word 15">
<link rel=3DFile-List href=3D"blogTemplate.files/filelist.xml">
<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Author>lenovo</o:Author>
  <o:LastAuthor>lenovo</o:LastAuthor>
  <o:Revision>2</o:Revision>
  <o:TotalTime>1</o:TotalTime>
  <o:Created>2017-10-20T10:38:00Z</o:Created>
  <o:LastSaved>2017-10-20T10:38:00Z</o:LastSaved>
  <o:Pages>1</o:Pages>
  <o:Words>4</o:Words>
  <o:Characters>28</o:Characters>
  <o:Company>Lenovo</o:Company>
  <o:Lines>1</o:Lines>
  <o:Paragraphs>1</o:Paragraphs>
  <o:CharactersWithSpaces>31</o:CharactersWithSpaces>
  <o:Version>15.00</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->
<link rel=3DthemeData href=3D"blogTemplate.files/themedata.thmx">
<link rel=3DcolorSchemeMapping href=3D"blogTemplate.files/colorschememappin=
g.xml">
<style>
		.lyTable{
		     border-collapse: collapse;
		     width: 100%;
		 }
		 .lyTable th, .lyTable td{
		     border: 1px solid #ebeef5;
		     padding: 8px 0;
		     text-align: center;
		 }
	</style>
</head>

<body style=3D"tab-interval:21pt;text-justify-trim:punctuation;" ><!--StartFragment--><div class=3D"Section0"  style=3D"layout-grid:15.6000pt;" ><table class=3DMsoNormalTable  border=3D0  cellspacing=3D0  style=3D"border-collapse:collapse;width:100.0000%;margin-left:18.6000pt;
=20border:none;mso-padding-alt:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;" ><tr><td width=3D915  valign=3Dcenter  rowspan=3D2  style=3D"width:549.3000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"margin-right:42.0000pt;mso-pagination:widow-orphan;text-align:left;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,128,0);
=20font-size:30.0000pt;mso-font-kerning:0.0000pt;" >${blogNote.infoType}</span><span style=3D"font-family:宋体;color:rgb(0,128,0);font-size:30.0000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td><td width=3D915  valign=3Dcenter  style=3D"width:549.3500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >总${blogNote.issueAllnum}期</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr><tr><td width=3D915  valign=3Dcenter  style=3D"width:549.3500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >第${blogNote.issueNum}期</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr></table><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;display:none;
=20mso-hide:all;font-size:12.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span><span style=3D"mso-spacerun:'yes';font-family:宋体;display:none;
=20mso-hide:all;font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><table class=3DMsoNormalTable  border=3D0  cellspacing=3D0  style=3D"border-collapse:collapse;width:100.0000%;margin-left:18.6000pt;
=20border:none;mso-padding-alt:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;" ><tr><td width=3D624  valign=3Dcenter  style=3D"width:374.6000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;text-align:left;" ><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p>&nbsp;</o:p></span></p></td><td width=3D1206  valign=3Dcenter  style=3D"width:724.0500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"mso-pagination:widow-orphan;" ><span style=3D"font-family:宋体;font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p>&nbsp;</o:p></span></p></td></tr><tr><td width=3D624  valign=3Dcenter  style=3D"width:374.6000pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  style=3D"margin-top:0.0000pt;margin-right:0.0000pt;margin-bottom:0.0000pt;
=20margin-left:0.0000pt;mso-pagination:widow-orphan;text-align:left;
=20line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >${blogNote.reportDepartName}</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td><td width=3D1206  valign=3Dcenter  style=3D"width:724.0500pt;padding:0.7500pt 0.7500pt 0.7500pt 0.7500pt ;border-left:none;
=20mso-border-left-alt:none;border-right:none;mso-border-right-alt:none;
=20border-top:none;mso-border-top-alt:none;border-bottom:none;
=20mso-border-bottom-alt:none;" ><p class=3DMsoNormal  align=3Dright  style=3D"margin-top:0.0000pt;margin-right:0.0000pt;margin-bottom:0.0000pt;
=20margin-left:0.0000pt;mso-pagination:widow-orphan;text-align:right;
=20line-height:18.0000pt;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(0,0,0);
=20font-size:10.5000pt;mso-font-kerning:0.0000pt;" >${createTime}</span><span style=3D"font-family:宋体;color:rgb(0,0,0);font-size:10.5000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></td></tr></table><p class=3DMsoNormal  style=3D"border-bottom:1.0000pt double rgb(0,128,0);mso-border-bottom-alt:0.2500pt double rgb(0,128,0);padding:0pt 0pt 1pt 0pt ;
=20mso-pagination:widow-orphan;text-align:left;line-height:10.0000pt;
=20mso-line-height-rule:exactly;" ><b><span style=3D"mso-spacerun:'yes';font-family:宋体;font-weight:bold;
=20font-size:12.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span></b><b><span style=3D"mso-spacerun:'yes';font-family:宋体;font-weight:bold;
=20font-size:12.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></b></p><p class=3D21  align=3Dcenter  style=3D"mso-pagination:widow-orphan;text-align:center;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" >&nbsp;</span><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><p class=3D21  align=3Dcenter  style=3D"mso-pagination:widow-orphan;text-align:center;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" >${blogNote.title}</span><span style=3D"mso-spacerun:'yes';font-family:宋体;color:rgb(51,51,51);
=20font-size:18.0000pt;mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p><p class=3D21  style=3D"mso-pagination:widow-orphan;" ><span style=3D"mso-spacerun:'yes';font-family:宋体;font-size:12.0000pt;
=20mso-font-kerning:0.0000pt;" >${blogNote.content}</span><span style=3D"mso-spacerun:'yes';font-family:宋体;font-size:12.0000pt;
=20mso-font-kerning:0.0000pt;" ><o:p></o:p></span></p></div><!--EndFragment-->
</body>

</html>

------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/themedata.thmx
Content-Transfer-Encoding: base64
Content-Type: application/vnd.ms-officetheme

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
BQBdAQAA2AoAAAAA

------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/colorschememapping.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/xml

<?xml version=3D"1.0" encoding=3D"UTF-8" standalone=3D"yes"?>
<a:clrMap xmlns:a=3D"http://schemas.openxmlformats.org/drawingml/2006/main"=
 bg1=3D"lt1" tx1=3D"dk1" bg2=3D"lt2" tx2=3D"dk2" accent1=3D"accent1" accent=
2=3D"accent2" accent3=3D"accent3" accent4=3D"accent4" accent5=3D"accent5" a=
ccent6=3D"accent6" hlink=3D"hlink" folHlink=3D"folHlink"/>
${imagesBase64String}
------=_NextPart_01D349D2.A93551C0
Content-Location: file:///C:/213792E5/blogTemplate.files/filelist.xml
Content-Transfer-Encoding: quoted-printable
Content-Type: text/xml; charset="utf-8"

<xml xmlns:o=3D"urn:schemas-microsoft-com:office:office">
 <o:MainFile HRef=3D"../blogTemplate.htm"/>
 <o:File HRef=3D"themedata.thmx"/>
 <o:File HRef=3D"colorschememapping.xml"/>
 ${imagesXmlHrefString}
 <o:File HRef=3D"filelist.xml"/>
</xml>
------=_NextPart_01D349D2.A93551C0--

自己去吧模板里面的参数改了就可以导出了,把他当做jsp文件使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值