当前位置: 首页 > 知识库问答 >
问题:

如何使用servlet运行Freemarker模板?

松越
2023-03-14

我正在用Freemarker模板编写应用程序。我通过Java类获得了如何配置和运行. ftl模板机制的知识,并使控制台或文件输出在上面打印模板结果。

但是如何在servlet上实现呢?它是如何工作的?我想跑。类似Tomcat的ftl文件。jsp文件。但它只给我一个错误(“说明请求的资源不可用”)。

有人能给我解释一下怎么跑吗。servlet上的ftl文件?

这是我的web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

    <!-- FreemarkerServlet settings: -->
    <init-param>
        <param-name>TemplatePath</param-name>
        <param-value>/</param-value>
    </init-param>
    <init-param>
        <param-name>NoCache</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>ContentType</param-name>
        <param-value>text/html; charset=UTF-8</param-value> <!-- Forces UTF-8 output encoding! -->
    </init-param>

    <!-- FreeMarker settings: -->
    <init-param>
        <param-name>incompatible_improvements</param-name>
        <param-value>2.3.22</param-value>
        <!-- Recommended to set to a high value. For the details, see the Java 
            API docs of freemarker.template.Configuration#Configuration(Version). -->
    </init-param>
    <init-param>
        <param-name>template_exception_handler</param-name>
        <!-- Use "html_debug" instead during development! -->
        <param-value>rethrow</param-value>
    </init-param>
    <init-param>
        <param-name>template_update_delay</param-name>
        <!-- ATTENTION, 0 is for development only! Use higher value otherwise. -->
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>default_encoding</param-name>
        <!-- The encoding of the template files. -->
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>locale</param-name>
        <!-- Influences number and date/time formatting, etc. -->
        <param-value>en_US</param-value>
    </init-param>
    <init-param>
        <param-name>number_format</param-name>
        <param-value>0.##########</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>freemarker</servlet-name>
    <url-pattern>*.ftl</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>tomcat</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>tomcat</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

这是我的Java代码,可以在控制台上打印输出:

public static void main(String[] args) {
    ApplicationContext context = 
            new ClassPathXmlApplicationContext("context.xml");

    FreeMarkerConfiguration configurationWrapper = 
            context.getBean("freeMarkerConf", FreeMarkerConfiguration.class);

    Configuration cfg = configurationWrapper.getConfiguration();

    try {
        cfg.setSharedVariable("title", "SharedTitle");
    } catch (TemplateModelException e1) {
        e1.printStackTrace();
    }

    Map<String, Object> data = new HashMap<String, Object>();
    //data.put("title", "Hello");
    data.put("name", "Andrew");

    List<String> list = new ArrayList<>();
    list.add("Poland");
    list.add("Austria");
    list.add("Germany");
    list.add("Hungary");

    data.put("countries", list);

    Writer out = new OutputStreamWriter(System.out);

    try {
        Template template = cfg.getTemplate("index.ftl");
        template.process(data, out);

        Template template2 = cfg.getTemplate("list.ftl");
        template2.process(data, out);
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

共有1个答案

胡璞瑜
2023-03-14

要将FreeMarker与JavaServlet一起使用,请遵循以下简单步骤:

>

  • 添加Maven依赖项。

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>${freemarker-version}</version>
    </dependency>   
    

    web.xml文件中配置FreeMarker。从FreeMarker网站复制并粘贴设置。

    将处理从Servlet分派到FreeMarker模板文件。

    request.getRequestDispatcher("WEB-INF/views/show.ftl").forward(request, response);
    

    清洁的

    看看我的FreeMarker教程,它展示了如何在Java控制台、Servlet和Spring Boot应用程序中设置FreeMarker。

  •  类似资料:
    • 作为基础了解,在web应用程序范畴内使用 FreeMarker 和其它并没有什么不同; FreeMarker将它的输出写入传递给 Template.process 方法的 Writer 对象,它不关心 Writer 将输出写入控制台,文件或是 HttpServletResponse 的输出流。 FreeMarker 并不知道什么是servlet和web;它仅仅是使用模板文件来合并Java对象, 之

    • 我正在制作这个新的servlet: 这是我在WEB-INF中的web.xml 创建动态web项目时,会自动生成display-name和welcome-file-list标记。servlet和servlet映射由我编写。当我使用Appache7运行项目时,它显示HTTP status404-/firstservlet/。我的错在哪里?

    • 问题内容: 如何实例化servlet?如何使用session?如何共享变量?如何在多线程中使用? 问题答案: ServletContext 当servlet容器(如Apache Tomcat)启动时,它将部署并加载其所有Web应用程序。加载Web应用程序后,Servlet容器将创建ServletContext一次并将其保存在服务器的内存中。Web应用程序的web.xml所有包含的web-fragm

    • 问题内容: 我根本不确定这是否是可以解决的问题,但是假设我有一个freemarker模板,我想问一下该模板使用了哪些变量。 就我的目的而言,我们可以假设freemarker模板非常简单- 只是“根级别”条目(此类模板的模型可以是简单的Map)。换句话说,我不需要处理要求嵌套结构等的模板。 问题答案: 我有相同的任务要从Java端的模板获取变量列表,除了使用反射之外,没有找到任何好的方法。我不确定是

    • 我正在使用与Freemarker启动的Spring Boot。 给定以下字符串: 我试图对这个字符串执行一些验证,以确保它包含正确的Freemarker语法。 ----提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-

    • 问题内容: 我想在我的JSF应用程序中上传文件。我正在使用和访问上载文件。 但是,返回一个空集合。如何在Tomcat7.0.8中的Servlet过滤器中启用解析? 问题答案: 为了获得在一个工作在Tomcat中,您需要设置在webapp的元素或。 因为根据Servlet3.0规范,该属性只能在带有注释的内使用。另请参阅元素的文档: 设置为Tomcat是否应在调用或时自动解析请求主体,即使目标ser