Java 模板引擎總結
阿新 • • 發佈:2019-02-01
Java模板引擎 FreeMarker
概念
介紹
特性
優勢
不足
一個小Demo
概念
FreeMarker是一個模板引擎,一個基於模板生成文字輸出的通用工具,使用純Java編寫。它是為Java程式設計師提供的一個開發包。它不是面向終端使用者的,而是為程式設計師提供的一款可以嵌入他們所開發產品的應用程式。
介紹
那麼,FreeMarker是一款怎樣的工具呢?FreeMarker實際上是被設計用來生成HTML Web頁面,尤其是通過實現了基於MVC模式的Java Servlet應用程式。使用MVC模式的動態頁面的設計構思使得你可以將前端設計師從程式設計師中分離出來。所有人各司其職,發揮其最擅長的一面。
網頁設計師可以改寫頁面的顯示效果而不受程式設計師編譯程式碼的影響,因為應該程式的邏輯和頁面設計已經被分開了。頁面模板程式碼不會收到複雜程式程式碼的影響。這種分離的思想即便對一個程式設計師和頁面設計師是同一個人的專案來說也都是非常有用的,因為分離使得程式碼保持簡潔而且易於維護。
儘管FreeMarker也擁有一些程式設計能力,但通常由Java程式準備要顯示的資料,由FreeMarker生成頁面,通過模板顯示準備的資料(如下圖)。
FreeMarker不是一個Web應用框架,而適合作為Web應用框架的一個元件,但是FreeMarker引擎本身並不知道HTTP協議或Java Servlet的存在。它僅僅來生成文字內容。既然是這樣,它也非常適用於非Web應用程式的開發環境。知識要注意的是,我們使用FreeMarker作為檢視層的元件,是為了給諸如Struts這樣的Model2應用框架提供現成的解決方案,你也可以在模板中使用JSP標記庫。
特性
通用目標
易於嵌入到你的產品中,輕量級,不需要Servlet環境
能夠生成各種文字:HTML、XML、RTF、Java原始碼等等
外掛式模板載入器,可以從任何源載入模板,如本地檔案、資料庫等等
你可以按自己所需生成文字,儲存到本地檔案,作為Email傳送,從Web應用程式傳送它返回給Web瀏覽器
強大的模板語言
在模板中建立和改變變數
命名的巨集,可以具有位置引數和巢狀內容
幾乎在任何地方都可以使用複雜表示式來指定值
所有常用的指令,include、if/elseif/else、迴圈結構
名字空間有助於建立和維護可重用的巨集庫,或者將一個大工程分成模組,而不必擔心名字衝突
輸出轉換塊,在巢狀模板片段生成輸出時,轉換HTML轉義、壓縮、語法高亮等等,你可以定義自己的轉換
通用資料模型
FreeMarker不是直接反射到Java物件,Java物件通過外掛式物件封裝,以變數方式在模板中顯示
你可以使用抽象(介面)方式表示物件(JavaBean、XML文件、SQL查詢結果集等),告訴模板開發者使用方法,使其不受技術細節的打擾
為Web準備
支援JSP標記庫
能夠整合到Model2 Web應用框架中作為JSP的替代
在模板語言中內建處理典型Web相關任務(如HTML轉義)的結構
為MVC模式設計,分離視覺化設計和應用程式邏輯,分離頁面設計師和程式設計師
智慧的國際化和本地化
數字格式本地化敏感
多種不同語言的相同模板
日期和時間格式本地化敏感
字符集智慧化(內部使用UNICODE)
非US字符集可以用作標識(如變數名)
強大的XML處理能力
在模板中清楚和直覺的訪問XML物件模型
<#recurse>和<#visit>指令用於遞迴遍歷XML樹
優勢
可以徹底的分離表現層和業務邏輯
使用JSP開發過程中,在頁面中大量的存在業務邏輯程式碼,使得頁面的內容非常混亂,在後期大量的修改維護過程中就變得非常的困難。
FreeMarker不支援Java指令碼程式碼,FreeMarker的原理是,模板+資料模型=輸出。模板只負責資料在頁面中的表現,不涉及任何的邏輯程式碼,而所有的邏輯都是由資料模型來處理的。使用者最終看到的輸出是模板和資料模型合併後建立的。
可以提高開發效率
在以往的開發中,使用的都是JSP頁面來展示資料的,即所謂的表現層。我們都知道,JSP在第一次執行的時候需要轉換成Servlet類,開發階段進行功能除錯時,需要頻繁的修改JSP,每次修改都要編譯和轉換,那麼試想一下,一天中我們浪費在程式編譯的時間有多少。
相對於JSP來說,FreeMarker模板技術不存在編譯和轉換的問題,所以就不會存在上述問題。而且開發過程中,我們再不必等待介面設計開發人員完成頁面原型後,我們再來開發程式。
而且,一些特定的系統,比如OA工作流系統中,就需要動態生成表單技術,這就為其提供了很好的實現依據。使得在整個流程的進行中,生成不同的表單就簡單了很多。
使得開發過程中的人員分工更加明確
以往用JSP顯示資料時,一些程式設計師並不熟悉介面設計技術,反之介面開發人員,也並不熟悉程式語言。對兩者而言,交替性的工作本身就有難度。有時候稍有不慎,可能會將整個頁面元素刪除或去掉了某個程式符號,使得頁面走樣或程式錯誤,這樣就需要雙方相互溝通協作,解決出現的問題。有時候因為專案中的時間、任務量等因素的存在,可能這個工作就由一個人來完成,這樣就可能加大某一方開發人員的工作量。
使用FreeMarker後,作為介面開發人員,只專心建立HTML檔案、影象以及Web頁面的其他視覺化方面,不用理會資料;而程式開發人員則專注於系統實現,負責為頁面準備要顯示的資料。
不足
在修改模板後,可能會看到已經過期的資料
使用FreeMarker模板技術,生成靜態的HTML頁面後,如果一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,使用者看到的就是過期的資料。
FreeMarker的變數必須有值
FreeMarker模板技術在應用過程中,FreeMarker中的變數必須要賦值,如果不賦值,那麼就會丟擲異常。FreeMarker沒有一個預設的null處理,甚至也不接受一個null值。想避免錯誤就要應用if/elseif/else 指令進行判段,如果對每一個變數都判斷的話,那麼則反而增加了程式設計的麻煩。
FreeMarker的Map限定Key必須是String,其他資料型別無法操作
Map問題,即FreeMarker中不能支援非String的Key值,這樣在進行一些複雜迭代時就需要作一些其他的轉換,如將一個Map拆分為兩個或多個Map。
FreeMarker不支援叢集應用
為了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程中確實方便,但如果將應用放到叢集中,就會出現錯誤。
一個小Demo
首先,需要下載FreeMarker的jar包,這裡提供一個下載連結:freemarker.jar
然後,將這個freemarker.jar放到Web專案的 WebRoot\WEB-INF\lib 目錄下
最後,我把自己寫的測試類貼出來,分享一下。
FreemarkerTest類 程式碼
[java]
<span style="font-family:Microsoft YaHei;">import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import junit.framework.TestCase;
public class FreemarkerTest extends TestCase {
private String dir = "E:/.../OA/TestTotal/src/com/bjsxt/oa/freemarker";
public void testFreemarker() {
Configuration cfg = new Configuration();
try {
// 從哪裡載入模板檔案
cfg.setDirectoryForTemplateLoading(new File(dir));
// 定義模版的位置,從類路徑中,相對於FreemarkerManager所在的路徑載入模版
// cfg.setTemplateLoader(new ClassTemplateLoader(FreemarkerManager.class, "templates"))
// 設定物件包裝器
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 設定異常處理器
cfg
.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
// 定義資料模型
Map root = new HashMap();
root.put("abc", "世界,你好");
// 通過freemarker解釋模板,首先需要獲得Template物件
Template template = cfg.getTemplate("test.ftl");
// 定義模板解釋完成之後的輸出
PrintWriter out = new PrintWriter(new BufferedWriter(
new FileWriter(dir+"/out.txt")));
try {
// 解釋模板
template.process(root, out);
} catch (TemplateException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}</span>
下面是定義的模板 test.ftl
test.flt 程式碼
[html]
<span style="font-family:Microsoft YaHei;">第一個測試程式:${abc}</span>
最後執行的結果如下
輸出了out.txt檔案,out.txt檔案中的內容如下:
[html]
<span style="font-family:Microsoft YaHei;">第一個測試程式:世界,你好</span>
========
Velocity入門示例
一、前言
Velocity作為歷史悠久的模板引擎不單單可以替代JSP作為Java Web的服務端網頁模板引擎,而且可以作為普通文字的模板引擎來增強服務端程式文字處理能力。而且Velocity被移植到不同的平臺上,如.Net的NVelocity和js的Velocity.js,雖然各平臺在使用和實現上略有差別,但大部分語法和引擎核心的實現是一致的,因此學習成本降低不少哦。
最好的學習資源——官網:http://velocity.apache.org/
本系列打算採用如下結構對Velocity進行較為全面的學習,若有不妥或欠缺望大家提出,謝謝。
1. 入門示例
2. VTL語法詳解
3. 模板與宿主環境通訊
4. 基礎配置項
5. 深入模板引擎及調優配置
二、入門示例
示例結果是生成如下的html表單:
<form action="./submit">
<div>
<label for="title">標題:</label>
<input type="text" id="title" name="title"/>
</div>
<div>
<label for="brief">摘要:</label>
<input type="text" id="brief" name="brief"/>
</div>
<div>
<label for="sex">性別:</label>
<select id="sex" name="sex">
<option value="0">男</option>
<option value="1">女</option>
</select>
</div>
<div>
<label for="job">職業:</label>
<select id="job" name="job">
<option value="0">Java工程師</option>
<option value="1">Net工程師</option>
</select>
</div>
</form>
引入依賴項——velocity-1.7-dep.jar
模板檔案frm.vm
##表單模板
##@author fsjohnhuang
##@version 1.0
## 引入外部模板檔案
#parse('macro.vm')
## 主邏輯
<form action="$action">
#foreach($input in $inputs)
#input($input.title $input.id)
#end
#foreach($select in $selects)
#select($select.title $select.id $select.items)
#end
</form>
模板檔案macro.vm
## 生成input表單元素區域的巨集
#macro(input $title $id)
<div>
<label for="$id">$title</label>
<input type="text" id="$id" name="$id"/>
</div>
#end
## 生成select表單元素區域的巨集
#macro(select $title $id $items)
<div>
<label for="$id">$title</label>
<select id="$id" name="$id">
## VTL指令緊貼左側才能確保結果的排版正常(不會有多餘空格)
#foreach($key in $items.keySet())
<option value="$key">$items.get($key)</option>
#end
</select>
</div>
#end
Java程式碼:
public static void main(String[] args) {
// 初始化模板引擎
Properties props = new Properties();
props.put("file.resource.loader.path", ".\\vm");
VelocityEngine ve = new VelocityEngine(props);
// 配置引擎上下文物件
VelocityContext ctx = new VelocityContext();
ctx.put("action", "./submit");
ArrayList<HashMap<String, String>> inputs = new ArrayList<HashMap<String,String>>();
HashMap<String, String> input1 = new HashMap<String, String>();
input1.put("id", "title");
input1.put("title", "標題:");
inputs.add(input1);
HashMap<String, String> input2 = new HashMap<String, String>();
input2.put("id", "brief");
input2.put("title", "摘要:");
inputs.add(input2);
ctx.put("inputs", inputs);
ArrayList<HashMap<String, Object>> selects = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> select1 = new HashMap<String, Object>();
selects.add(select1);
select1.put("id", "sex");
select1.put("title", "性別:");
HashMap<Integer, String> kv1 = new HashMap<Integer, String>();
kv1.put(0, "男");
kv1.put(1, "女");
select1.put("items", kv1);
HashMap<String, Object> select2 = new HashMap<String, Object>();
selects.add(select2);
select2.put("id", "job");
select2.put("title", "職業:");
HashMap<Integer, String> kv2 = new HashMap<Integer, String>();
kv2.put(0, "Java工程師");
kv2.put(1, "Net工程師");
select2.put("items", kv2);
ctx.put("selects", selects);
// 載入模板檔案
Template t = ve.getTemplate("test.vm");
StringWriter sw = new StringWriter();
// 渲染模板
t.merge(ctx, sw);
System.out.print(sw.toString());
}
Velocity模板引擎使用時的關注點分別為以外部檔案形式存在的Velocity模板和Java程式碼呼叫。
Velocity模板由VTL(Velocity Template Language)和引擎上下文物件構成;Java程式碼呼叫部分則負責初始Velocity引擎、構建引擎上下文物件、載入Velocity模板和啟動模版渲染。而Velocity模板與Java程式碼呼叫部分通訊的紐帶就是引擎上下文物件了。
三、總結
現在我們對Velocity引擎應該有個大概的瞭解,後續內容將對上述內容逐一深入。
如上述示例,若想改成如下格式就要重新設計模板形式了:
<form action="./submit">
<div>
.................
</div>
<div>
.................
</div>
<div>
.................
</div>
<div>
.................
</div>
</form>
========
加速Java應用開發速度4-使用模板技術加速專案開發速度
templateintellij idea程式碼生成
《加速Java應用開發速度》系列目錄:
加速Java應用開發速度1——加速spring/hibernate應用除錯時啟動速度
加速Java應用開發速度2——加速專案除錯啟動速度
加速Java應用開發速度3——單元/整合測試+CI
加速Java應用開發速度4——使用模板技術加速專案開發速度
加速Java應用開發速度5——使用指令碼自動化日常操作
模板,一個我們天天使用的技術, 比如:
Java類就是建立Java物件例項的模板;
泛型,引數化型別的模板,如List<User>;常見的如泛型DAO、泛型Service等;
Arrays.sort() 一個排序的模板;
Spring中的DAO支援設計;可參考《我對SpringDAO層支援的總結》;
HttpServlet設計,如service根據http method轉發給各個do開頭的方法(doGet、doPost等);
還有如Struts2的ActionSupport設計,我們繼承後能自動得到如國際化、驗證的支援;
JSP、Velocity、Freemarker等模板頁面技術;
等等。。
模板帶給我們的好處很明顯:約束+重用。通過模板我們可以把變與不變分離,重用不變,變可以交給子類/通過回撥機制完成,而且還具有約束作用,防止亂寫程式碼。
那我們應該利用好這個技術,加速專案的開發速度。接下來我們看看如何利用模板技術來加速我們的開發速度。
接下來,我將介紹下如何利用模板技術加速開發速度,但不會接受如何利用模板技術開發可複用的程式碼;本文以IntelliJ IDEA為原型介紹:
1、程式碼生成
2、Live Template
3、File and code Templates
4、自動程式碼生成
1、程式碼生成
如我們要求 i + j,可以先:
int k = add(i, j);
然後按Alt+enter自動生成相關程式碼;而不是自己去敲;其會自動生成相應的變數和方法體;如圖
1、按Alt+Enter彈出如建立方法/建立本地變數的提示
2、可以根據生成的模板方法,修改模板引數;
3、還有典型的如生成構造器、getter/setter等,按Alt+Insert得到如下圖:
比如在生成構造器時,可以選擇相關欄位,會自動生成相應的賦值操作:
4、Ctrl+O/Alt+Insert生成覆蓋方法;ctrl+I/Alt+Insert生成實現方法的
5、選中程式碼後,Ctrl+Alt+T彈出Surround with,生成包圍程式碼的的程式碼,如if/else:
6、在如JSP標籤頁面中,按Ctrl+Alt+J,生成環繞的標籤:
等等。。具體可以參考jetbrains.官網的《Generating Code》部分。
2、Live Template
如果用過idea,肯定用過如輸入 psvm 然後按Tab鍵,會自動生成public static void main方法,使我們少輸入很多字元。這個功能在idea中叫做Live Template;接下來讓我們看看有哪些Live Template和如何自定義Live Template。
最常見的功能:
1、psvm----->public static void main(String[] args) {}
2、psfi ------->public static final int
3、ifn 會自動生成如下圖
……
大家可以通過 File--->Settings---->Live Templates找到所有模板,如:
如 lazy 生成延遲初始化的程式碼,inn生成if (** != null)
如fori --->for (int j = 0; j < ; j++) {}
List list; itli ----> for (int i = 0; i < list.size(); i++) { Object o = list.get(i);}
等等,這個可以去Settings裡檢視。
接下來我們看看如何自定義自己的Live Template:
1、輸入“縮寫字首”,即在程式碼中輸入的字首;
2、模板文字;
3、Change:選擇在哪使用;
接下來在Java檔案中,輸入test會生成 hello world;
此處看到 $END$ 這種變數,接下來解釋下:
1、格式是$變數名$
2、$END$ : 表示展開模板後游標停留的位置,比如我們的test,生成模板後,游標停留在hello world 前邊;
3、$SELECTION$ : 表示對選中的程式碼應用模板;如我們定義test為:
如
此處選中“int i = 1;”,然後按Ctrl+Alt+T 彈出“Surround With” 然後輸入test字首,自動生成:--->hello int i = 1; world
還有如 輸入 if for等字首 按Ctrl+Shift+Enter會自動生成 帶()和{} 的形式,非常方便。
如果想定義自己的變數,可以直接點選在編寫模板時,模板文字右邊的:“Edit variables” 編寫:如得到返回的變數,方法名,類名等等。
大家可以參考官網的《Live Templates》。
3、File and code Templates
到此我們使用的都是程式碼塊級別的模板,在工作中我們常見的還需要:
1、生成如Copyright頭;
2、生成類頭Javadoc,如使用者、時間、版本;
3、建立如spring配置檔案,每次可能都是從別的地方複製一份;
4、如我們做企業專案時,都先寫一個CRUD的DAO、Service、Controller等等,但是幾乎每一個模組都是類似的,但是我們每次可能都要重複寫一遍;
因為IDEA使用的是velocity模板,所以語法相對來說是比較靈活的,而Eclipse看了下是自創的,所以在建立時沒有IDEA靈活。
File---->Settings--->File and Code Templates 開啟模板設定頁面
3.1、給Class生成Copyright頭
1、建立Include檔案
1、首先選擇Includes標籤,然後點選建立建立一個;
2、接著Name處輸入名字;
3、Extension部分輸入副檔名;
4、檔案正文;
此檔案包含了我的copyright
2、新增到類模板中
1、 首先選中Class;
2、在頁面頂部使用 @parse("Coyright.java")把剛才寫的檔案包含進來
接著新建一個Java Class,在頁面的頂部會出現這個copyright;
3.3、自定義Service模板
以KeyValueService.java為例。
1、首先File--->Settings---->File and Code Templates進入模板設定頁面
2、建立模板,如圖所示
1、點選Templates標籤,點選新增按鈕
2、Name處輸入名字
3、Extension處輸入副檔名
4、輸入模板正文,此處我們可以使用${NAME}和${PACKAGE_NAME}分別獲取輸入的檔名和包名
5、語法是velocity語法,所以很強大,按理說很複雜的需求也可以實現
3、新增Class
3.1、在包處Alt+Enter彈出新建列表,選擇Java Class
3.2、 接著在彈出的介面中輸入 Service的字首,並選擇Service型別:
4、接著類就建立好了:
Java程式碼
/**
* Copyright (c) 2005-2012 https://github.com/zhangkaitao
*
* Licensed under the Apache License, Version 2.0 (the "License");
*/
package com.sishuok.es.maintain.keyvalue.service;
import com.sishuok.es.common.inject.annotation.BaseComponent;
import com.sishuok.es.common.service.BaseService;
import com.sishuok.es.maintain.keyvalue.entity.HelloValue;
import com.sishuok.es.maintain.keyvalue.repository.HelloRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>User: Zhang Kaitao
* <p>Date: 13-6-20 下午4:31
* <p>Version: 1.0
*/
@Service
public class HelloService extends BaseService<Hello, Long> {
@Autowired
@BaseComponent
private HelloRepository helloRepository;
}
非常方便。
除此之外,我們還可以定義如 jsp模板、html模板、配置檔案模板等等,消除開發中的重複工作。
但是此種方式的主要缺點就是:一次只能一個檔案。比如,我們生成Service時,其實DAO、Contoller等最好也自動生成。 接下來就需要自動程式碼生成了。
4、自動程式碼生成
估計很多朋友都使用/開發過程式碼生成器;其實開發一個簡單的程式碼生成器花不了多長時間,核心指導思想是:變與不變分離:
不變的是結構;
變的是包名、類名及實體資料。
所以根據這個思想可以很容易寫一個程式碼生成器,可以按照如下步驟完成:
1、自動生成一個模組的DAO、Service、Controller;
2、根據資料庫自動生成一個模組的Entity、DAO、Service、Controller;
3、自動生成一對一、一對多關係的模組程式碼;
4、自動生成公司中常用的程式碼的模組程式碼,如樹;
目前見到的主要有這些型別的自動程式碼生成。
程式碼生成的模板檔案可以使用純文字(即純粹的字串替換),更高階點的可以使用如velocity這種模板語言,更加強大。
如果有朋友不會寫程式碼生成器,可以先建一個Example的示例程式碼,接著做複製、粘帖、修改實體名等等完成,估計30秒鐘也能出一個基本的模組程式碼。但是如果交給程式碼生成器,速度更快。
比如筆者剛開發的新專案,還沒時間開發程式碼生成器,就寫一個一些示例,這樣如果寫新模組就直接複製一份改改即可,尤其樹這塊節省不少時間,點選showcase前往檢視。
程式碼生成器也不是萬能的,如果你做過網際網路專案,不像企業應用那樣有許多的增刪改查,所以這個時候,純粹生成CRUD的程式碼生成器沒有任何意義。
到此我們介紹完了模板,使用模板能提升不少開發速度,但是模板不是萬能的,只有發現有些程式碼是由:變與不變組成,那我們就可以把不變的做成模板,變的部分通過佔位符(即變數)填入。
參考資料:
30 Days with IntelliJ IDEA. Quick Popups
IntelliJ IDEA 12.1.0 Web Help
不變的做成模板,變的部分用變量表示。
是的,這個要自己識別,我們天天在用模板這玩意 ,但是如何識別出現這才是關鍵。如spring jdbc template就是一個絕好的例子。
說實話,我們今年的專案中我大膽的用了spring jdbctemplate,可惜,被Manager否定了,說著東西有諸多弊端,沒怎麼花時間去研究這東西,真心不知道怎麼樣...樓主能說說看嗎,關於原生的JDBC和spring jdbctemplate到底有什麼差別麼...
原始的就是寫程式碼多,什麼都要自己去寫;
1、程式碼冗餘
2、對映部分
給PreparedStatement賦值、取值
ResultSet取值對映到model
3、事務傳播麻煩
jdbc template就是來幹:
1、消除冗餘程式碼
2、簡化對映
3、得到spring事務管理的好處
spring jdbc template 封裝的很薄, 其實可以看出個工具, 上手簡單、為嘛不用。
所以直接寫jdbc 開發效率慢 而且諸如事務傳播等都是很麻煩的。
你可以參考
http://jinnianshilongnian.iteye.com/blog/1685963
你們現在架構是什麼樣的
架構,呵呵,談什麼架構哦,以前印度人寫的框架給拿過來,算是在此版本上重新開放,基本就是Struts2, Spring(用的很少,基本是我來之後我用的多些), ORM沒用框架,基本是自己手寫的原生jdbc,經常能看到靜態程式碼監測不通過的,看到資料庫連線,resultSet,PreparedStatement未釋放的,我當時就像用spring的模板方法肯定剩下很多時間,而且很方便就搞定了,
可以不用spring/hibernate等框架 但是得借用相關的思想; 所以你說的那些根本沒 “不重複自己”。樓主可以寫一套重構 給經理看: 節省了程式碼就節省了開發時間;程式碼少了 bug自然就會少
jdbc template就是來幹:
1、消除冗餘程式碼
2、簡化對映
3、得到spring事務管理的好處
所以直接寫jdbc 開發效率慢 而且諸如事務傳播等都是很麻煩的。
是少了個On frame deactivation 這個設定
我現在都是maven+jetty執行,還真沒有這麼用過,剛查了下
http://stackoverflow.com/questions/9117844/publish-changes-to-server-from-intellij-idea-11
意思就是當idea視窗失去焦點焦點時 更新
哦 我剛才在Build Artifacts 新增上專案artifacts的就出現視窗和hot swap classes選項了
和現在我還不知道這個Artifacts 是幹什麼的?? 現在每次更新都需要按下反人類的快捷鍵CTRL+SHIFT+F9更新 如果有跟ECLIPSE的儲存自動更新就方便了 目前沒找到
Artifacts 就是製品,可以理解為打包好的產品;比如打成war包 / 直接的web專案目錄 / jar包
不過按你說的On frame deactivation,配置這個應該是可以的; 如果maven內嵌 我現在也是CTRL+SHIFT+F9更新
哦 我剛才在Build Artifacts 新增上專案artifacts的就出現視窗和hot swap classes選項了
和現在我還不知道這個Artifacts 是幹什麼的?? 現在每次更新都需要按下反人類的快捷鍵CTRL+SHIFT+F9更新 如果有跟ECLIPSE的儲存自動更新就方便了 目前沒找到
如果是非debug模式下
http://jinnianshilongnian.iteye.com/blog/1887788
如在執行tomcat/jetty時的VM引數中指定如上配置即可。無需在debug模式下執行。如果使用的是如idea可以按Ctrl+Shift+F9編譯當前類/Ctrl+F9編譯所有更改的類。
我之前除錯成功過一次 就是在TOMCAT 設定那有2個On 'Update' action xx 的選項
都選擇hotswap class 然後在每次修改程式碼後在Deployment選項卡點Deploy All就完成你說的熱替換效果 但是現在不知道為什麼現在On 'Update' action只有1個地方設定 選項裡面也只有Restart server選項 咋也變不回去了
如在執行tomcat/jetty時的VM引數中指定如上配置即可。無需在debug模式下執行。如果使用的是如idea可以按Ctrl+Shift+F9編譯當前類/Ctrl+F9編譯所有更改的類。
所以你可以參考這篇 直接上位元組碼熱替換
我09年接觸過,那時候也是抵觸,直到最近一年 尤其maven整合這塊 eclipse比較弱,使用idea真心方便不少。
========
eclipse開發velocity例項
開發環境
Eclipse Java EE IDE for Web Developers.(Version: Helios Service Release 1)
jdk1.6.0_07
apache-tomcat-6.0.10
首先需要為eclipse安裝velocity編輯外掛:
在Eclipse的Help->Install New Software...
點選“Add加 Veloeclipse,值:http://veloeclipse.googlecode.com/svn/trunk/update/
備註:如果無法安裝,在安裝外掛的介面中把 Group Items by Catagory 前打鉤去掉
建立專案
開啟eclipse,File -> New -> Other... -> Web -> Dynamic Web Projec 之後按照提示一路next;
注意1:修改程式碼檔案輸出路徑,預設是build\classes;這個不符合tomcat的要求,需要改成WebContent\WEB-INF\classes 如下:
注意2:勾選 Generate web.xml deployment descriptor
新增velocity依賴包
velocity相關的包有十多個,下載解壓後複製全部,貼上到專案WebContent -> WEB-INF ->lib資料夾中
專案名右鍵選單選擇build path -> configure build path ->java build path ->libraries -> add jars 選擇專案lib資料夾,選擇全部jar最後點確認按鈕
備註:velocity所需的jar包下載地址 http://download.csdn.net/detail/smilevt/4802244
新增velocity模板檔案
在WebContent下新增一個資料夾,我起名叫templates。在該檔案下新增一個hello.vm檔案,裡面內容如下:
<html>
<head><title>Sample velocity page</title></head>
<body bgcolor="#ffffff">
<center>
<h2>Hello My First Velocity</h2>
<table width="100" cellpadding="5" cellspacing="1" bordercolor="#333333">
<tr><td bgcolor="#eeeeee" align="center">name list</td></tr>
#foreach ($name in $theList)
<tr><td bgcolor="#6666FF" align="center">$name</td></tr>
#end
</table>
</center>
</body>
</html>
新增java類檔案
在Java Resource -> src下新建一個包,包名com.velocitydemo.velocityhandler,名稱隨意,後面配置檔案裡要用到,前後需要一致
在該包下新增一個類,類名HelloHandler,名稱隨意,道理同上
類的程式碼如下:
package com.velocitydemo.velocityhandler;
import java.util.Properties;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;
public class HelloHandler extends VelocityViewServlet {
private static final long serialVersionUID = 1L;
private VelocityEngine velo;
public void init() throws ServletException {
velo = new VelocityEngine();// velocity引擎物件
Properties prop = new Properties();// 設定vm模板的裝載路徑
String path = this.getServletContext().getRealPath("/");
prop.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path + "templates/");
try {
velo.init(prop);// 初始化設定,下面用到getTemplate("*.vm")輸出時;一定要呼叫velo物件去做,即velo.getTemplate("*.vm")
} catch (Exception e1) {
e1.printStackTrace();
}
}
protected Template handleRequest(HttpServletRequest request, HttpServletResponse response, Context ctx) {
String p1 = "Charles";
String p2 = "Michael";
Vector personList = new Vector();
personList.addElement(p1);
personList.addElement(p2);
ctx.put("theList", personList); // 將模板資料 list放置到上下文環境context中
Template template = velo.getTemplate("hello.vm");
return template;
}
}
配置web.xml
開啟WEB-INF下的web.xml檔案,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>velocity-demo</display-name>
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.velocitydemo.velocityhandler.HelloHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/hello</welcome-file>
</welcome-file-list>
</web-app>
至此一個最簡單的velocity專案建立完畢
注意:WEB-INF下的classes資料夾並不顯示在專案結構圖中
釋出專案
到這裡可以把專案資料夾中的WebContent釋出到Tomcat中進行測試了
釋出的方式參考地址(http://blog.csdn.net/smilevt/article/details/8212075)
啟動tomcat訪問一個最簡單的velocity專案
========