王朝网络
分享
 
 
 

web开发:通用持久类代替hibernate的持久类、通用动态formBean类代替struts的formBean类

王朝other·作者佚名  2006-07-11
宽屏版  字体: |||超大  

DAO类+通用持久类+通用动态formBean类,实现数据增、删、改、查

newxy(新坐标)技术运用之三

“DAO类”: net.newxy.dbm.BaseDAO或其子类;

“通用持久类”: net.newxy.dbm.DynaDto;

“通用动态formBean类”: net.newxy.struts_faces.DynaFormBean。

《DAO类+通用持久类,实现数据增、删、改、查》(又名《不同于hibernate,利用通用持久类实现数据增、删、改、查,可极大提高开发效率》)文章中介绍的数据增、删、改、查方法比hibernate的方法已简单很多,如果引入通用动态formBean类,开发效率会有更大提高。

net.newxy.struts_faces.DynaFormBean类的类图

一、利用通用动态formBean类,实现数据增、删、改

struts的ActionServlet将用户submit来的数据绑定到net.newxy.struts_faces.DynaFormBean对象中,在后台,通过调用net.newxy.struts_faces.DynaFormBean的public Object getDto()、public Object get(String name) 方法将上传的数据提出,net.newxy.struts_faces.DynaFormBean起作传送数据的作用。

(1)数据插入:Object update(Object dto) throws Exception;

举例:

public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

......

net.newxy.struts_faces.DynaFormBean form=( net.newxy.struts_faces.DynaFormBean)actionForm;

try{

net.newxy.dbm.DynaDto dynaDto=( net.newxy.dbm.DynaDto)form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");//设置表名

Object result=dao.update(dynaDto);

}catch(Exception e){

......

}

......

}

jsp页面不上传主关键字段值,主关键字段值会自动得到,是原有最大值加一。

如果jsp页面上传了主关键字段值,如:表单中有<html:text property=”id” />用户键入了id值。newxy(新坐标)会检查赋给的主关键字值是否已存在,如果存在,作更新(update)操作,如果不存在,作插入(insert)操作。

判断是更新还是插入操作,可以根据返回的result值来判断,如果result值为空,是作更新操作,如果result不空是作插入操作。

Object result=dao.update(dynaDto);

如果想需要知道自动赋给的主关键字段值,可以用如下方法:

Object result=dao.update(dynaDto);

Object idValue=null;

If(result!=null)

idValue=((DynaDto)result).get(“id”);

idValue就是自动赋给的主关键字段值。

(2)数据更新:

举例:

public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

......

DynaFormBean form=(DynaFormBean)actionForm;

try{

DynaDto dynaDto=(DynaDto)form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");

Object result=dao.update(dynaDto);

}catch(Exception e){

......

}

......

}

数据更新方法与数据插入方法相同,需注意:如果dynaDto中没有主关键字段值,即dynaDto.get(“id”)==null,或dynaDto.get(“id”)所得主关键字段值在表中不存在,dao.update(dynaDto)方法仍然作插入操作。

在进行dao.update(dynaDto)前,可以判断数据是否已存在于表中:

Object masterKey=dynaDto.get(“id”);

Object record=null;

if(masterKey!=null)

record=dao.load(dynaDto);

如果masterKey==null 或 record==null,表中不存在该条记录,dao.update(dynaDto)作插入操作,否则该条记录存在于表中,作更新操作。

那么在jsp页面上如何保证用户录入的是新插入数据或是编辑修改的数据呢?参看本文后面部分在jsp页面上新建、编辑数据

(3)数据删除

举例:

public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

......

DynaFormBean form=(DynaFormBean)actionForm;

try{

//删除formBean当前数据对应的记录:

Object record=form.getDto();

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

dynaDto.set_table("table1");//设置表名,如果上传数据的jsp页面表单中没有<html:hidden name=”_table” value=”table1”/>

dao.remove(dynaDto);

//httpServletRequest.getParameter(“_index”)值代表记录号,删除该条记录

String index= httpServletRequest.getParameter(“_index”);

Object record=form.getDto(index);

dao.remove(record);

}catch(Exception e){

......

}

......

}

二、利用通用动态formBean类,实现多项查询

1、后台代码

public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

DynaFormBean form=(DynaFormBean)actionForm;

net.newxy.util.FormBeanUtils.createForm(form,httpServletRequest);

......

}

net.newxy.util.FormBeanUtils.createForm(form,httpServletRequest)方法将查询结果放在form的_coll属性中。后台代码极其简单,

那么httpServletRequest中包含了什么数据?下面是jsp页面表单对上传数据的组织。

2、前台查询条件的组织

<html:form action="/myAction.do?method=find">

<html:hidden property="_dao" value="dao.myDAO1"/>

<html:hidden property="_sql" value="select a.industry,b.* from industry as a,enterprise as b where{a.code=b.industry_code}"/>

<table border="1">

<tr>

<td>逻辑</td>

<td colspan="2">

<html:radio property="_lg" value="1">并且</html:radio>

<html:radio property="_lg" value="0">或者</html:radio>

</td>

</tr>

