首页 > 其他分享 >freemarker 通过 URL 获取模板文件导出

freemarker 通过 URL 获取模板文件导出

时间:2023-08-10 13:22:21浏览次数:40  
标签:String freemarker templateName URL remotePath 模板 out

通过远程模板文件导出 word 或其他格式文件。
示例是 Spring Boot 整合 freemarker。

添加 freemarker 依赖

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
</dependency>

继承 URLTemplateLoader

创建一个名为 MyURLTemplateLoader 的类,继承 freemarker.cache.URLTemplateLoader 类。用于从远程获取模板文件的信息。

public class MyURLTemplateLoader extends URLTemplateLoader {

    private String remotePath;

    @Override
    protected URL getURL(String name) {
        URL url = null;
        try {
            url = new URL(remotePath + name);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return url;
    }

    public String getRemotePath() {
        return remotePath;
    }

    public void setRemotePath(String remotePath) {
        this.remotePath = remotePath;
    }

}

输出文件

通过模板文件输出到文件流。

@Component
public class FreemarkerHeplerImpl {

    private Configuration configuration = null;

    @PostConstruct
    void init() {
        configuration = new Configuration(Configuration.VERSION_2_3_28);
        MyURLTemplateLoader templateLoader = new MyURLTemplateLoader();
        templateLoader.setRemotePath("http://www.aaa.com/");
        configuration.setTemplateLoader(templateLoader);
    }

    /**
     * 生成文档到相应流
     * 
     * @param dataModel    数据模型
     * @param out          输出流
     * @param templateName 模板名称
     */
    public void generate(Object dataModel, OutputStream out, String templateName) {
        Template template = null;
        try {
            template = configuration.getTemplate(templateName, Locale.CHINA, "UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            Writer writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
            template.process(dataModel, writer);
        } catch (TemplateException | IOException e) {
            e.printStackTrace();
        }
    }

}

通过这种方式生成文档时,freemarker 会在模板文件名上加上国际化信息,例如传参 templateName(模板名)为 aaa.ftl,但是 freemarker 会在查找时变成 aaa_zh.ftl。在命名模板名时主要加上国际化后缀。

生成文件示例

调用上面的方法生成 word 文件到输出流。

// 生成 word 文件
String templateName = "t1.ftl";
ServletOutputStream out = null;
try {
    out = response.getOutputStream();
} catch (IOException e) {
    e.printStackTrace();
}

String fileName = "t1.docx";
try {
    fileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    
}
response.setContentType("application/msword");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

freemarkerHepler.generate(dataModel, out, templateName);

部分内容参考网上文章。

标签:String,freemarker,templateName,URL,remotePath,模板,out
From: https://www.cnblogs.com/colin220/p/17620082.html

相关文章

  • allocator 不是模板 解决方案
    场景严重性 代码 说明 项目 文件 行 禁止显示状态错误(活动) E0864 allocator不是模板 cvos_srtmp_service C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Professional\VC\Tools\MSVC\14.16.27023\include\regex 1175 错误(活动) E0864 associated_allocator不是模板 ......
  • 结构体模板(持续更新)
    树状数组:点击查看代码//1structTree{ vector<int>tr;//vector方便每根据需要的大小开Tree(intn):tr(n+1){//初始化iota(tr.begin(),tr.end(),0);} inlineintlowbit(intx){ returnx&-x; } inlinevoidadd(intx,intv){ f......
  • django 模板
    模板继承模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量{%extends'base.html'%}base.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>{%blocktitle%}{%endblock%}<......
  • 用PHP封装一个强大且通用的cURL方法
    用PHP封装一个强大且通用的cURL方法。用PHP封装一个强大且通用的cURL方法。用PHP封装一个强大且通用的cURL方法。用PHP封装一个强大且通用的cURL方法。/***@function强大且通用的cURL请求库*@param$urlstring路径如:https://example.com......
  • SSTI 服务器端模板注入
    SSTI服务器端模板注入flask基础不正确的使用模板引擎进行渲染时,则会造成模板注入路由[email protected]('/index/')defhello_word():return'helloword'route装饰器的作用是将函数与url绑定起来。例子中的代码的作用就是当你访问http://127.0......
  • 关于Tomcat返回URL出现jsessionId
    去掉java项目URL地址栏后面的";JEESESSIONID方法一:添加过滤器web.xml添加以下内容<filter><filter-name>jsessionid</filter-name><filter-class>com.myc.webpro.base.filter.DisableUrlSessionFilter</filter-class></filter><filter-......
  • Hugging News #0807: ChatUI 官方 Docker 模板发布、 Hub 和开源生态介绍视频来啦!
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」。本期HuggingNews有哪些有趣的消息,快来看看吧!......
  • 计算几何模板
    namespaceComputationGeometry{constldeps=1e-8,pi=acosl(-1.0);//点/向量structvec{ldx,y;vec(ldX=0,ldY=0){x=X;y=Y;}//输入输出voidin(){scanf("%Lf%Lf",&x,&y);}voidout(){printf(&......
  • Django博客开发教程:体验django模板
    上面我们有说过,用户发送请求的时候,视图会返回一个响应,响应可以是一个重定向,一个404错误,一个XML文档,一张图片或者是一个HTML内容的网页。前面几个返回的信息比较有限,我们重点更多是放在HTML内容的网页。我们把这样的页面按规范写好,然后都放在项目根目录下的templates文件夹里,这样的......
  • Django博客开发教程:体验django模板,
    上面我们有说过,用户发送请求的时候,视图会返回一个响应,响应可以是一个重定向,一个404错误,一个XML文档,一张图片或者是一个HTML内容的网页。前面几个返回的信息比较有限,我们重点更多是放在HTML内容的网页。我们把这样的页面按规范写好,然后都放在项目根目录下的templates文件夹里,这样的......