Well, for whatever reason, this seemed kind of entertaining (sad, huh?) so I
fleshed it out a bit and actually gave it a test run. Since both JSTL and Struts
taglibs can deal with a Map (JSTL doesn't have a clue about DynaBeans), that
seemed like a better way to go. So, the reflection can be done by a couple of
different methods:
public static DynaBean getConstantFieldsAsBean(Class cls)
throws IllegalAccessException,
InstantiationException,
InvocationTargetException
public static Map getConstantFieldsAsMap(Class cls)
throws IllegalAccessException
I added a context-param element to web.xml:
<context-param>
<param-name>com.dotech.CLASS_NAMES</param-name>
<param-value>javax.servlet.http.HttpServletResponse,org.apache.struts.Globals</param-value>
</context-param>
along with a listener element:
<listener>
<listener-class>com.dotech.ConstantsContextListener</listener-class>
</listener>
The listener parses class names out of the context init param, invokes the
utility method to create a Map of its constants, and then stores the Map in
application scope using the class name as the key.
For the Struts taglibs, the following kinds of access worked fine:
<bean:write name="org.apache.struts.Globals"
property="ERROR_KEY"/>
<bean:define id="strutsGlobals"
name="org.apache.struts.Globals" \
scope="application"/>
<bean:write name="strutsGlobals"
property="ERROR_KEY"/></p>
For JSTL:
<c:out value="${applicationScope['org.apache.struts.Globals'].ERROR_KEY}"/>
<c:out value="${applicationScope['org.apache.struts.Globals']['ERROR_KEY']}"/>
<c:set var="strutsGlobals"
value="${applicationScope['org.apache.struts.Globals']}"/>
<c:out value="${strutsGlobals.ERROR_KEY}"/>
<c:out value="${strutsGlobals['ERROR_KEY']}"/>
I have no idea if that's of help to anyone, but if you want more details I'd be
happy to follow-up.
Quoting Kris Schneider <[EMAIL PROTECTED]>:
> Sounds like a job for a beanutils mechanism that does something like
> (untested):
>
> Class clazz = GLOBALS.class;
> String className = clazz.getName();
>
> Map propMap = new HashMap();
> List dynaProps = new ArrayList();
> Field[] allFields = clazz.getDeclaredFields();
> for (int i = 0, n = allFields.length; i < n; i++) {
> Field f = allFields[i];
> int mods = f.getModifiers();
> if (Modifier.isPublic(mods) &&
> Modifier.isStatic(mods) &&
> Modifier.isFinal(mods)) {
> String name = f.getName();
> Class type = f.getType();
> Object value = f.get(null);
> DynaProperty prop = new DynaProperty(name, type);
> dynaProps.add(prop);
> propMap.put(name, value);
> }
> }
>
> DynaProperty[] props = new DynaProperty[dynaProps.size()];
> dynaProps.toArray(props);
>
> BasicDynaClass dynaClass = new BasicDynaClass(className, null, props);
> DynaBean dynaBean = dynaClass.newInstance();
> BeanUtils.populate(dynaBean, propMap);
> servletCtx.setAttribute(className, dynaBean);
>
> Which gets you a DynaBean with all the constants exposed as properties.
> Lots of other twists possible...
>
> Eddie Bush wrote:
> > ... but can you even do that? Can you use class-static methods without
> > an instance of the class?
> >
> > I've toyed with the idea of adding getters for constants into the
> > Globals class, and then placing an instance of that class into
> > application-scope. What name should a person use though? If you use
> > the typical method of doing this you wind up with a chicken and egg
> > scenario in your pages. Of course, if we feel pretty satisfied that the
> > location of the Globals probably isn't going to change again we could
> > probably just decide that they will always be available under
> > "org.apache.struts.GLOBALS" and be done with it. You could then get
> > ahold of the instance easily - and use that instance to reference other
> > objects.
> >
> > Incidentally, I don't believe there are any getters in the Globals class.
> >
> > David Graham wrote:
> >
> >> I see, so I have to do constants.getMyKey(). I guess that's easy
> enough.
> >>
> >> David
> >
> >
>
> --
> Kris Schneider <mailto:[EMAIL PROTECTED]>
> D.O.Tech <http://www.dotech.com/>
>
>
> --
> To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
>
--
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech <http://www.dotech.com/>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>