Good question!  I should have included the "indexId" attribute of
<logic:iterate>.  JavaScript can capture an onchange event from (in my
example) the states' dropdown and retrieve the associated cities like:

<html:select * * * 
    onchange="getCities()">
  <logic:iterate * * *
                 indexId="stateIndex"
* * *
  </logic:iterate>
</html:select>

<script type="text/javascript">
  function getCities() {
    window.location="/do/getCitiesAction?state=<%=stateIndex%>
  }
</script>

In GetCitiesAction.java, you reference the states List that is already in
application (context) scope:

  List states = new ArrayList(( List) context.getAttribute( "statesList");

The state for which you want to find the cities is the element at
"stateIndex:"

  String state = states.get( Integer.valueOf( request.getParameter(
"stateIndex"));

Now ask your DAO for a List of cities for this state and stick them in
session scope so your JSP can access them much the same as you do for the
states:

  request.getSession().setAttribute( "cities", cities);

Have struts config map "success" back to the same JSP page, where now the
cities can be accessed and displayed in a dropdown:

<logic:notEmpty name="cities"
                property="<%= session.getAttribute( \"cities\")"
                scope="session">
  <bean:define name="<%= session.getAttribute( \"cities\") %>"
                   property="name"
                   type="com.company.DAO.City"
                   id="city"
                   scope="session" />

Now you can populate an <html:select> object with option values using "city"
as the name:

  <html:select property="cities">
    <html:options name="city" />
  </html:select>
</logic:notEmpty>

Note that you have this code on in your JSP to begin with, so wrap it in a
<logic:notEmpty> to prevent a NullPointerException when the page is first
rendered.  Also, note that this time I used a <bean:define> to bring the
cities list into page scope, and the <html:options> tag, which handles maps
and collections in one step.

You can get the value any JSP object in JavaScript like:

  <script type="text/javascript">
    function checkCity() {
      for( var i = 0; i < document.forms[0].cities.length; i++) {
        if( document.forms[0].cities.options[ i ].selected == true) {
          var city = document.forms[0].cities.options[ i ].text;

          }
      }
      // do something with the city
    }
  </script>

Or manipulate it like:

  <script type="text/javascript">
    var city = String( <bean:write name="cities" property="name" />);
    var population = parseInt( <bean:write name="cities" property="pop" />);
    // do something or display
  </script>


There ya go, dude!  Hope I didn't muddy the water too much.
Mark


-----Original Message-----
From: Gary Tam [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, June 04, 2002 6:23 AM

Mark, one more question, is it possible to use java script to
acess/maniuplate jsp session objects ?
In your example, the onChange event gets fire and goes out to retrieve the
cities of the state,
how can the action class know which row/state that fired the event ?


Thanks


----- Original Message -----
From: "Galbreath, Mark" <[EMAIL PROTECTED]>
Newsgroups: Struts
Sent: Monday, June 03, 2002 8:32 AM
Subject: RE: a newbie question on iterate


> The answer, unfortunately, is "all of the above."  The iterate tag
iterates
> through both maps and collections in any form and in any scope, and you
> display the contents of map and collection values with the <bean:write>
tag.
> A typical map would be key-value pairs placed in memory as
> session.setAttribute() objects, whereas typical lists are placed in memory
> by the ActionServlet instantiating a JavaBean (as a Struts form bean) and
> making it's getters (accessors) and setters (mutators) available to JSPs
and
> Action classes.
>
> For example, let's say you want to display a list of cities for a
particular
> state when a user selects a state from a drop-down list in a JSP.  First,
> how would you populate the states list?  It would be pretty tedious to
> hard-code 50 states + D.C. + any territories (like Puerto Rico or Guam)
into
> the JSP as HTML <select> <option>s, not to mention bloating the source
code.
> With Struts, however, this is a piece of cake:
>
>   1.  User is forwarded to the states/cities page from some JSP through
some
> Action Mapping that uses an Action class that in turn requests a List of
> states from a DAO (data access object - a helper class concerned only with
> querying the database).
>
>   2.  The Action class takes the List and puts it into application scope
(in
> this case, since the List can be reused by any other clients):
>     ServletConfig.getServletContext().setAttribute( "statesList", states);
>
>   3.  The states/list JSP can then display this List of states as an HTML
> drop-down:
>     <html:select name="states">
>       <logic:terate name="statesList"
>                     property="states"
>                     scope="application"
>                     type="com.company.dao.state"
>                     id="state">
>         <html:option value="<%= state.getName() %>">
>           <%= state.getName() %>
>         </html:option>
>       </logic:iterate>
>     </html:select>
>
>   4.  A JavaScript onchange() event handler can then call the Action class
> to request a list of cities from, say the city DAO (City.java), based on
the
> selected state and populate a "City" drop-down select box in the same
> manner.
>
> This is about as simple as it gets, but note that using JSP scripting
> variables is generally frowned upon by the purists.  But I hope you get
the
> idea and then can move on to using the <html:options> tag.  Note that the
> List could also have been stored as a TreeMap and you could set the option
> values with something like state.getAbbreviation().  The various
attributes
> are explained in the Struts tag documentation.
>
> To use a JavaBean (Struts form bean - a special use of JavaBeans that use
> only booleans and Strings) with a JSP, you simply create a bean with
> mutators and accessors matching the names of the input objects in your
HTML
> form contained in your JSP.  For example, if you have a form taking user
> info:
>
>   <html:form action="/do/userInfo" method="post">
>     <html:text property="fname" size="20" maxlength="20" />
>     <html:text property="lname" size="20" maxlength="20" />
>     <html:text property="street" size="20" maxlength="20" />
>     <html:text property="city"  size="20" maxlength="20" />
>     <html:text property="state" size="20" maxlength="20" />
>   </html:form>
>   <html:submit value="Submit" />
>
> You would create a form bean like:
>
> ***
> package and import statements
> ***
>
> public class UserInfo extends ActionForm implements Serializable {
>   private String fname = "";
>   private String lname = "";
>   private String street = "";
>   private String city = "";
>   private String state = "";
>
>   public void setFname( String fname) {
>     this.fname = fname;
>   }
>   public String getFname() {
>     return fname;
>   }
> /*
> same pattern for other fields
> */
>
>   public void reset( ActionMapping map, HttpServletRequest req) {
>     super.reset( map, req);
>     fname = "";
>     lname = "";
>     password = "";
>     //etc.
>   }
> }
>
> Now, when the user hits "Submit," the Action class associated with the
path
> "/do/userInfo" will be called by ActionServlet but before the action's
> execute() method is called, UserInfo's setters will be called and its
> properties set, making them available for writing to the database and/or
the
> JSP the action forwards to in struts-config (Note that if you want the
> bean's info available across a user's session, do not reset the properties
> in reset() and declare the bean in session scope in struts-config).
>
> Another JSP can now access UserInfo's properties with <bean:write> like:
>
> <bean:write name="UserInfo" property="fname" />
> <bean:write name="UserInfo" property="lanem" />
> etc.
>
> It's easy to get lost in these tags when you first start out, because they
> are very powerful and can do a lot of things - much of which is
indocumented
> and if discovered by trial-and-error and reading this user list.  The best
> thing you can do at this point, however, is thoroughly read the taglib
> documentation.
>
> Good luck!
> Mark
>
> -----Original Message-----
> From: Struts Newsgroup [mailto:[EMAIL PROTECTED]]
> Sent: Sunday, June 02, 2002 10:25 AM
> To: [EMAIL PROTECTED]
> Subject: a newbie question on iterate
>
>
> Subject: a newbie question on iterate
> From: "Gary Tam" <[EMAIL PROTECTED]>
>  ===
> Hi, I am trying to use iterate to display a collection on a jsp, are there
> any simple example out there?  I tried to follow the examples with STRUTS,
> but got all confuse.  Do I have to store the collection in a java bean ?
Is
> this a collection of java beans or simple value objects? etc...  Can
someone
> please set me straight please
>
> TIA
> Gary
>
>
>
> --
> To unsubscribe, e-mail:
> <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
> <mailto:[EMAIL PROTECTED]>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>

--
To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to