With SpringMVC you can create generic based controllers ...

you will need, though, to extend your persistent objects from a common base
class holding the id and a 'isNew' convenience method

this can reduce to almost zero the amount of java code to create
master/detail pages (which use to be a large part of most applications ;-)

Now if springmvc had something like webwork template based tags it could be
the killing web framework :D

Hope it helps

Regards
Ivan


---------------- PersistentObject.java --------------------------------
@MappedSuperclass
public abstract class PersistentObject extends BaseObject {

        protected Long id;
        protected Integer version;

        @Id  @GeneratedValue(strategy=GenerationType.AUTO)
        public Long getId() {
            return id;
        }

        @Version
        public Integer getVersion() {
            return version;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public void setVersion(Integer version) {
            this.version = version;
        }

        @Transient
        public boolean isNew() {
                return getId() == null;
        }
        
}
----------------------------------------------------------------------


-------------- GenericFormController.java ----------------------

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.appfuse.service.GenericManager;
import org.appfuse.tutorial.model.PersistentObject;
import org.appfuse.webapp.controller.BaseFormController;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;

/**
 * GenericFormController
 *
 * <p>
 *  GenericFormController.java.html View Source 
 * </p>
 *
 * @author Ivan Garcia Sainz-Aja
 *
 */
public class GenericFormController<T extends PersistentObject> extends
BaseFormController {

    private GenericManager<T,Long> manager = null;

    /**
     * Setter for the field manager
     * @param manager The manager to set.
     */
    public void setManager(GenericManager<T,Long> manager) {
        this.manager = manager;
    }

    /**
     * Persists given perstistentObject using configured GenericManager.
     * @param persistentObject
     * @throws Exception
     */
    protected void doSave(PersistentObject persistentObject) throws
Exception {
        manager.save((T)persistentObject); 
    }
    
    /**
     * Removes the given persistentObject using configured GenericManager.
     * @param persistentObject
     * @throws Exception
     */
    protected void doDelete(PersistentObject persistentObject) throws
Exception {
        manager.remove(persistentObject.getId());
    }

    /**
     * @see
org.springframework.web.servlet.mvc.SimpleFormController#onSubmit(javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse, java.lang.Object,
org.springframework.validation.BindException)
     */
    @Override
    protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors) throws
Exception {
        log.debug("entering 'onSubmit' method..."); 

        PersistentObject persistentObject = (PersistentObject) command;
        boolean isNew = persistentObject.isNew();
        String success = getSuccessView(); 
        Locale locale = request.getLocale(); 

        if (request.getParameter("delete") != null) { 
            doDelete(persistentObject);
            success = getViewAfterDelete();
            saveMessage(request, getText(getCommandName() + ".deleted", 
locale)); 
        } 
        else{ 
            doSave(persistentObject);
            success = (isNew? getViewAfterInsert(): getViewAfterUpdate());
            String key = getCommandName() + ( (isNew) ? ".added" : ".updated"); 
            saveMessage(request, getText(key, locale)); 
        } 

        return new ModelAndView(success, "id" , persistentObject.getId()); 
    }

    /**
     * @see
org.springframework.web.servlet.mvc.AbstractFormController#formBackingObject(javax.servlet.http.HttpServletRequest)
     */
    @Override
    protected Object formBackingObject(HttpServletRequest request) throws
Exception {
        String id = request.getParameter("id");
        if (!StringUtils.isEmpty(id) && StringUtils.isNumeric(id)) { 
            return manager.get(new Long(id)); 
        } 

        return createCommand(); 
    }

    //Configurable success views ...
    private String viewAfterInsert;
    private String viewAfterUpdate;
    private String viewAfterDelete;

    /**
     * Returns the name of the view that should be shown on successful
delete.
     * Defaults to successView in case it is null.
     * @return the viewAfterDelete
     */
    public String getViewAfterDelete() {
        return (viewAfterDelete != null ? viewAfterDelete :
getSuccessView()) ;
    }

    /**
     * Returns the name of the view that should be shown on successful
insert.
     * Defaults to successView in case it is null.
     * @return the viewAfterInsert
     */
    public String getViewAfterInsert() {
        return (viewAfterInsert != null ? viewAfterInsert :
getSuccessView()) ;
    }

    /**
     * Returns the name of the view that should be shown on successful
update.
     * Defaults to successView in case it is null.
     * @return the viewAfterUpdate
     */
    public String getViewAfterUpdate() {
        return (viewAfterUpdate != null ? viewAfterUpdate :
getSuccessView()) ;
    }

    /**
     * @param viewAfterDelete the viewAfterDelete to set
     */
    public void setViewAfterDelete(String viewAfterDelete) {
        this.viewAfterDelete = viewAfterDelete;
    }

    /**
     * @param viewAfterInsert the viewAfterInsert to set
     */
    public void setViewAfterInsert(String viewAfterInsert) {
        this.viewAfterInsert = viewAfterInsert;
    }

    /**
     * @param viewAfterUpdate the viewAfterUpdate to set
     */
    public void setViewAfterUpdate(String viewAfterUpdate) {
        this.viewAfterUpdate = viewAfterUpdate;
    }
    
    
}
--------------------------------------------------------------------------


--------------- dispatcher-servlet.xml -------------------------------

    <bean id="personFormController"
class="org.appfuse.tutorial.webapp.controller.GenericFormController">
        <property name="commandName" value="person"/>
        <property name="commandClass" value="org.appfuse.tutorial.model.Person"
/>
        <property name="validator" ref="beanValidator"/>
        <property name="formView" value="personForm"/>
        <property name="successView" value="redirect:persons.html"/>
        <property name="cancelView" value="redirect:mainMenu.html"/>
        <property name="manager" ref="personManager"/>
    </bean>

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


obviously in real life you may need to override some methods (referenceData,
onBind ...) but you already have the bulk of the job done ;-)

-- 
View this message in context: 
http://www.nabble.com/SpringMVC-can-do-Generic-Controllers-tf3385990s2369.html#a9425059
Sent from the AppFuse - User mailing list archive at Nabble.com.

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

Reply via email to