1. 程式人生 > >Freemarker模板引擎

Freemarker模板引擎

ack xxx mvc控制器 pro 表示 圖解 HA 出現 def

模板引擎的實質就是將頁面結構提前寫好,然後將數據渲染到模板上生成一個靜態頁面,這樣一來,下次就可以

直接訪問靜態文件,不用進行額外的獲取數據的操作(例如:訪問數據庫),這樣大大提升了網站的訪問速度。

現在以一個demo為例來學習一下Freemarker,順便提一下其中的一些細節。

1.新建maven支持的web項目

技術分享圖片

新建web項目,並為其添加Maven支持,個人建議選擇MyEclipse Maven JEE Project,如果選擇下面一條的話,

會多出4個名字較長的文件夾,而我們本身又不一定會用到。

2.pom.xml文件添加依賴包

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support
</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.4.RELEASE
</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>

這裏添加了三個依賴包,spring-context-support、spring-webmvc、freemarker,記住缺一不可,缺一不可,而且,

所添加的兩個spring-xxx依賴包的版本最好相同,否則運行的時候可能會出現servlet初始化錯誤,這是因為這兩個包

相同版本之間存在依賴關系,切記!!!

3.web.xml配置

這個文件位於WebRoot--WEB-INF目錄下

    <filter>   
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>TestFreemarker</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestFreemarker</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

第一個過濾器為了防止中文亂碼而設置,第二個servlet是springmvc的。

紅字表示名稱自定義,不一定要和我寫的一樣。但是一定要和自己後面的文件名關聯起來,不要在這裏寫A,在後面

寫B,這個B自然不會指向A!!!

4.springmvc.xml配置

這裏在項目的src目錄下新建上面紅字所指的springmvc.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">

    <!-- 配置包掃描器,掃描@Controller註解的類 -->
    <context:component-scan base-package="eco" />
    <!-- 配置註解驅動 -->
    <mvc:annotation-driven />
    <!-- 項目視圖解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    

    <!-- Freemarker配置 -->
    <bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="WEB-INF/template/" /><!-- 模板目錄 -->
        <property name="freemarkerSettings">
            <props>
                <prop key="incompatible_improvements">2.3.23</prop>
                <prop key="template_exception_handler">rethrow</prop>
                <prop key="default_encoding">UTF-8</prop>
                <prop key="locale">UTF-8</prop><!-- 本地化設置 -->
                <prop key="url_escaping_charset">UTF-8</prop>
            </props>
        </property>
    </bean>
</beans>

黃綠色字體和防止中文亂碼有關,切勿缺失!

就像你所看到的紅字那樣,WEB-INF目錄下有兩個文件夾,一個template是用來放置模板的,後綴是.ftl;

還有一個文件夾是jsp,是模板生成的jsp文件放的地方。

網上很多都添加了一個freemarker視圖解析器,說是用來訪問html,經驗證,可以無視這個視圖解析器!!!

後面會講到。

5.建立模板文件(xxx.ftl)

按照上面所示,在WEB-INF下的view目錄下放一個模板文件(例如:01.ftl),內容如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP index.jsp starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    This is my JSP page. <br>
   姓名: ${a.name}<br>
   年齡: ${a.age}<br>
   性別: ${a.sex}<br>
  </body>
</html>

這就是一個freemarker模板(jsp頁面)了,將在之後與數據相結合生成一個jsp文件,詳情請往下看。

6.SpringMVC控制器

package eco;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import freemarker.template.Configuration;
import freemarker.template.Template;

@Controller
public class Tcontrollor {
    @Resource
    FreeMarkerConfigurer freeMarkerConfigurer;

    @RequestMapping("/{name}")
    public String Html(@PathVariable String name) {
        try {
            // 獲取連接
            Configuration configuration = freeMarkerConfigurer
                    .getConfiguration();
            // 獲取數據
            Map<String, Student> stu = new HashMap<String, Student>();
            // 添加數據,這個就是自己創建的一個類
            stu.put("a", new Student("桔子桑", "18", ""));
            // 獲取ftl,由於已經在配置文件中配置了路徑所以在這裏直接寫模板名稱就可以
            Template template = configuration.getTemplate("01.ftl");
            // 輸出文件路徑
            String dir = "D:/Tomcat 7.0/webapps/PRO/WEB-INF/jsp/" + name
                    + ".jsp";
            // Writer wr = new FileWriter(dir);
            OutputStreamWriter writer = new OutputStreamWriter(
                    new FileOutputStream(dir), "UTF-8");
            // 寫入
            template.process(stu, writer);
            // 關閉流
            writer.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return name;

    }
}

全是註釋,相信不難看懂。

①紅字dir是輸出文件的路徑名,後面根據此路徑名創建輸出流對象,註意的是地址要是部署到tomcat上的項目地址,

而不是你MyEclipse的workplace裏面的項目地址,因為瀏覽器只會訪問tomcat上的資源的;

②網上很多都是直接Writer wr = new FileWriter(dir),而FileWriter和FileReader是使用系統當前默認的編碼方式,

並且都不支持通過參數指定編碼方式,因此我們需要使用FileOutputStream來為這個輸出流對象設定UTF-8編碼,

以此來規避中文亂碼的問題。

接下來就是檢驗最終成果的時候了:

技術分享圖片

瀏覽器輸入:項目地址+66,SpringMVC的控制器結合模板和數據,到指定目錄下生成jsp文件,並且最後根據視圖

解析器訪問剛剛生成的jsp文件。

7.訪問html文件

接下來試試輸出html文件,看看能不能訪問,相關代碼作以下更改:

String dir = "D:/Tomcat 7.0/webapps/PRO/WEB-INF/jsp/" + name
                    + ".html";

<!-- 視圖解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".html" />
        <property name="contentType" value="text/html;charset=UTF-8" />
    </bean>

指定目錄下生成html文件,並且視圖解析器改為訪問該目錄下的對應html文件,來看看效果吧。

技術分享圖片

啊哦,出錯了,原因就是,生成的WEB-INF目錄下的html文件是靜態文件,雖然控制器指示跳轉到該頁面,但是web.xml

文件中的DispatcherServlet對其進行了過濾,所以就會出現上面的情況404(not found),我們要做的的就是不讓

DispatcherServlet對*.html格式的文件進行過濾,方法有三:https://www.cnblogs.com/shanheyongmu/p/5552034.html

個人建議第一種(方便),在DispatcherServlet前面加上如下代碼:

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

然後再來看看結果:

技術分享圖片

正如大家所願,正常跳轉到66.html,並在指定目錄生成該文件。

至此,freemarker模板引擎的使用告一段落,至於模板的一些語法,日後再作探討。睡覺~~~~·

Freemarker模板引擎