Date: 2004-12-04T02:45:54
   Editor: ShinobuKawai <[EMAIL PROTECTED]>
   Wiki: Jakarta-Velocity Wiki
   Page: VelocityFAQ
   URL: http://wiki.apache.org/jakarta-velocity/VelocityFAQ

   Add null FAQ.

Change Log:

------------------------------------------------------------------------------
@@ -6,10 +6,10 @@
 === Velocity ===
  * Q: Adding ## at the end of a template causes a parsing exception, what do I 
do?
  * A: For now, a workaround is: add a newline to the end of the file.
-[[BR]] 
+[[BR]]
  * Q: Can velocity render 'dynamic properties' like #set ($bar = "name") 
$foo.$bar ?
  * A: Not directly, but possible using !RenderTool or !ViewRenderTool in 
VelocityTools, Or a custom tool can be written using Velocity.evaluate(...).
-[[BR]] 
+[[BR]]
  * Q: How do I output values from a hash when I do not know the keys?
  * A: Easy - remember, the context has real java objects, all public methods 
can be used.
 Here is a solution provided by Shinobu Kawai:
@@ -18,15 +18,60 @@
  #set($value = $myMap.get($key))
  $key = $value
 #end
-
+}}}
 or you can do
-
+{{{
 #foreach($entry in $myMap.entrySet())
  $entry.key = $entry.value
 #end
 }}}
+[[BR]]
+ * Q: I want to check for null, something like this:
+{{{
+#if ($car.fuel == null)
+}}}
+ * A: There are several approaches.  Select the one most suitable depending on 
what you really want to do.  (Thanks, everybody, for all the 
[http://nagoya.apache.org/eyebrowse/[EMAIL PROTECTED]&by=thread&from=949954 
feedback on the user list].)
 
+''Approach 1:'' Use the fact that null is evaluated as a false conditional.  
(cf. http://jakarta.apache.org/velocity/user-guide.html#Conditionals)
+{{{
+#if( ! $car.fuel )
+}}}
+ ''Note:''  The conditional will also pass if the result of $car.fuel is the 
boolean false.  What this approach is actually checking is whether the 
reference is '''null or false'''.
 
+''Approach 2:'' Use the fact that null is quiet references.  (cf. 
http://jakarta.apache.org/velocity/user-guide.html#Quiet%20Reference%20Notation)
+{{{
+#if( "$!car.fuel" == "" )
+}}}
+ ''Note:''  The conditional will also pass if the result of $car.fuel is a 
blank String.  What this approach is actually checking is whether the reference 
is '''null or blank'''.
+BTW, just checking for '''blank''' can be achieved by:
+{{{
+#if( "$car.fuel" == "" )
+}}}
+
+''Approach 3:'' Combine Approach 1 and 2.  This will check for '''null and 
null only'''.
+{{{
+#if ((! $car.fuel) && ("$!car.fuel" == ""))
+}}}
+ ''Note:''  The logic underlying here is that:  "(null or false) and (null or 
> empty-string)" => if true, must be null.  This is true because "false and 
empty-string and not null" is never true.  IMHO, this makes the template too 
complicated to read.
+
+''Approach 4:'' Use a Tool that can check for null (NullTool).
+{{{
+#if( $null.isNull($car.fuel) )
+}}}
+ ''Note:''  Of course, NullTool must be in the Context as $null in this case.
+
+''Approach 5:'' Don't check for null directly, use a self-explaining method.
+{{{
+#if( $car.fuelEmpty )
+}}}
+ ''Note:''  This is my (Shinobu Kawai's) recommended solution.  You have to 
implement the method, but it makes the template so easy-to-read.
+{{{
+public boolean isFuelEmpty()
+{
+  // return true if fuel is empty.
+}
+}}}
+[[BR]]
 
 
 === Velocity Tools ===

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to