FormBean

2022-11-30 18:52:56 浏览数 (1)

FormBean是一种JAVABean,除了具有JAVABean的常规方法,还包含一些特殊方法,用于验证表单数据,以及将其属性重新设置为默认值(reset方法)。 FormBean用来进行View组件和Controller组件之间表单数据的传递。View组件接收到用户输入的表单数据,保存在FormBean中,把它传递给Controller组件,Controller组件可以对FormBean中的数据进行修改。

FormBean到底是什么?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

我们在Struts FrameWork里我们在配置config的时候要配置一个FormBean,相信有些人会和我有同样的困惑,这个FormBean在整个FrameWork里扮演的是一个什么样的角色,它到底有什么样的作用。带着这些疑惑,我们来跟踪一下这个FormBean在FrameWork里到底干了些什么?怎么做的?

我们在web模块的web-inf目录下找到struts-config.xml这个XML配置文件,从下面这个目录里我们可以看到struts-config.xml配置文件可以分成很多个的,这样便于配置文件的管理,一个模块对应一个配置文件,非常清晰。我们打开其中的一个Config配置文件(如红色框的文件)

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

我们在配置文件里看到有<form-beans>标签这里定义的是这个模块所需要的FormBean如下图所示,这里type="butone.hr.rcyw.ldht.object.LDHTVO"是指FormBean的包路径,名称为name="LDHTVO",我们再在下面的<action-mappings>标签里可以看到一个action对应一个FormBean,由此可以知道Action与FormBean是一一对应且是唯一的。

我们再打开LDHTAction这个文件看看,我们在文件中根据传递的cmdFlag为“select”可以看到一下代码:

LDHTPageInfoVO aLDHTPageInfoVO = new LDHTPageInfoVO();

aLDHTPageInfoVO.queryCommCondition = SelectCondition.toString();

           Vector result = aLDHTService.selectLDHTList(aLDHTPageInfoVO);

           request.setAttribute("pageResult", result);

从这段代码里我们完全看不到LDHTVO这个VO,我们发现只有LDHTPageInfoVO,我们再看看这个VO里到底有些什么东西:

public class LDHTPageInfoVO extends PageInfoVO {

public LDHTPageInfoVO() {

       orderName = LDHTConstant.DEFAULT_ORDER_NAME;

       orderType = LDHTConstant.DEFAULT_ORDER_TYPE;

       rowsPerPage = LDHTConstant.ROWS_PER_PAGE;

       tableName = LDHTConstant.VIEW_NAME;

       listNames = LDHTConstant.SELECT_COLS;

    }

}

原来仅仅继承了一个分页的PageInfoVO,里面还有分页的信息。

我们继续跟踪这段话Vector result = aLDHTService.selectLDHTList(aLDHTPageInfoVO);

打开LDHTService这个类找到selectLDHTList这个方法

public Vector selectLDHTList(PageInfoVO apageInfoVO) throws Exception {

return aLDHTLocal.selectLDHTList(apageInfoVO);

    }

这个方法只有一句话,调用了一个SessionBean方法LDHTHandle,打开这个SessionBean我们可以找到这个方法如下:

public Vector selectLDHTList(PageInfoVO apageInfoVO) throws Exception {

       LDHTVO aLDHTVO = new LDHTVO();

       LDHTDBAccess aDBAccess = new LDHTDBAccess();

return aDBAccess.selectPage(apageInfoVO, aLDHTVO);

    }

哈哈,终于出现LDHTVO了,这个方法调用了一个LDHTDBAccess类里的selectPage方法并传入了两个参数其中一个是分页信息,另一个就是LDHTVO这个VO。

我们继续跟踪看看selectPage这个方法到底干了些什么? 打开LDHTDBAccess这个类找到selectPage这个方法:

public class LDHTDBAccess extends DBPageBean {

    /**   

    * Description: 删除一条记录

    * @param String id

    * @return void

    * @throw Exception

    */

public void deleteOne(String id) throws Exception {

       StringBuffer SQL = new StringBuffer();

       SQL.append("delete from ");

       SQL.append(LDHTConstant.TABLE_NAME);

       SQL.append(" where ");

       SQL.append(LDHTConstant.KEY_NAME);

       SQL.append("='");

       SQL.append(id);

       SQL.append("'");

       exectueSql(SQL.toString());

    }

    /**

     * @method isIllegal 判断该对象是否符合插入、修改编号原则-

     * @param bo

     * @return 合法则返回true ,不合法则返回false

     */

public boolean isIllegal(LDHTBO bo) {

return true;

    }

}//End.

我们发现这个类里除了这两个类之外,没有其他方法,但是它继承了DBPageBean这个父类,这个父类是框架里的,这难不倒我们,我们找到框架的这个foundationv2.jar 包反编译看看,

public Vector selectPage(PageInfoVO apageInfoVO, BaseVO aBaseVO)

        throws Exception

    {

        return readPage(apageInfoVO, aBaseVO);

    }

用了一个readPage这个方法,