<tr>

<td>行业</td>

<td>等于</td>

<td>

<nhtml:hidden property="_item1" value="a.code"/>

<html:hidden property="_item1" value="="/>

<html:select property="_item1">

<html:option value=""></html:option>

<html:option value="A">农、林、牧、渔业</html:option>

<html:option value="B">采矿业</html:option>

<html:option value="C">制造业</html:option>

</html:select>

</td>

</tr>

<tr>

<td>企业名称</td>

<html:hidden property="_item2" value="b.name"/>

<td>

<html:select property="_item2">

<html:option value=""></html:option>

<html:option value="=">等于</html:option>

<html:option value="like">包含</html:option>

</html:select>

</td>

<td>

<html:text property="_item2" size="40">

</html:text>

</td>

</tr>

<tr>

<td>企业地址</td>

<html:hidden property="_item3" value="b.address"/>

<td>

<html:select property="_item3">

<html:option value=""></html:option>

<html:option value="=">等于</html:option>

<html:option value="like">包含</html:option>

</html:select>

</td>

<td>

<html:text property="_item3" size="40">

</html:text>

</td>

</tr>

<tr>

<td align="right" colspan="3"><html:submit value=" 查 询 "/></td>

</tr>

</table>

</html:form>

该例是对企业表、行业表的连表查询,查询的基本条件是industry.code=enterprise.industry_code。

industry:行业代码表

industry.code:行业代码

enterprise:企业表

enterprise.industry_code:企业的行业代码

下面是表单中包含的几个属性:

(1)_dao,是DynaFormBean的保留属性,是DAO类的别名,告诉后台由哪个DAO类来操作数据。别名在WEB-INF/classes下的newxy.properties文件中指定,假设有一DAO类如下:

package common;

public class MyDAO1 extends net.newxy.dbm.BaseDAO{

......

}

在newxy.properties文件中定义DAO类别名如下:

dao.mydao1=common.MyDAO1

如果DAO类common.MyDAO1的别名是dao.default,则表单无需上传属性_dao。

(2)_sql,是DynaFormBean的保留属性,是查询的基本条件,其中where跟随其后的是大括号{},是最终组成查询条件存放的地方。用户选择的查询条件不管是”and”连接的还是”or”连接的,最终与_sql属性中的初始条件都以”and”关系连接。最后产生的sql语句可能是这样的:

select a.industry,b.* from industry as a,enterprise as b where((a.code=b.industry_code) and (name=’....公司’ or ......))

其中红色是初始条件,蓝色是用户选择的条件,二者以”and”相连。

(3)_lg,是DynaFormBean的保留属性,是“逻辑”的意思,如果_lg==”1”,上传的查询条件以”and”关系组织,否则以”or”关系统组织。

(4)_item开头的属性,这种属性都以一个数字跟随其后,这样的属性一上传就有三个。如果在“企业名称”的<select name=”_item2”>...</select>项选择“等于”,在<input type=”text” name=”_item2”/>项填入“......公司”,上传数据后可得到如下字符串数组:

String[] itemValues=request.getParameterValues(“_item2”);

itemValues是三个字符串构成的数组,三个字符串分别是 “a.name” “=” “......公司”,拼这一起可构成”a.name=’......公司’”,它构成查询条件的一部分。之所以这么解说,是增加对查询条件构成的理解。可参看newxy(新坐标)网站范例的“多项查询”。

三、利用通用动态formBean类,向前台展现查询结果

newxy(新坐标)查询的记录集保存在DynaFormBean类的_coll属性中,DynaFormBean另有一个属性_navigate,负责对记录集的分页计算。jsp页面可以用<nlogic:navigate/>标签为formBean的记录集分页导航。

举例:

如果struts的myAction的name=”enterprises”,查询后,formBean以”enterprises”为名保存的会话或其它scope中。

<div><nlogic:navigate formName="enterprise" length="20"/></div><!--导般标签-->

<logic:notEmpty name="enterprises" property="_coll">

<table>

<logic:iterate id="rec" name="enterprises" property="_coll">

<tr>

<td><bean:write name="rec" property="industry"/></td> <!--行业-->

<td><bean:write name="rec" property="name"/></td> <!--企业名称-->

</tr>

</logic:iterate>

</table>

</logic:notEmpty>

属性_coll是通用动态formBean类DynaFormBean的保留属性,保存了查询的记录,类型是List,其元素是org.apache.commons.beanutils.BasicDynaBean类型。

四、通用动态formBean类DynaFormBean及其父类的重要方法

net.newxy.struts_faces.DynaFormBean类继承自net.newxy.struts_faces.FormBean,下面是net.newxy.struts.faces.DynaFormBean及其父类net.newxy.struts.faces.FormBean的几个重要方法

1、public void append(java.lang.Object dto)

在结果集_coll的最后追加一条记录。同时将索引号指向最后一条。并用最后一条记录数据填写formBean。

2、public java.lang.String setCollection(java.lang.Object objs)

设置结果集,与set_coll(Collection _coll)相比,该方法除了作set_coll(Collection _coll)操作外,还对与分页浏览的相关属性值进行计算,将计算结果重新填入formBean的_navigate属性中,并重新设置索引号。

