tomcat-taglibs-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Billy Bacon <billy.ba...@thirty3.net>
Subject Re: Problems with <c:out> tag
Date Sun, 06 Jul 2003 01:23:18 GMT
Thanks for your response Hans, that was very helpful. This might be more of
a Struts issue then because I don't have a JavaBean for my 'Form' object. I
use the Struts DynaActionForm object which does all the 'getting' and
'setting' for you. I have this element defined in my struts-config.xml
file...

<form-bean name="adminDownloadForm"
type="org.apache.struts.action.DynaActionForm">

<form-property name="idFlag" type="java.lang.Boolean" />

</form-bean>

Defining the property 'idFlag' with a type Boolean is all I have to do and
Struts pretty much does the rest of the getting/setting. I'm not sure how
the DynaActionForm is implemented since it's a core Struts class but in
anycase it doesn't look like I could fix this since I don't define the Bean.

Thanks for the input!

- Billy -


On 7/5/03 6:53 PM, "Hans Bergsten" <hans@gefionsoftware.com> wrote:

> Billy Bacon wrote:
>> I've run into the same issue but with a different tag other than <c:out>.
>> I'm assuming they are related but I'm really looking for some advice here...
>> 
>> I'm in the process of converting my application to JSTL from Struts tags.
>> Once Struts 1.1 Release Candidate 2 came out supporting EL I decided to
>> stick with Struts EL since converting the entire application to JSTL and
>> removing all of my Struts tags didn't seem possible when I started to run
>> into this issue.
>> 
>> In my original code I had the following "if" statement within my JSP...
>> 
>> <logic:equal name="adminDownloadForm" property="idFlag" value="true">
>> <%-- Show some related information if 'idFlag' evaluates to true --%>
>> </logic:equal>
>> 
>> The above worked just fine and returned the expected information. When I
>> tried to convert this simple "if" statement to JSTL I ran into a problem...
>> Here's the code I attempted to use...
>> 
>> <c:if test="${adminDownloadForm.idFlag}">
>> <%-- Show some related information if 'idFlag' evaluates to true --%>
>> </c:if>
>> 
>> Once I tried the <c:if> tag and executed the JSP I received the error
>> described by Matt below... "
>> 
>> 
>>>> An error occurred while evaluating custom action
>>>> attribute "value" with value
>>>> "${adminDownloadForm.idFlag}": Unable to find a value for
>>>> "ifFlag" in object of class
>>>> "com.xxxx.xxx.xxxx.xxx" using operator "."
>>>> (null)' 
> 
> This means that there's something quite not right with the "idFlag"
> property in your bean. The JSTL EL goes strictly by the JavaBeans
> specification, so the bean must satisfy all rules for the property access
> methods. A quite common problem is to have a "getter" method that returns
> an object of one type, and a "setter" method that takes an object of
> another type:
> 
>  public class MyBean {
>    ...
>    public boolean getIdFlag() {...}
>    public setIdFlag(String value) {...}
>  }
> 
> This is not valid according to the JavaBeans spec, so the end result is
> that this class doesn't define a property named "idFlag" at all, even
> though it has a getIdFlag() method.
> 
>> JSTL is not aware of the adminDownloadForm object. I know this Form is
>> related to Struts but the behavior of these JSTL tags is inconsistent. In
>> order to get my <c:if> tag to work properly I had to use a <bean:define>
tag
>> from the Struts library and define the 'idFlag' variable.
>> 
>> Now if I do something like this, my <c:if> tag works fine....
>> 
>> <bean:define id="idFlag" name="adminDownloadForm" property="idFlag" />
>> <c:if test="${idFlag}">
>> ....
>> </c:if>
> 
> I have not looked at the Struts code, but I assume that it doesn't use
> the JavaBeans support classes to get the property value. If it uses
> plain introspection to get hold of a method called getIdFlag() and call
> it, it works even though the class doesn't have a bean property with the
> name "idFlag" according to the JavaBeans spec.
> 
>> But now I'm writing two lines of code when all I needed was one line using
>> the <logic:equals> tag from the Struts library. I know an additional line of
>> code is not the end of the world but which is better practice? Is having
>> Struts tags and JSTL tags in your JSP bad practice? Could it cause confusion
>> to other developers down the road?
> 
> In general, using more than one tag library from different sources in a
> JSP application is not bad practice (it's commonly needed, actually).
> But I recommend sticking to JSTL in the cases where there's a direct
> replacement for the Struts tag, as in the case of <logic:equals> vs.
> <c:if>.
> 
>> Back to my point of JSTL being inconsistent... I have this standalone tag in
>> my JSP (with no bean define or <c:set> and I do not get an exception from
>> this tag... It works just fine....
>> 
>> <c:forEach var="assetType" items="${summaryForm.assetTypeQueues}">
>> 
>> What's confusing and inconsistent is that I didn't need to define the
>> 'summaryForm' object. It was capable of seeing it and extracted the variable
>> I asked from it just fine. Why doesn't the <c:if> tag act in the same
>> manner? Is this a bug or am I doing something wrong?
> 
> See above. It's arguably a bug in your bean class (unless there's something
> else going on here that I'm not aware of).
> 
>> I apologize for the novel I just wrote but I didnĀ¹t want to leave out any
>> details. Any advice would be greatly appreciated.
> 
> I hope this helps,
> Hans


---------------------------------------------------------------------
To unsubscribe, e-mail: taglibs-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: taglibs-user-help@jakarta.apache.org


Mime
View raw message