public Vector readPage(PageInfoVO pageInfoVO, BaseBO aBaseBO)

    {

        ResultSet pageRs = null;

        Connection conn = null;

        PreparedStatement pstmt = null;

        try

        {

            Vector aVector = new Vector();

            int acurPage = pageInfoVO.curPage;

            Comm.log(1, "当前翻页Bean开始执行翻页操作:检索第" acurPage "页");

            try

            {

                calMaxRowCount(pageInfoVO);

                calMaxPage(pageInfoVO);

                pageInfoVO.querySql = createQuerySql(pageInfoVO);

                Comm.log(1, "查询翻页的SQL=" pageInfoVO.querySql);

                calMaxPage(pageInfoVO);

                if(acurPage > pageInfoVO.maxPage)

                    acurPage = pageInfoVO.maxPage;

                setCurPage(acurPage, pageInfoVO);

                conn = getConn();

                pstmt = getPstmt(conn, pageInfoVO.querySql);

                pageRs = pstmtQuery(pstmt);

                if(pageRs != null)

                {

                    Comm.log(1, "当前翻页Bean查出的最大行数:" pageInfoVO.maxRowCount);

                    Comm.log(1, "当前翻页Bean查出的最大页数:" pageInfoVO.maxPage);

                }

                calCurMaxRows(pageInfoVO);

            }

            catch(Exception ex)

            {

                pageRs = null;

                ex.printStackTrace();

            }

            BaseVO aBaseVOs[] = (BaseVO[])null;

            if(pageInfoVO.rowsPerPage != -1)

                aBaseVOs = new BaseVO[pageInfoVO.curMaxRow];

            else

                aBaseVOs = new BaseVO[pageInfoVO.maxRowCount];

            int i = 0;

            if(pageInfoVO.curPage > 1 && pageInfoVO.rowsPerPage != -1)

                pageRs.absolute(pageInfoVO.rowsPerPage * (pageInfoVO.curPage - 1));

            Comm.log(1, "当前翻页Bean的结果集滚动=" pageInfoVO.rowsPerPage * (pageInfoVO.curPage - 1));

            while(pageRs.next())

            {

                aVector.add(parseResultToSimpleBaseBO(pageRs, aBaseBO, pageInfoVO.listNames));

                i ;

            }

            if(pageInfoVO.maxRowCount == 0)

                pageInfoVO.curPage = 0;

            aVector.add(pageInfoVO);

            Comm.log(1, "翻页的Vector: length=" aVector.size());

            Vector vector = aVector;

            return vector;

        }

        catch(Exception ex)

        {

            ex.printStackTrace();

        }

        finally

        {

            freeConn(pageRs, pstmt, conn);

        }

        return null;

}

其实在这个方法里就是把查出来的多条数据每一条保存到一个LDHTVO里然后再保存到一个Vector里,返回。

至此我们可以在Action里看到返回的Vector其实就是一系列的LDHTVO。再到JSP页面我们可以看到

Vector LDHTVOs = (Vector)request.getAttribute("pageResult");

if (LDHTVOs != null) {

             for (int i =0 ; i< LDHTVOs.size()-1; i ) {

                 LDHTVO aLDHTVO = (LDHTVO)LDHTVOs.get(i);

       %>

<tr class="normal" clickType="1" onClick="parent.showSub(parent.currentID, '<%=aLDHTVO.getLDHTID()%>')" id="<%=aLDHTVO.getLDHTID()%>">

<!--td><input name="checkbox" type="checkbox" value="<%=aLDHTVO.getLDHTID()%>"></td-->

<td nowrap  id="<%=aLDHTVO.getRYXXID()%>" class="ryxxwindow" ><%=aLDHTVO.getRYBH()  %></td>

<td nowrap><%=aLDHTVO.getXM()    %></td>

<td nowrap><%=aLDHTVO.getXB()    %></td>

<td nowrap><%=aLDHTVO.getNL()    %></td>

<td nowrap><%=aLDHTVO.getGL()    %></td>

<td nowrap><%=aLDHTVO.getJGMC()  %></td>

<td nowrap><%=aLDHTVO.getBMMC()  %></td>

<td nowrap><%=aLDHTVO.getYGLB()  %></td>

<td nowrap><%=aLDHTVO.getZT()    %></td>

<td nowrap><%=aLDHTVO.getHTDQRQ()%></td>

<td nowrap><%=aLDHTVO.getHTZZRQ()%></td>

</tr>

<%}}%>

这样的代码其实就是把Vector里的VO拿出来,再把VO里的数据取出来。

其实到此为止,我们还没有看出这个FormBean到底有什么过人之处,下面我们来看看Edit操作,也就是在页面上修改一条数据,然后保存到数据库里去,

我们首先打开JSP页面看到以下代码

<input name="cmdFlag" type="hidden" value="Save">

我们发现input表单的Name与VO里的名字一样,然后我们再到Action里看看

} else if (cmdFlag.equals("Save")) {

           LDHTVO aVO = (LDHTVO) form;

           LDHTBO aBO = (LDHTBO) convertVOtoBO(aVO, aUserBean);

try {

              aLDHTService.saveLDHT(aBO);

              aVO.DIRTYFLAG = aBO.DIRTYFLAG;

           } catch (Exception e) {

              e.printStackTrace();

if (aBO.isNew()) {

                  aVO.setLDHTID("");

              }

              request.setAttribute("alertMsg", "保存记录出错,错误原因:" BTDBHelper.getMessage(e));

           }

           request.setAttribute("Detail_LDHTVO", aVO);

return (mapping.findForward("LDHTEdit"));

       }

我们可以看到form其实就是VO即FormBean,这样我们提交表单方便很多,省去了好多代码。

至此FormBean全部解析完毕。

0 人点赞