3、public void setDto(java.lang.String no)

将formBean中的数据填写到以no参数值为索引号的记录中。

4、public void setForm(java.lang.String no)

以no参数值为索引号,查找该条记录,如果存在,将该条记录数据填入的formBean中,并以no值为索引号。

5、public void setForm(java.lang.Object dto)

dto为包含数据的javaBean。将该Bean的值填入formBean中。这个javaBean类继承自net.newxy.dbm.Dto,但在目前版本只介绍formBean类net.newxy.struts.faces.FormBean及持久类net.newxy.dbm.Dto,参数dto暂理解成通用持久类net.newxy.dbm.DynaDto。

6、public java.lang.Object getDto()

从formBean得到持久类实例。

7、public java.lang.Object getDto(java.lang.String no)

以no为序号,返回这条记录。如果不存在,返回空。

8、public void remove(java.lang.String no)

从结果集中删除以no参数值为序号的记录。

9、public java.lang.Object cloneDto(java.lang.String no)

以no参数值为索引号,得到这条记录的克隆

10、public void empty()

将formBean数据清空,但保留属性不会被清除,包括保存了记录集的属性_coll。

11、public java.util.Map getValues()

获取保存了属性值对的HashMap,页面表单submit上传的属性保存在这个Map中。

12、public java.lang.Object get(java.lang.String name)

获取以name值为属性名的属性值

13、public void set(java.lang.String name, java.lang.Object value)

设置属性值。如果name是保留属性,将不进行set操作。

14、public void setValue(java.lang.String name,java.lang.Object value)

保留属性的set方法,通过此方法给以改变保留属性的值。

15、public void set_dao(java.lang.String _dao)

设置DAO类别名,_dao是保留属性,也可用方法setValue(“_dao”,_dao)。

16、public void set_index(java.lang.String _index)

设置记录集的索引号,_index是保留属性,也可用方法setValue(“_index”,_index)。

五、在jsp页面上新建、编辑数据

1、后台查询数据

public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

DynaFormBean form=(DynaFormBean)actionForm;

net.newxy.util.FormBeanUtils.createForm(form,httpServletRequest);

......

}

2、编辑更新记录

FormBeanUtils.createForm(form,httpServletRequest)将查询的记录集保存在DynaFormBean的_coll属性中并且以第一条记录填写到formBean的属性中。

在jsp页面上有下列表单及其属性:

<html:form action="/myAction.do?method=update">

<html:hidden property="_table" value="enterprise"/>

<html:hidden property="industry_code" value="A"/>

注册号:<html:text property="register_id"></html:text><br/>

负责人:<html:text property="principal"></html:text><br/>

企业名称:<br />

<html:text property="name" size="36"></html:text><br />

企业地址:<br />

<html:text property="address" size="36"></html:text><br />

经营范围:<br/>

<textarea name="dealIn" cols="36" rows="10">

<bean:write name="enterprise" property="dealIn"/>

</textarea><br/>

<html:submit value=”提交”/>

</html:form>

页面上显示的是每一条记录,用户编辑修改数据提交到后台,绑定到formBean中,覆盖原有数据。因为表单中没有主关键字段属性enterprise_id,数据提交后就不会改变原有的enterprise_id值,net.newxy.util.FormBeanUtils.createForm(form,httpServletRequest)方法调用DAO类的update(Object dto)方法就会作更新操作。

(1)在页面上为formBean选择第10条记录

在jsp页面<html:form></html:form>标签前加入java脚本<%......%>

<%

net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);//在session中得到formBean;

form.setForm(“9”);

%>

(2)在后台为formBean选择第10条记录

public ActionForward selectRecord(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

......

DynaFormBean form=(DynaFormBean)actionForm;

form.set(“10”);

......

}

jsp页面显示的便是第10条记录。用户可以对其编辑上传保存到数据库。

3、新建插入记录

本篇介绍的数据插入:Object update(Object dto) throws Exception方法表明,如果dto不包含主关键字段属性,update(dto)作插入操作。如果在表单提交数据前调用net.newxy.faces.DynaFormBean类的empty()方法会清空formBean中的数据,但不清除保留属性,包括保存了记录集的属性_coll。这样用户得到的页面表单是空白的。而且提交数据后因为已清除了主关键字段属性,Object update(Object dto) throws Exception方法会作数据插入操作。

(1)在jsp页面上清空formBean

在jsp页面<html:form></html:form>标签前加入java脚本<%......%>

<%

net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);//在session中得到formBean;

form.empty();

%>

(2)在后台页面上清空formBean

public ActionForward selectRecord(ActionMapping actionMapping, ActionForm actionForm,

HttpServletRequest httpServletRequest,

HttpServletResponse httpServletResponse) throws Exception{

......

DynaFormBean form=(DynaFormBean)actionForm;

form.empty();

......

}

jsp页面显示的是空白表单,用户输入数据提交后会作插入操作。

newxy(新坐标)技术网站:http://www.newxy.net

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝网络 版权所有