分享
 
 
 

FormBean到底是什么?

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

FormBean到底是什么?

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

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

我们在配置文件里看到有<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全部解析完毕。

作者:Anders xiao

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有