Am Montag, 20. Oktober 2003 15:29 schrieb Jan Aren�:
> Hi

Hi Jan,

> I'm learning Struts at the moment and just finished a very easy
> example. Now when I want to extend it I don't know for sure where to
> put it, or if I have missunderstood something.
>
> I'm also new to taglibs. So i don't know exacly how they work either,
> but I think I start to get a hang of it
>
> I have inputpage with ActionForm and Action-servlets

There is only one ActionServlet. You surely mean Struts Actions?

> On my input page i have 2 fields at the moments, destination and
> type. These fields are validated and errormessages are returned as
> they should etc etc. When validated I go to page2.jsp that writes
> "Hello World"
>
> Ok. Heter is my problem.
> I now want to change my destination from a inputform <html:text> to a
> selectbox <html:select>. And I would like to populate it with a
> Vector that I shall get from a database.

First of all: Struts most elegantly supports this via the <html:options>
tag. You might also want to have a look at the <html:optionsCollection>
tag. Both are very flexible. The basic idea is that you populate your
select box with values coming from a Bean. The selected value then
is passed via the <html:select> property. The Collection itself can
be put in any scope (request, session, application). For static lists,
as may be your case as well, I usually use a Listener to put
everything in application scope when the app starts. Here comes
an code snippet of a very basic listener:

package listeners;

import java.util.*;
import javax.servlet.*;
import PersistenceFacade; // some Singleton DAO class that does
the JDBC part

public class ResourceListener implements ServletContextListener �{

� � public void contextInitialized(ServletContextEvent e) {
� � � � Collection coll = PersistenceFacade.getInstance().getSomeList();
� � � � e.getServletContext().setAttribute("MY_LIST", coll);
� � }

� � public void contextDestroyed(ServletContextEvent e) {
� � � � ((ServletContext) 
e.getServletContext()).removeAttribute("MY_LIST");
� � }

The Collection itself is usually an ArrayList built from
LabelValueBeans (org.apache.struts.util) as follows
(note: code heavily simplified here for sake of brevity) -
your DAO that does the database access might
look like this somewhere (though I prefer the iBATIS
Database Layer recently, credits to Ted Husted who
pointed me there (www.ibatis.com)): 

[..]
Collection coll = new ArrayList();
while (rs.next()) {
� b = new LabelValueBean(rs.getString(<LABEL_COLUMN_NAME>),
� � � � � � � � � � � � � � � � � � � � � 
rs.getString(<VALUE_COLUMN_NAME>));
coll.add(b);
}
return coll;

So you finally have your your list stored in some scope. Now,
in the JSP page, you can just put something like this:

<html:select property="selectedValue" value="-1">
<html:options collection="MY_LIST" property="value" 
labelProperty="label" />
</html:select>

When the users selects something, it ends up in the
'selectedValue' property of your ActionForm. You can
specify a default value ("-1" in this case) by setting
the 'value' property of <html:select>.

> Earlier (before struts) I would create a bean conn. Then call :
>
> conn.createDBConnection();

If your server allows, don't use DriverManager anymore,
but make use of DataSources and use JNDI to locate
it. Some more code in this direction:

private DataSource getDataSource() {
� DataSource ds = null;
� �try {
� � � �Context ctx = new InitialContext();
� � � �ds = (DataSource) ctx.lookup(Constants.SC_JNDI_DATASOURCE);
� �} catch (NamingException e) { log(e.getMessage()); }
� � return ds;
� �}

If you have luckily got a DataSource, it's easy to get
a Connection object from that:

private Connection getConnection() {
� Connection conn = null;
� try {
� � conn = getDataSource().getConnection();
� � if (conn != null) {
� � conn.setAutoCommit(false);
� � }
� } catch (SQLException e) { log(e.getMessage()); }
� � � return conn;
}

Then, it's business as usual.

> Vector myDest = conn.getDestinations(); conn.closeDBConnection();
>
> Where should I now do this? Where should I store the Vector?

No. Though it can be done, you should store the Vector (better
not say 'Vector', as that is implementation-specific, but make
use of interfaces instead, and Vector implements the Collection
interface) apart from the form. You can use any scope you
like, request for 'per-incident' lists, session scope for each
user individually or application scope for all of them. Each
'scope' has a setAttribute() method, so you're free to choose :-)

> In the ActionForm? I thought that it only had references to the
> fields that the user are supposed to submit. The Action class is not
> called until ActionForm is validated, ain't it so?

Exactly. The information *what* is in the list normally comes
from somewhere else. The value the user finally selects ends
up as a property in your ActionForm.

> How should this be done...
>
> Thanks for any help

HTH,

-- Chris (SCPJ2)

===========================================================================
To unsubscribe: mailto [EMAIL PROTECTED] with body: "signoff JSP-INTEREST".
For digest: mailto [EMAIL PROTECTED] with body: "set JSP-INTEREST DIGEST".

Some relevant archives, FAQs and Forums on JSPs can be found at:

 http://java.sun.com/products/jsp
 http://archives.java.sun.com/jsp-interest.html
 http://forums.java.sun.com
 http://www.jspinsider.com

Reply via email to