1. 程式人生 > >Velocity自定義指令(函式)

Velocity自定義指令(函式)

使用velocity的時候,我們可能需要實現自定義的函式,類似:

#somefun()

這個函式可能是需要做一些業務程式碼,或者往context存取變數,或者可以向頁面輸出html程式碼。

假如我們要寫一個輸出hello xxx的函式,其中xxx是從context中取出的變數值,首先要在velocity.properties中新增一個:

userdirective=me.bwong.vm.HelloFun,...others

這一行告訴velocity引擎,在我的工程中有一個velocity函式,這個函式實現類是me.bwong.vm.HelloFun,這個類需要實現介面:org.apache.velocity.runtime.directive.Directive,參考如下程式碼:

public class HelloFun extends Directive {

 

    @Override

    public String getName() {

        return "hellofun";

    }

 

    @Override

    public int getType() {

        return LINE;

    }

 

    @Override

    public boolean render(InternalContextAdapter context, Writer writer, Node node) throws IOException, ResourceNotFoundException,

            ParseErrorException, MethodInvocationException {

 

        return true;

    }

 

}

getName介面用來告訴velocity這個函式名是什麼,也就是頁面上呼叫這個函式的名稱,比如#hellofun();

getType介面用來告訴velocity這個函式型別,可以是行也可以是塊函式;

render介面用來輸出html程式碼,當然也可以不輸出,如果需要輸出,則使用入參的writer.write("some html"),context是當前velocity的容器,可以存取變數,比如在頁面上使用#set($name="bwong"),可以通過context.get("name")取出"bwong",node裡面可以取出呼叫這個函式時的入參,比如#hellofun("a"),通過node.jjtGetChild(0).value(context)取出"a",所以:

writer.write("hello " + node.jjtGetChild(0).value(context));

就可以輸出"hello xxx",xxx是呼叫這個函式時的入參。