一开始,我对Velocity的Context感觉有点迷惑:是不是它的Context一定是VelocityContext呢?到底什么样的Context可以被Velocity Tools访问呢。其实,VelocityContext仅仅是一种Context。
在Velocity的帮助文档中,ViewContext接口给出了关于这种上下文的说明:
public interface ViewContext
Objects implementing this interface are passed to view tools upon initialization by the ServletToolboxManager.
The interface provides view tools in a servlet environment access to relevant context information, like servlet request, servlet context and the velocity context.
实现了ViewContext接口,就可以访问一个Servlet环境中的上下文信息。所以,如果想要获取到一个Servlet的上下文Context,必须启动一个Servlet才能,初始化一个ServletContext。我们通过下面的学习进行说明。
Velocity中的ContextTool、BrowserSnifferTool、ViewResourceTool这个工具都是Velocity View Tools。
org.apache.velocity.tools.view.tools.ContextTool
在toolbox.xml中配置如下:
<tool>
<key>context</key>
<scope>request</scope>
<class>org.apache.velocity.tools.view.tools.ContextTool</class>
</tool>
为了初始化一个ServletContext,新建一个HttpServlet,非常简单,在doPost方法中只使用一个sendRedirect(0方法实现跳转,如下所示:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyVelocityServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("templates/context.vm");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
一个HttpServlet在被请求的时候就已经初始化了一个ServletContext。然后,在web.xml中映射该MyVelocityServlet 。
现在,就可以使用Velocity Tools,web.xml中配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/classes/velocity.properties</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet>
<servlet-name>MyVelocityServlet</servlet-name>
<servlet-class>MyVelocityServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyVelocityServlet</servlet-name>
<url-pattern>/MyVelocityServlet</url-pattern>
</servlet-mapping>
</web-app>
只要在应用中有“*.vm”的请求,则使用Velocity视图。现在,在templates目录下面存在Velocity模板文件.context.vm,启动Tomcat Web Server,直接在浏览器地址栏中键入http://localhost:8080/VelocityTools/MyVelocityServlet,请求我们实现的HttpServlet,初始化ServletContext。
常用的ContextTool中的方法如下所示:
函数举例 | 显示结果 |
$context | org.apache.velocity.tools.view.tools.ContextTool@1fe28a7 |
$context.keys | [sorter, date, math, text, context, browser, mill, number, esc, lists] |
$context.toolbox | {text=org.apache.velocity.tools.view.tools.ViewResourceTool@165d118, context=org.apache.velocity.tools.view.tools.ContextTool@1fe28a7, browser=org.apache.velocity.tools.view.tools.BrowserSnifferTool@18297fe, sorter=org.apache.velocity.tools.generic.SortTool@1b08cf3, date=2008-04-24, math=org.apache.velocity.tools.generic.MathTool@dbf79d, mill=org.apache.velocity.tools.generic.IteratorTool, number=org.apache.velocity.tools.generic.NumberTool@15d7752, esc=org.apache.velocity.tools.generic.EscapeTool@144dc7b, lists=org.apache.velocity.tools.generic.ListTool@1e73e0d} |
$context.values | [org.apache.velocity.tools.generic.MathTool@dbf79d, org.apache.velocity.tools.view.tools.ViewResourceTool@165d118, org.apache.velocity.tools.generic.EscapeTool@144dc7b, org.apache.velocity.tools.generic.IteratorTool, org.apache.velocity.tools.view.tools.ContextTool@1fe28a7, org.apache.velocity.tools.generic.NumberTool@15d7752, org.apache.velocity.tools.generic.SortTool@1b08cf3, org.apache.velocity.tools.view.tools.BrowserSnifferTool@18297fe, org.apache.velocity.tools.generic.ListTool@1e73e0d, 2008-04-24] |
#foreach( $key in $context.keys ) $key = $context.get($key) #end | sorter = org.apache.velocity.tools.generic.SortTool@1b08cf3 date = 2008-04-24 math = org.apache.velocity.tools.generic.MathTool@dbf79d text = org.apache.velocity.tools.view.tools.ViewResourceTool@165d118 context = org.apache.velocity.tools.view.tools.ContextTool@1fe28a7 browser = org.apache.velocity.tools.view.tools.BrowserSnifferTool@18297fe mill = org.apache.velocity.tools.generic.IteratorTool number = org.apache.velocity.tools.generic.NumberTool@15d7752 esc = org.apache.velocity.tools.generic.EscapeTool@144dc7b lists = org.apache.velocity.tools.generic.ListTool@1e73e0d |
从测试结果可以看出,获取到了非常详细的ServletContext上下文。
org.apache.velocity.tools.view.tools.BrowserSnifferTool
在toolbox.xml中配置如下:
<tool>
<key>browser</key>
<scope>request</scope>
<class>org.apache.velocity.tools.view.tools.BrowserSnifferTool</class>
</tool>
<tool>
这个Velocity工具也需要一个Context上下文,就上面的那个ServletContext为基础。
BrowserSnifferTool提供了关于User Agent的详细信息,包括浏览器的详细特性,尤其是对各种不同浏览器的不同版本都做了详细的描述,以及支持的操作系统等等。
BrowserSnifferTool提供的大部分都是通过一个布尔型变量值来判断。
测试结果可以看到:
函数举例 | 显示结果 |
$browser | org.apache.velocity.tools.view.tools.BrowserSnifferTool@a5ba31 |
$browser.Version | 7.0; |
$browser.MajorVersion | 7 |
$browser.MinorVersion | 0 |
/$browser.GeckoVersion | $browser.GeckoVersion |
$browser.GeckoMajorVersion | -1 |
$browser.GeckoMinorVersion | -1 |
$browser.Gecko | false |
$browser.Firefox | false |
$browser.Safari | false |
$browser.Netscape | false |
$browser.Nav2 | false |
$browser.Nav3 | false |
$browser.Nav4 | false |
$browser.Nav4up | false |
$browser.Nav45 | false |
$browser.Nav45up | false |
$browser.Navgold | false |
$browser.Nav6 | false |
$browser.Nav6up | false |
$browser.Mozilla | false |
$browser.Ie | true |
$browser.Ie3 | false |
$browser.Ie4 | false |
$browser.Ie4up | true |
$browser.Ie5 | false |
$browser.Ie5up | true |
$browser.Ie55 | false |
$browser.Ie55up | true |
$browser.Ie6 | false |
$browser.Ie6up | true |
$browser.Neoplanet | false |
$browser.Neoplanet2 | false |
$browser.Aol | false |
$browser.Aol3 | false |
$browser.Aol4 | false |
$browser.Aol5 | false |
$browser.Aol6 | false |
$browser.AolTV | false |
$browser.Opera | false |
$browser.Opera3 | false |
$browser.Opera4 | false |
$browser.Opera5 | false |
$browser.Opera6 | false |
$browser.Opera7 | false |
$browser.Hotjava | false |
$browser.Hotjava3 | false |
$browser.Hotjava3up | false |
$browser.Amaya | false |
$browser.Curl | false |
$browser.Staroffice | false |
$browser.Icab | false |
$browser.Lotusnotes | false |
$browser.Konqueror | false |
$browser.Lynx | false |
$browser.Links | false |
$browser.WebTV | false |
$browser.Mosaic | false |
$browser.Wget | false |
$browser.Getright | false |
$browser.Lwp | false |
$browser.Yahoo | false |
$browser.Google | false |
$browser.Java | false |
$browser.Altavista | false |
$browser.Scooter | false |
$browser.Lycos | false |
$browser.Infoseek | false |
$browser.Webcrawler | false |
$browser.Linkexchange | false |
$browser.Slurp | false |
$browser.Robot | false |
$browser.Blackberry | false |
$browser.Audrey | false |
$browser.Iopener | false |
$browser.Avantgo | false |
$browser.Wap | false |
$browser.Win16 | false |
$browser.Win3x | false |
$browser.Win31 | false |
$browser.Win95 | false |
$browser.Win98 | false |
$browser.Winnt | true |
$browser.Win2k | false |
$browser.Winxp | false |
$browser.Dotnet | true |
$browser.Winme | false |
$browser.Win32 | true |
$browser.Windows | true |
$browser.Mac | false |
$browser.Macosx | false |
$browser.Mac68k | false |
$browser.Macppc | false |
$browser.Amiga | false |
$browser.Emacs | false |
$browser.Os2 | false |
$browser.Sun | false |
$browser.Sun4 | false |
$browser.Sun5 | false |
$browser.Suni86 | false |
$browser.Irix | false |
$browser.Irix5 | false |
$browser.Irix6 | false |
$browser.Hpux | false |
$browser.Hpux9 | false |
$browser.Hpux10 | false |
$browser.Aix | false |
$browser.Aix1 | false |
$browser.Aix2 | false |
$browser.Aix3 | false |
$browser.Aix4 | false |
$browser.Linux | false |
$browser.Sco | false |
$browser.Unixware | false |
$browser.Mpras | false |
$browser.Reliant | false |
$browser.Dec | false |
$browser.Sinix | false |
$browser.Freebsd | false |
$browser.Bsd | false |
$browser.X11 | false |
$browser.VMS | false |
$browser.Unix | false |
$browser.Css | true |
$browser.Css1 | true |
$browser.Css2 | true |
$browser.Dom0 | true |
$browser.Dom1 | true |
$browser.Dom2 | true |
$browser.Javascript | true |
org.apache.velocity.tools.view.tools.ViewResourceTool
在toolbox.xml中配置如下:
<tool>
<key>text</key>
<scope>request</scope>
<class>org.apache.velocity.tools.view.tools.ViewResourceTool</class>
<parameter name="bundles" value="resources,myresources"/>
</tool>
其中,resources是默认的,位于目录/WEB-INF/classes之下,myresources是我们自己定制的。
假设resources.properties的内容如下所示:
shirdrn.url = http://hi.baidu.com/shirdrn
shirdrn.email.hotmail = shirdrn@hotmail.com
shirdrn.parameters = There are parameters {0} and {1}!
myresources.properties的内容如下所示:
soloor.url = http://hi.baidu.com/soloor
soloor.email.www163com = shirdrn@163.com
使用默认的resources.properties时,可以直接使用Velocity的org.apache.velocity.tools.view.tools.ViewResourceTool工具来读取,例如:
$text.shirdrn.url
但是,如果使用其它的,则需要使用#set命令指定并加载,如下所示:
#set( $mytext = $text.bundle('myresources') )
$mytext.soloor.url
这样就可以读取到myresources.properties资源文件中的soloor.url。
测试结果如下所示:
函数举例 | 显示结果 |
$text.shirdrn.url | http://hi.baidu.com/shirdrn |
$text.shirdrn.email.hotmail | shirdrn@hotmail.com |
$text.shirdrn.parameters | There are parameters {0} and {1}! |
$text.shirdrn.parameters.insert(2) $text.shirdrn.parameters | There are parameters 2 and {1}! There are parameters {0} and {1}! |
$text.shirdrn.parameters.insert(3,false) $text.shirdrn.parameters | There are parameters 3 and false! There are parameters {0} and {1}! |
#set( $mytext = $text.bundle('myresources') ) $mytext.soloor.url $mytext.soloor.www163com | http://hi.baidu.com/soloor shirdrn@163.com |