gpt4 book ai didi

java - 带有 Jersey 资源的 Sitemesh 和 Freemarker

转载 作者:行者123 更新时间:2023-11-30 09:44:18 25 4
gpt4 key购买 nike

我有一个基于 Jersey 的应用程序,对于 HTML 请求,它使用 Freemarker 以编程方式从模板生成 HTML;

@GET
@Produces("text/html")
public Response getResources(@PathParam("name") String name) {
LOG.info("got a request for " + name);
Map<String, Object> model = new HashMap<String, Object>();
model.put("name", name);
//lookup some data for name;
model.put("somedata", somedata);
StringWriter out = new StringWriter();
configuration.getTemplate("template.ftl").process(model, out);
return Response.ok().entity(out.toString()).build();
}

因此在Spring中初始化的配置实例= freemarker.template.Configuration;

<bean id="configuration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="/WEB-INF/template/path"/>
</bean>

现在,我在 web.xml 中设置了 Jersey Controller 、Sitemesh 过滤器和 Sitemesh-Freemarker servlet;

<servlet>
<servlet-name>JerseySpringNode</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JerseySpringNode</servlet-name>
<url-pattern>/mypath/*</url-pattern>
</servlet-mapping>

站点网过滤器:

<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/mypath/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

和 servlet:

<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.dec</url-pattern>
</servlet-mapping>

(我们使用“.dec”来标记装饰器模板)。装饰器.xml

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorators">
<decorator name="main" page="header_and_footer.dec">
<pattern>/*</pattern>
</decorator>
</decorators>

现在,这一切正常。 HTML 页面使用 sitemesh 装饰。

我们目前唯一的问题是,我们现在需要将由 Spring 确定的装饰器参数注入(inject)到装饰器中(例如来自用户原则的东西,请求上下文之外的东西,或者来自数据库的东西,例如来自该“somedata”属性的一些信息)。

鉴于我们没有在这个应用程序的任何地方使用 Spring WebMVC,我们如何连接一个可以访问此信息的 freemarker servlet?即使它是一个单独的 Spring bean,需要与其依赖项连接起来,也没关系。或者,我们可以通过某种方式在原始 Jersey 资源方法中以编程方式调用 sitemesh 吗?

我确实在网上找到了一个“Ted Young”的解决方案,但它似乎是部分的并且对我不起作用(它还需要使用 SpringWebMVC,目前这对我来说不是最佳选择)。

最佳答案

可能最简单的方法是集成 Jersey 和 Spring - 这会导致 Spring 完成所有依赖注入(inject)工作。

这是 web.xml 条目:

 <!--  Configure Jersey in this application. -->
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<!-- want a custom Jersey application class? do that here.
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.example.jersey.MyJerseyApp</param-value>
</init-param>
-->
<!-- Spring managed resources do not need to be listed here. Leave out if empty -->
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<!--
<param-value>org.example.jersey.package;org.example.jersey.otherpackage</param-value>
</init-param>
</servlet>

关于java - 带有 Jersey 资源的 Sitemesh 和 Freemarker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7977186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com