Jersey2.25.1集成freemarker

一、配置

1. 配置类中添加属性配置和注册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

2. 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;
	}
}

二、集成Spring

添加依赖

如果要使用Jersey Spring DI支持,您需要将jersey-spring4模块添加到依赖关系列表中:

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring4</artifactId>
    <version>2.26</version>
</dependency>

上述模块为Spring模块添加了传递依赖关系。 有关依赖关系的列表和范围的更多详细信息,请参阅jersey-spring4模块依赖项。 请注意,该模块取决于Spring / HK2 Bridge,用于将Spring服务注入HK2服务或将HK2服务注入Spring服务。

使用说明

Jersey提供了支持Spring DI的扩展。这使得Jersey可以使用Spring bean作为JAX-RS组件(例如资源和提供者),并且还允许Spring注入到被Jersey管理的组件中。

Spring扩展模块配置是基于注解的。 Spring bean被注入,JAX-RS类使用注解后被Spring管理。 注入Spring bean可以使用Spring XML配置注入更多的依赖关系。 支持Spring单例和请求范围。

为了使JAX-RS资源能够运行需要代理的Spring功能,例如Spring事务管理(使用@Transactional),Spring Security和面向方面的编程(例如@Aspect),资源必须由Spring管理,通过注释 @Component,@Service,@Controller或@Repository:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.springframework.stereotype.Component;
 
@Component
@Path("/")
public class SomeResource {
 
    @Transactional
    @GET
    public void updateResource() {
        // ...
    }
}

注意: Spring beans不能通过使用Spring XML配置直接注入JAX-RS类

三、视图控制器


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);
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kse_music

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值