<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

    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

    posted on 2006-12-25 12:27 蘆葦 閱讀(490) 評論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 免费观看美女裸体网站| 亚洲最大中文字幕无码网站 | 亚洲精品和日本精品| 亚洲成人免费电影| 成在线人视频免费视频| 亚洲精品无码av中文字幕| 亚洲黄网站wwwwww| 亚洲春色在线视频| 久久精品夜色噜噜亚洲A∨| 国产精品另类激情久久久免费| 97人妻无码一区二区精品免费| 免费污视频在线观看| 国产精品小视频免费无限app| 色综合久久精品亚洲国产| 亚洲五月丁香综合视频| 亚洲熟妇色自偷自拍另类| 精品亚洲成a人在线观看| 亚洲国产成人精品青青草原| 午夜亚洲国产理论秋霞| 国产成人无码综合亚洲日韩| 中文亚洲AV片在线观看不卡| 亚洲午夜福利精品无码| 亚洲国产午夜福利在线播放| 亚洲AV无码乱码在线观看牲色| 国产成人综合久久精品免费| 日韩在线免费播放| 日本免费网站观看| 国产免费一区二区三区VR| 国产精品公开免费视频| 国产伦精品一区二区三区免费下载| 成人免费看黄20分钟| 狠狠久久永久免费观看| 免费鲁丝片一级观看| 在线永久免费观看黄网站| 日本高清免费aaaaa大片视频| 午夜免费福利网站| 免费人成在线观看视频播放| 国产18禁黄网站免费观看| 亚洲AV无码专区日韩| 亚洲一区日韩高清中文字幕亚洲| 亚洲精品网站在线观看不卡无广告|