You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by bu...@apache.org on 2001/11/14 00:48:40 UTC

DO NOT REPLY [Bug 4856] New: - Make ActionForm an Interface

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=4856>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=4856

Make ActionForm an Interface

           Summary: Make ActionForm an Interface
           Product: Struts
           Version: Unknown
          Platform: All
        OS/Version: Other
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: Standard Actions
        AssignedTo: struts-dev@jakarta.apache.org
        ReportedBy: larryw@vestek.com


Short description: 
Since Java doesn't have multiple inheritance, having ActionForm as an abstract 
class is causing a proliferation of classes that have the nearly the same 
functionality and implementation.

Long description: 
I'm working on a project involving EJBs and Struts -- The EJB tier is capable 
of serving up both the standard remote-interface Entity Beans as well as 
Serializable 'info' objects that represent the same data as an Entity Bean 
(a.k.a Value Objects).  These 'info' objects are what the client tier uses as 
the basis of it's data model.

My ActionForm subclasses are basically equivalent to my Serializable 'info' 
objects (SIOs), except the ActionForm subclasses all have String fields, where 
the SIOs have other types, like Integer and java.sql.Timestamp.  They are both 
JavaBeans-like: they contain only matching getXxx and setXxx accessors.  That 
is the problem, they are twice the coding and maintenance, lots of duplication.

What I would like to do is have the EJBTier serve the SIOs, and the struts tier 
ActionForms would subclass these SIOs, and _implement_ ActionForm, like this:

public class ProductForm extends ProductInfo implements ActionForm {
    private ActionFormObj actionFormDelegate;

    public String getProductId() {
        return String.valueOf( productId );
    }

    public void setProductId(String val) {
        productId = Integer.parseInt( val );
    }
....
}
--productId is an int declared in ProductInfo.java
--ActionFormObj is a new struts object that implements ActionForm, it is the 
same implementation as the current 1.0 ActionForm.  All the ActionForm methods 
in the proposed interface ActionForm could simply be routed to the 
ActionFormObj.

This way, my ProductForm would only need to implement the data type conversion 
functionality, like above.  All the fields that are strings would have the 
get/set methods inherited from my SIO class.

This approach makes a lot of sense (IMO) if you are approaching a project from 
the perspective of database first, middle-tier second, and presentation third --
 which is different than web first, database second, where you could drive 
requirements differently.


You could still have a subclassable ActionForm: make ActionForm an interface, 
and make a BasicForm or BasicActionForm implement ActionForm which could then 
be subclassed like the current 1.0 ActionForm class.

Or, you could:
1. call the new interface ActionFormIF
2. provide the ability to not to have to subclass ActionForm, but rather 
implement ActionFormIF
3. make ActionForm implement ActionFormIF, make all the internals use 
ActionFormIF; ActionForm would still be subclassable
4. add a perform method to Action that uses ActionFormIF, keep the one that 
uses ActionForm
5. make an ActionFormDelegate for those developers who chose to implement 
ActionFormIF and subclass their own data classes, rather than subclass 
ActionForm

...and not break any existing code (meaning for people that use struts)

I'll write it if you want : )

Thanks,
Larry
larryw@vestek.com

BTW, struts is one of those truly useful tools --  thanks for writing it! : )

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>