Subject: Re: Model Persistence Survey From: Vic Cekvenich <[EMAIL PROTECTED]> === Easy enough to do delegates.
Keith Chew wrote: > Hi > > Just some thoughts. You could use the delegate pattern instead of > inheritence. This will help decouple your FormBeans from your DaoBeans. > > Keith > > > > -----Original Message----- > From: Struts Newsgroup [mailto:@[EMAIL PROTECTED]] > Sent: Thursday, 24 January 2002 9:10 a.m. > To: [EMAIL PROTECTED] > Subject: Re: Model Persistence Survey > > > Subject: Re: Model Persistence Survey > From: Vic Cekvenich <[EMAIL PROTECTED]> > === > > > Here is a sample DAO Extended Form Bean code : > > public class NameZoomFrm extends daoFormBean { > > private String fstName; > private String lstName; > > > public String getFstName() { //get it from _crs RowSet > CachedRowSet cr = getCrs(); > try{ this.fstName = cr.getString("first_name"); } // try > catch (Exception e) {System.out.println(e);} // catch > return (this.fstName); }// get > public String getLstName() { //get it from _crs RowSet > CachedRowSet cr = getCrs(); > try{ this.lstName = cr.getString("last_name"); } // try > catch (Exception e) {System.out.println(e);} // catch > return (this.lstName); > }// get > public void setFstName(String aFstName) { //get it from _crs RowSet > CachedRowSet cr = getCrs(); > try{ cr.updateString("first_name",aFstName); > this.fstName = aFstName; > } // try > catch (Exception e) {System.out.println(e);} // catch > setCrs(cr); > } //setFst > public void setLstName(String aLstName) { //get it from _crs RowSet > CachedRowSet cr = getCrs(); > try{ cr.updateString("last_name",aLstName); > this.lstName=aLstName; > } // try > catch (Exception e) {System.out.println(e);} // catch > setCrs(cr); > } //setFst > > > public int retrieve(BigDecimal aBD) { > try{ > CachedRowSet cr = getCrs(); > cr = new CachedRowSet(); // easier then resultset > // you must test this sql string manualy for a SQL IDE > cr.setCommand("select * from contact where id = ?"); > // driver issues fix: > cr.setTableName("contact"); > // to limit the number of rows coming back, we only need a page at > a time > cr.setBigDecimal(1,aBD); > exec(cr); > } // try > catch (Exception e) > { System.out.println(e); > e.printStackTrace();} // catch > return 0; > }// retrieve > > public void blank() > { try { CachedRowSet cr = getCrs(); > cr.updateNull("first_name"); > cr.updateNull("last_name"); > cr.updateNull("id"); > } catch (Exception e) { procE(this,e);} // catch > }// blank > }//class > > > Here is the DAO implementation ... using RowSet, but could use JDO, such > as Castor. > > import com.wintecinc.struts.action.ValidatorForm; > public class daoFormBean extends ValidatorForm { > > > private Connection con=null; > private Connection upCon=null; > private DataSource ds; > private CachedRowSet _crs; > private String sqlString; > private BigDecimal PK; > > > public Connection getCon() {return con;} > public CachedRowSet getCrs() {return this._crs;} > public void setCrs(CachedRowSet aCRS) {this._crs=aCRS;} > > > > public Hashtable getIterateMap() { //is there a better way? > like use crs.getCollection? > CachedRowSet cr = getCrs(); > int rc=cr.size(); > Hashtable iterateMap = new Hashtable(); > // count out the number of rows with dummy map > for (int i=1; i <= rc; i++) { iterateMap.put(new > Integer(i),new Integer(i));} > return iterateMap;} > > > public BigDecimal getPK() { //get it from _crs RowSet > try{ this.PK = _crs.getBigDecimal("id"); } // try > catch (Exception e) {System.out.println(e);} // catch > return (this.PK); > }// get > > public void dbCon() { // connect to db > try{ ds = PoolMan.findDataSource("jndiSample"); > //we should in production give it a password in code > not in file pool.xml > con=ds.getConnection();} > catch (Exception e) { > debug(this, "We did not connect"); > procE(this,e);} // catch > }// con > > public void dbDisCon() { > try{if (con!=null) con.close(); > ds=null; > } > catch (Exception e) {System.out.println(e); }//catch > } //disCon > > public int getRowNext() { // get the next row > try{ > CachedRowSet cr = getCrs(); > cr.next(); > } > catch (Exception e) { debug(this,"what row"); > System.out.println(e); e.printStackTrace();} // catch > return 0; } // rowNext() > > public long update(){ > try{ > // update should be using a different con pool > to same db > dbCon(); > _crs.updateRow(); > _crs.acceptChanges(getCon()); > dbDisCon(); > } catch (Exception e) { procE(this,e);} // catch > return 0; } // update() should return new PK > > public void setDelete() { // mark this row deleted > CachedRowSet cr = getCrs(); > try{ > cr.updateString("DEL_FLG","X"); > // send to DB > update(); > } // try > catch (Exception e) {System.out.println(e);} > // catch > } //del > > public void newRow() > { try { > debug(this," Insert begin"); > dbCon(); > BigDecimal tmp = new BigDecimal(1); > retreive(tmp); // descemdat SQL Row signature > CachedRowSet cr = getCrs(); > cr.moveToInsertRow(); > blank(); > debug(this," before InsertRow"); > cr.insertRow(); > cr.moveToCurrentRow(); > cr.next(); > debug(this," we HAVE set up an insert"); > } catch (Exception e) { > debug(this, "oh no new row, check driver"); > e.printStackTrace(); > procE(this,e);} // catch > } // newRow() > > public void blank() { } // stub > > public int retrieve(BigDecimal aBD) { System.out.println("should > never be called"); return 0;} // stub > // implement in descendent > > public void setSqlString(String aSQL) > { sqlString = aSQL;} > > public daoFormBean() { // cons > super(); > try{ > _crs = new CachedRowSet(); > } // try > catch (Exception e) { > System.out.println(e); > e.printStackTrace();} > } //cons > > public int exec(CachedRowSet pCR) { > int c=0; > try{ > pCR.execute(getCon()); > pCR.first(); > c= pCR.size(); > //debug(this,c+" rc "+pCR.getCommand()); > setCrs(pCR); > }// try > catch (Exception e) {procE(this,e); > } // catch > return c; > } // exec > > > }//class > > And to call above in perform: > > public ActionForward perform( ActionMapping mapping, ActionForm form, > HttpServletRequest request, > HttpServletResponse response) > throws IOException, ServletException > { > > NameZoomFrm frm = (NameZoomFrm) form; > if (frm == null) {frm = new NameZoomFrm();} > String PK = request.getParameter("PK"); > String parameter = mapping.getParameter(); > > if (parameter == null) parameter ="X"; > > if (parameter.equals("del")) > { BigDecimal pkBD = new BigDecimal (PK); > frm.setDelete(); > return(mapping.findForward("searchNam")); > } else > if (PK != null) { // do we have an argument PK passed? Display! > BigDecimal pkBD = new BigDecimal (PK); > frm.dbCon(); > frm.retrieve(pkBD); > frm.dbDisCon(); > } else > if (parameter.equals("new")) > { > frm.newRow(); > > } > else { // Save > ActionErrors errors = frm.validate(mapping,request); > if (!errors.empty()) { > saveErrors(request, errors); > return (new ActionForward(mapping.getInput()));} > frm.update(); // save the cached row to DB > return(mapping.findForward("searchNam")); > } // else > > return(mapping.findForward("nameZoomPg")); > // go to search pg. > }// perform Act > } // class > > > > Ted Husted wrote: > > >>If anyone has any brief code examples or other notes to share regarding >>how they handle the interface between ActionForm beans and their model >>beans, I'd be happy to compile something for the Users Guide. >> >>-- Ted Husted, Husted dot Com, Fairport NY USA. >>-- Java Web Development with Struts. >>-- Tel +1 585 737-3463. >>-- Web http://www.husted.com/struts/ >> >>-- >>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]>

