The <rtexprvalue> is especially important because it tells you whether the value of the attribute is evaluated at translation or runtime. If the <rtexprvalue> is false, or the <rtexprvalue> isn’t defined, you can use only a String literal as that attribute’s value!
If you see this:
<attribute> <name>rate</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute>
Then you know THIS WON’T WORK!
Q: You still didn’t answer the question about how you know what type the attribute is...
A: We’ll start with the easy one. If the <rtexprvalue> is false (or not there at all), then the attribute type can be ONLY a String literal. But if you can use an expression, then you have to hope that it’s either dead obvious from the tag description and attribute name, OR that the developer included the optional <type> subelement of the <attribute> element. The <type> takes a fully-qualified class name for the type. Whether the TLD declares the type or not, the Container expects the type of the expression to match the type of argument in the tag handler’s setter method for that attribute. In other words, if the tag handler has a setDog(Dog) method for the “dog” attribute, then the value of your expression for that attribute better evaluate to a Dog ...