这里做一个简单的示例DEMO,实现一键打包zip,提供一种解决方案,实际需求可以按需所改,代码就三四个文件不上传上来了,下面贴出完整代码:
文件目录如下:
实体类User.java
省略 getter 和 setter 方法
package com.fun.demo.model;
/**
* @堆代码 duidaima.com
*/
public class User {
private Integer age;
private String name;
public User(Integer age, String name) {
this.age = age;
this.name = name;
}
public User(){}
}
VelocityUtils.java
package com.fun.demo.tool;
import com.fun.demo.model.User;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.io.IOUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @堆代码 duidaima.com
*/
public class VelocityUtils {
private final static Logger log = LoggerFactory.getLogger(VelocityUtils.class);
public static String previewCode() {
initVelocity();
User user = new User(18, "mrdjun");
VelocityContext context = VelocityUtils.prepareContext(user);
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate("vm/xml/article.xml.vm", "UTF-8");
tpl.merge(context, sw);
return sw.toString();
}
public static byte[] downloadCode() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outputStream);
generatorCode(zip);
IOUtils.closeQuietly(zip);
return outputStream.toByteArray();
}
public static void generatorCode(ZipOutputStream zip) {
User user = new User(18, "mrdjun");
initVelocity();
VelocityContext context = VelocityUtils.prepareContext(user);
StringWriter sw = new StringWriter();
Template tpl = Velocity.getTemplate("vm/xml/article.xml.vm", "UTF-8");
tpl.merge(context, sw);
try {
// 添加到zip
zip.putNextEntry(new ZipEntry("article.xml"));
IOUtils.write(sw.toString(), zip, "UTF-8");
IOUtils.closeQuietly(sw);
zip.flush();
zip.closeEntry();
} catch (IOException e) {
log.error("渲染模板失败:{0}", e);
}
}
public static VelocityContext prepareContext(User user) {
VelocityContext velocityContext = new VelocityContext();
velocityContext.put("age", user.getAge());
velocityContext.put("name", user.getName());
return velocityContext;
}
public static void initVelocity() {
Properties p = new Properties();
try {
// 加载classpath目录下的vm文件
p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 定义字符集
p.setProperty(Velocity.ENCODING_DEFAULT, "UTF-8");
p.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
// 初始化Velocity引擎,指定配置Properties
Velocity.init(p);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
CodeController.java
package com.fun.demo.controller;
import com.fun.demo.tool.VelocityUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @堆代码 duidaima.com
*/
@RestController
public class CodeController {
@RequestMapping("/download")
public void download(HttpServletResponse response) throws IOException {
byte[] data = VelocityUtils.downloadCode();
genCode(response, data);
}
/**
* 生成zip文件
*/
private void genCode(HttpServletResponse response, byte[] data) throws IOException {
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\"fun.zip\"");
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(data, response.getOutputStream());
}
}
在创建一个SpringBoot的启动类
在resources下面创建一个vm文件夹,article.xml.vm
<?xml version="1.0" encoding="utf-8"?>
<DOCUMENT>
我叫${name},今年${age}岁
</DOCUMENT>
pom.xml
我这里的全部依赖如下,按需所取:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.fun</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- SpringBoot 核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring框架基本的核心工具-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!--常用工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!--io常用工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!--velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- SpringBoot 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>