I've been responding to your questions here and at JavaRanch on this
subject.

It seems like you are missing the point of DynaActionForms.

Please read 4.3 and 4.4 of the user guide.
http://jakarta.apache.org/struts/userGuide/building_controller.html


Lots of additional comments below.....

Comments below .... look for *****

-----Original Message-----
From: Caroline Jen [mailto:[EMAIL PROTECTED]
Sent: Sunday, January 04, 2004 10:18 PM
To: Struts Users Mailing List
Subject: RE: Please Help - ClassCastException


Allow me to ask three more questions:

1. If I want to reset some specific text fields when
the JSP is re-displayed, do I code the PostForm.java
like this (please confirm):

code:
-----------------------------------------------------
import org.apache.struts.validator.DynaValidatorForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
public class PostForm extends DynaValidatorForm
{
   public void reset(ActionMapping mapping,
HttpServletRequest request)
   {
      super.reset( mapping, request );
      set( "receiver", new String("") );
      set( "sender", new String("") );
   }
   public PostForm () {}
}

*************** Why not just use the intial attribute of the form-property
element?


-------------------------------------------------------

2. if I want to reset all the text fields when the JSP
is re-displayed, do I code like this (please confirm):

code:
-------------------------------------------------------
import org.apache.struts.validator.DynaValidatorForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;

public class PostForm extends DynaValidatorForm
{
   public void reset(ActionMapping mapping,
HttpServletRequest request)
   {
       initialize( mapping );
   }
   public PostForm () {}
}
------------------------------------------------------

*************** Why not just use the intial attribute of the form-property
element?


3. What is the difference between

code:
-------------------------------------------------------
<form-bean
   name="postForm"
   type="package.package.package.PostForm">
      <form-property
          name="receiver"
          type="java.lang.String"/>
      <form-property
          name="sender"
          type="java.lang.String"/>
</form-bean>
-------------------------------------------------------

AND

code:
------------------------------------------------------
<form-bean
   name="postForm"
type="org.apache.struts.validator.DynaValidatorForm">
      <form-property
          name="receiver"
          type="java.lang.String"/>
      <form-property
          name="sender"
          type="java.lang.String"/>
</form-bean>
---------------------------------------------------

Thank you very much.

*************** The second one makes sense. Why do you need the PostForm
class?

see my answer to a similar question of yours at JavaRanch....

http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=58&t=
001820


Here is a snippet of some tutorial I am working on that might help.....

DynaActionForms are universally loved and hated. In teaching, consulting
Struts and developing with Struts, I have found that DynaActionForms are
either embraced or rejected. The idea behind DynaActionForms is that instead
of creating an ActionForm per form, you instead configure an ActionForm per
form.

Advantages of DynaActionForms:
Some folks feel creating an ActionForm class for each HTML form in your
Struts application is time-consuming, causes maintenance problems, and is
frustrating. With DynaActionForm classes you don't have to create an
ActionForm subclass for each form and a bean property for each field.
Instead you configure an DynaActionForm its properties, type, and defaults
in the Struts configuration file.

.... snip

To configure a DynaActionForm in struts-config.xml, you use a form-bean
element as with normal ActionForm. The type of the form bean must be
org.apache.struts.action.DynaActionForm or a derived class. You then add
form-property elements to declare the properties of the form.

To use a DynaActionForm add the following to form-beans element (example):
     <form-bean name="userRegistrationDynaForm"
               type="org.apache.struts.action.DynaActionForm">

         <form-property name="userName"
                        type="java.lang.String" />
         <form-property name="email"
                        type="java.lang.String" />
         <form-property name="password"
                        type="java.lang.String" />
         <form-property name="passwordCheck"
                        type="java.lang.String" />
         <form-property name="firstName"
                        type="java.lang.String" />
         <form-property name="lastName"
                        type="java.lang.String" />
         <form-property name="phone"
                        type="java.lang.String"
                        initial="(520) "/>
         <form-property name="fax" type="java.lang.String" />
         <form-property name="page"
                                  type="java.lang.Integer" />
      </form-bean>

Then create an action mapping that uses this ActionForm:
    <action path="/userRegistrationDyna"
            type="strutsTutorial.UserRegistrationAction"
            name="userRegistrationDynaForm"
            attribute="user"
            input="/userRegistrationDyna.jsp">
              ...
              <forward name="success"
                       path="/regSuccess.jsp" />
              <forward name="failure"
                       path="/regFailure.jsp" />
    </action>

Then modify the Action to use the new DynaActionForm:
public class UserRegistrationAction extends Action {

     ...
        public ActionForward execute(...
                  /* Cast the form into a DynaActionForm */
                   DynaActionForm userDynaForm =
                     (DynaActionForm) form;
                        log.debug("userForm email " +
                   userDynaForm.get("email"));

Notice how the action accesses the email property of the DynaActionForm
(userDynaForm.get("email")). Working with DynaActionForms is a lot like
using a HashMap.
The nice thing about DynaActionForms is that the BeanUtils framework treats
them just like regular JavaBeans. Thus, the following code does not really
change from the static version of ActionForm as follows:
                        /* Create a User DTO and copy the properties
                     from the userForm */
                        User user = new User();
                        BeanUtils.copyProperties(user, form);


Working with DynaActionForms and the Validator Framework is quite easy. When
you set up the dynamic form in the Struts configuration file, use the
DynaValidatorForm class instead of the DynaActionForm class as follows (in
struts-config.xml):
     <form-bean name="userRegistrationDynaForm"
         type="org.apache.struts.validator.DynaValidatorForm">


         <form-property name="userName"
                        type="java.lang.String" />
         <form-property name="email"
                        type="java.lang.String" />
         <form-property name="password"
                        type="java.lang.String" />
         <form-property name="passwordCheck"
                        type="java.lang.String" />
         <form-property name="firstName"
                        type="java.lang.String" />
         <form-property name="lastName"
                        type="java.lang.String" />
         <form-property name="phone"
                        type="java.lang.String"
                        initial="(520) " />
         <form-property name="fax" type="java.lang.String" />
         <form-property name="page"
                        type="java.lang.Integer" />
         <form-property name="birthDate"
                        type="java.lang.String" />
         <form-property name="zip"
                        type="java.lang.String" />
         <form-property name="dynamicProps"
                        type="java.util.HashMap" />

      </form-bean>

The validate method of the DynaValidatorForm provides the necessary hooks
into the Validator Framework to tie the validation rules you define in
validation.xml to the fields you define in your DynaActionForm. The
Validator Framework and the DynaActionForms have a special relationship.
DynaActionForms typically rely on the Validator Framework to perform
validation. All of the rules we configured and wrote would work the same
with the DynaValidatorForm and static ActionForms--we simply have to
configure the form-property for each field.  Notice that we added three
additional fields birthDate, zip and dynamicProps to work with the
validation rules that we wrote so far. Nothing needed to change in the
validation.xml or validator-rules.xml


--- Joe Hertz <[EMAIL PROTECTED]> wrote:
> Not at all.
>
> First off, set(String, String) is predefined for
> you. You don't need to
> create any of that. In fact, what you will find in a
> DynaValidatorForm is
> that your form classes start to get very sparse.
> Here's really what it could
> look like.
>
>
> public class PostForm extends BaseDynaForm {
>
>
>   public void reset(ActionMapping actionMapping,
> HttpServletRequest
> httpServletRequest) {
>       // throw new UnsupportedOperationException("Method
> is not
> implemented");
>       }
>
>     public PostForm () {
>    }
>
>
> }
>
> In your ActionForm itself, beanUtils would work
> something like this. All you
> need is to get the right formBean object.
>
>   public ActionForward  execute(ActionMapping
> mapping, ActionForm form,
> HttpServletRequest request, HttpServletResponse
> response) throws Exception {
>
>               PostForm pForm = (PostForm) form;
>
>                // other code you write here
>
>               BeanUtils.copyProperties(yourBean, pForm);
>
> // etc
>
> Doing it yourself without beanUtils?
>
> Instead of calling getSender() and having a String
> returned, you call get
> ("sender") and it will return an Object (cast it
> yourself to whatever type
> the sender form property really is). I made a base
> form class with a
> getString method that calls get() and does the
> String cast for me to save the
> tediom.
>
> Making sense now?
>
> > -----Original Message-----
> > From: Caroline Jen [mailto:[EMAIL PROTECTED]
> > Sent: Sunday, January 04, 2004 2:46 AM
> > To: Struts Users Mailing List
> > Subject: RE: Please Help - ClassCastException
> >
> >
> > I am still confused...
> >
> > I have a jsp that provides text fields for user to
> > fill out information.  All the information is
> passed
> > via HttpRequest and to be validated.  And all the
> > properties in my PostForm are populated by the
> > information retrieved from those text fields.
> >
> > And my PostForm is of
> >
>
type="org.apache.struts.validator.DynaValidatorForm">
> >
> > Therefore, in my PostForm.java, I should do
> something
> > like this?  I just do not think the following code
> is
> > correct.
> >
> >
>
======================================================
> > import
> org.apache.struts.validator.DynaValidatorForm;
> >
> > public class PostForm extends DynaValidatorForm  {
> >
> >     private String receiver;
> >     private String sender;
> >
> >     public void set(String receiver, String
> receiver);
> >     public void set(String sender, String sender);
>
> >     public String get(String receiver, String
> > receiver);
> >     public String get(String sender, String
> sender);
> > }
> >
>
======================================================
> > And you are saying that in my action class, I
> should
> >
> > .......
> > import org.apache.struts.action.Action;
> > import org.apache.struts.action.ActionForward;
> > import org.apache.struts.action.ActionMapping;
> > import org.apache.struts.action.ActionForm;
> >
> > import org.apache.commons.beanutils.BeanUtils;
> > import javax.servlet.http.HttpServletRequest;
> > import javax.servlet.http.HttpServletResponse;
> >
> > import org.apache.artimus.message.PostForm;
> > import org.apache.artimus.message.PostBean;
> > import org.apache.artimus.message.ThreadBean;
> > import
> org.apache.artimus.message.utility.DateUtil;
> >
> > public final class StoreMessage extends Action
> > {
> >    public ActionForward execute(ActionMapping
> mapping,
> >                                 ActionForm form,
> >                                 HttpServletRequest
> >  request,
> >
> HttpServletResponse
> >  response)
> >         throws Exception
> >    {
> >
> >       int parentPostID;
> >       int threadID;
> >       String memberName = request.getRemoteUser();
> >       Timestamp now =
> >  DateUtil.getCurrentGMTTimestamp();
> >       parentPostID = Integer.parseInt(
> >  request.getParameter( "parent" ) );
> >
> >       ActionForm postForm = ( ActionForm )form;
> >
> >       ThreadHandler thandler = new
> ThreadHandler();
> >
> >       ThreadBean threadBean = new ThreadBean();
> >       BeanUtils.copyProperties( threadBean,
> postForm
> > );
> >
> >       if (parentPostID == 0 ) // new topic
> >       {
> >          threadBean.setLastPostMemberName(
> memberName
> > );
> >          threadBean.setThreadCreationDate( now );
> >          .........
> >          .........
> >
> >          threadID = thandler.insertThread(
> threadBean
> > );
> >
> >       }
> >    .......
> >    .......
> >    }
> > }
> >
> > --- Joe Hertz <[EMAIL PROTECTED]> wrote:
> > > Well, first off:
> > >
> > > In your (dyna) form, you don't create setters
> and
> > > getters for the properties
> > > though. With DynaForms you would say
> > > set("myPropertyName", "myString")
> > > instead of calling
> setMyPropertyName("myString").
> > > This is the Dyna part of
> > > DynaForms. It's much less tedious IMHO.
> > >
> > > In your action, you absolutely want to cast the
> form
> > > to PostForm. Otherwise
> > > the form variable has no way to know properties
> are
> > > associated with it. So
> > > yes, once you cast it to PostForm calls to
> > > BeanUtils.copyProperties() can and
> > > will work properly.
> > >
> > > Hope this helps,
> > >
> > > -Joe
>
=== message truncated ===


__________________________________
Do you Yahoo!?
Protect your identity with Yahoo! Mail AddressGuard
http://antispam.yahoo.com/whatsnewfree

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

Rick Hightower
Developer

Struts/J2EE training -- http://www.arc-mind.com/strutsCourse.htm

Struts/J2EE consulting --
http://www.arc-mind.com/consulting.htm#StrutsMentoring


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

Reply via email to