Jersey2.25.1集成freemarker

一、配置類中添加屬性配置和註冊FreemarkerMvcFeature

//register(MvcFeature.class);
property(MvcFeature.TEMPLATE_BASE_PATH+".freemarker", "freemarker");
//property(MvcFeature.ENCODING+".freemarker", "GBK");//如果@Produces沒指定輸出編碼,則以此設置爲準,默認UTF-8
property(FreemarkerMvcFeature.TEMPLATE_OBJECT_FACTORY,new FreemarkerConfig(null));
register(FreemarkerMvcFeature.class);//依賴MvcFeature

二、書寫freemarker配置


import com.hiekn.demo.exception.FtlException;
import com.hiekn.demo.util.FtlMethod;
import freemarker.cache.*;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Version;
import jersey.repackaged.com.google.common.collect.Lists;
import org.glassfish.jersey.server.mvc.freemarker.FreemarkerConfigurationFactory;
import org.jvnet.hk2.annotations.Optional;

import javax.inject.Inject;
import javax.servlet.ServletContext;
import java.io.File;
import java.util.List;
import java.util.Properties;

public class FreemarkerConfig implements FreemarkerConfigurationFactory {

    protected final Configuration configuration;

    @Inject
    public FreemarkerConfig(@Optional final ServletContext servletContext){
        Version version = Configuration.VERSION_2_3_23;
        configuration = new Configuration(version);
        configuration.setSharedVariable("cutStr", new FtlMethod());
        configuration.setDefaultEncoding("utf-8");//如果.ftl不在返回視圖裏,而是通過include引進去的,受此屬性影響,不受@Produces影響
        configuration.setTemplateExceptionHandler(new FtlException());
        configuration.setIncompatibleImprovements(version);
        configuration.setObjectWrapper(new DefaultObjectWrapper(version));
        final List<TemplateLoader> loaders = Lists.newArrayList();
        Properties p = new Properties();  
        try {
            p.load(FreemarkerConfig.class.getClassLoader().getResourceAsStream("freemarker.properties"));
            configuration.setSettings(p); 
            if (servletContext != null) {
                loaders.add(new WebappTemplateLoader(servletContext));
            }
            loaders.add(new ClassTemplateLoader(FreemarkerConfig.class, "/"));
            loaders.add(new FileTemplateLoader(new File("/")));
        } catch (Exception e) {
            e.printStackTrace();
        }
        configuration.setTemplateLoader(new MultiTemplateLoader(loaders.toArray(new TemplateLoader[loaders.size()])));
    }

    @Override
    public Configuration getConfiguration() {
        return configuration;
    }
}

三、書寫視圖控制器


import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.Configuration;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModelException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.log4j.Logger;
import org.glassfish.jersey.server.mvc.Template;
import org.glassfish.jersey.server.mvc.Viewable;
import org.springframework.stereotype.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;

@Controller
@Path("/ftl")
@Produces(MediaType.TEXT_HTML+";charset=UTF-8")
@Api("返回視圖")
public class Ftl {
    static final Logger log = Logger.getLogger(Ftl.class);

    @GET
    @Path("/test")
    @ApiOperation("測試返回視圖")
    public Viewable exampleView(@Context HttpServletRequest request) {
        Map<String, Object> data = new HashMap<>();
        data.put("test", "this is the ViewResource test text");
        data.put("request", request);

        BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_23).build();
        TemplateHashModel staticModels = wrapper.getStaticModels();
        data.put("statics", staticModels);
        TemplateHashModel enumModels = wrapper.getEnumModels();
        data.put("enums",enumModels);
        try {
            TemplateHashModel fileStatics =  (TemplateHashModel) staticModels.get("java.io.File");
            data.put("File", fileStatics);
            TemplateHashModel roundingModeEnums = (TemplateHashModel) enumModels.get("java.math.RoundingMode");
            data.put("RoundingMode", roundingModeEnums);
        } catch (TemplateModelException e) {
            e.printStackTrace();
        }
        return new Viewable("/test", data);
    }

    @Path("/")
    @GET
    @Template(name = "/index")
    @ApiOperation("測試返回視圖默認頁")
    public Map<String, Object> indexView() {
        Map<String, Object> map = new HashMap<>();
        System.out.println("我是首頁");
        return map;
    }


    @Path("{path}")
    @GET
    @ApiOperation("根據請求路徑返回對應頁")
    public Viewable common(@PathParam("path") String path) {
        Map<String, Object> map = new HashMap<>();
        return new Viewable("/"+path,map);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章