• SpringBoot整合Velocity实现代码预览和文件生成
  • 发布于 2个月前
  • 567 热度
    0 评论
  • 怪咖豆
  • 0 粉丝 27 篇博客
  •   
这里做一个简单的示例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>

用户评论