That approach is fine if you are working with a single page and a
single drop-down, but when you need to share a drop-down definition
several times it starts crumble a bit. What usually do for all of my
applications is I first add a DataDictionary POJO with the purpose of
creating all the lists I need to use in the application. I will get
to the code, but I need to take a tangent first....
So a DataDictionary has a Set<String> values. So I create a
DataDictionary named "Status" and I add the String status values to
its values Set. Notice that the values have no key, so the String
gets saved for the drop-down field. I went to this model more and
more recently as I found 99% of the time, option values were not
changing and when they did, a simple String replace was just fine
since it was usually a big decision to change it. The upside is that
I have the actual value in my record for queries and reports and don't
have to constantly "lookup" the text for Status #1. All this being
said, I have a couple implementations where instead of Set<String>
values I have used <Set>DataDictionaryItem values and the item POJO
has optValue and optKey properties....
To the code (Some code/syntax paired for brevity)
****DataDictionary.java********
@Entity
@Table(name = "datadictionary")
public class DataDictionary{
@Id
@GeneratedValue
private Long id;
private int version;
private String name;
@CollectionOfElements(fetch = FetchType.EAGER)
@JoinTable(name = "datadictionary_values",
joinColumns = @JoinColumn(name = "datadictionary_id"))
@Column(name = "value")
@IndexColumn(name = "position")
private List<String> values;
Note, the position @IndexColumn. If you wish you could just as well
add an @OrderBy instead but realize that will then sort all your lists
alphabetically. I traded the flexibility of being able to order my
lists however I want for having to manually alphabetize if I that is
what I want.
****sample-data.xml****
<table name="datadictionary">
<column>id</column>
<column>version</column>
<column>name</column>
<row>
<value description="id">1</value>
<value description="version">0</value>
<value description="name">Status</value>
</row>
</table>
<table name="datadictionary_values">
<column>datadictionary_id</column>
<column>value</column>
<column>position</column>
<!--Status-->
<row>
<value>1</value>
<value>Pending</value>
<value>0</value>
</row>
<row>
<value>1</value>
<value>Open</value>
<value>1</value>
</row>
<row>
<value>1</value>
<value>Closed</value>
<value>2</value>
</row>
</table>
I just use xml and dbunit to define and load my keyword lists into the
database. A UI would be nice, but I found in the real world its just
once or twice and then never again.
****ApplicationContext,xml**
<!--DataDictionaryManager-START-->
<bean id="dataDictionaryManager"
class="com.jmh.foundation.service.impl.GenericManagerImpl">
<constructor-arg>
<bean
class="com.jmh.foundation.dao.hibernate.GenericDaoHibernate">
<constructor-arg
value="com.jmh.foundation.model.DataDictionary"/>
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</constructor-arg>
</bean>
Create a GenericMananger/Dao for DataDictionary to look them up when
we startup the application.
**MyAppStartupListener.java**
public class MyAppStartupListener extends StartupListener implements
ServletContextListener {
private static Log log =
LogFactory.getLog(MyAppStartupListener.class);
public void contextInitialized(ServletContextEvent event) {
super.contextInitialized(event);
log.debug("initializing Myapp context...");
ServletContext context = event.getServletContext();
setupJmicContext(context);
}
public static void setupJmicContext(ServletContext
servletContext) {
ApplicationContext ctx =
WebApplicationContextUtils
..getRequiredWebApplicationContext(servletContext);
GenericManager gmgr = (GenericManager)
ctx.getBean("dataDictionaryManager");
List<DataDictionary> dictionaries = gmgr.getAll();
Set<DataDictionary> uniqueDictionaries = new
HashSet<DataDictionary>(dictionaries);
for (DataDictionary dic : uniqueDictionaries) {
log.debug("Loading dictionary values for :" +
dic.getName());
servletContext.setAttribute(dic.getName(),
dic.getValues());
}
}
}
Extends the Appfuse startup listener and loads all of the defined
DataDictionaries into the ServletContext. This will let us access the
lists using the <s:select list="#attr.Status".../> later. The
super(...) calls makes sure that Appfuse gets initialized properly
before your app does its thing.
***web.xml**
<listener>
<listener-
class>com.jmh.hcc.webapp.listener.MyAppStartupListener</listener-class>
</listener>
Swap your StartupListener in for the Appfuse listener.
***form.jsp***
<s:select list="#attr.Status" emptyOption="true" ..../>
That is when your dictionary values are a regular Set<String>. If you
went for the full value/key DataDictionaryItem child object then .....
<s:select list=#attr.Status" listValue="optValue" listKey="optKey" ..../>
Remember the property names of our child object way back at the
top? ......
The #attr.[nameoflist] uses the name of the dictionary object you
defined in the xml.
Now you can create as many lists as you want and share them anywhere
in the application. They are all loaded into memory for great
performance. So now we just need some people to post the dbunit xml
for inserting a list of state, country, etc Strings.......
-D
On Jun 1, 2008, at 3:16 PM, Paul Were wrote:
Bandula,
To be consistent.
It is better practice to make your view layer interact with the
action support controller struts MVC framework.
If this is the case the your taskForm.jsp should be tied to
TaskAction.java which should be your action class.
In you Action class declare
private List availableStatuses;
private static final PENDING = "PENDING";
private static final OPEN = "OPEN";
private static final DONE = "DONE";
private static final HOLD = "HOLD";
Then have a method in your action class.
public List getAvailableStatuses(){
if(availableStatuses != null){
return availableStatuses;
} else {
availableStatuses= new ArrayList();
availableStatuses.add(PENDING);
availableStatuses.add(OPEN);
availableStatuses.add(DONE);
availableStatuses.add(HOLD);
return availableStatuses;
}
}
In your taskForm.jsp
you add
<s:select label="Available Status"
name="StatusPojo.status"
headerKey="1"
headerValue="-- Please Select --"
list="availableStatuses"
/>
Make the appropriate declarations in your struts config and
applicationContext to hook you action, pojo and jsp.
Hope this helps.
Paul Were.
"Richard Mixon (CustCo)" <[EMAIL PROTECTED]> wrote:
I’m pretty new to Struts2 myself, but all of my Appfuse Struts2
pages use a select tag something like this:
<s:select name="storyText.status.id"
list="activeStatusList" listKey="id" listValue="name"
key="storyText.status"/>
I think your tag looks more like a Struts(1) tag.
Here is the Struts2 reference page for the select tag:
http://struts.apache.org/2.0.11.1/docs/select.html
Hope this helps.
From: Bandula Rathnasekara <[EMAIL PROTECTED]>
Reply-To: <users@appfuse.dev.java.net>
Date: Sun, 1 Jun 2008 12:36:01 +0530
To: <[EMAIL PROTECTED]>
Cc: <users@appfuse.dev.java.net>
Subject: [appfuse-user] Drop-Down List
Hi all,
I want to add simple drop down list in a JSP page with my Struts2
web application on AppFuse framework. I went through related post in
web and tried to do it with StartupListener class.
I created/modified following classes/jsp.
1. Created Statuses POJO.
Not used for the time being
2. Constant
public static final String AVAILABLE_STATUSES = "availableStatuses";
3. StartupListner
context.setAttribute(Constants.AVAILABLE_STATUSES ,
mgr.getObjects(TaskStatuses.class));
4. LookupManager
public List<LabelValue> getObjects(Class<TaskStatuses> name);
5. LookupManagerImpl
public List<LabelValue> getObjects(Class<TaskStatuses> name) {
List<LabelValue> list = new ArrayList<LabelValue>();
list.add(new LabelValue("PENDING", "PENDING"));
list.add(new LabelValue("OPEN", "OPEN"));
list.add(new LabelValue("DONE", "DONE"));
list.add(new LabelValue("HOLD", "HOLD"));
return list;
}
6. taskForm.jsp
<html:select property="status">
<html:options collection="availableStatuses" property="status"
labelProperty="name"/>
</html:select>
I was struggling with this whole yesterday and I could not populate
drop down-list in my jsp. I don’t even get error in JSP page. Is it
do something with tag libraries in? Any configuration XML file? Can
you tell me where else I need to change/correct.
If anyone has sample code on this or a place where I can find them
pls let me know.
Thanks &Regards,
Bandula