欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
運用類(lèi)反射機制簡(jiǎn)化Struts應用程序的開(kāi)發(fā)

Struts中引入ActionForm類(lèi)的意義與缺陷:

在Struts應用程序中,ActionForm是一個(gè)很重要的概念,它的主要功能就是為Action的操作提供與客戶(hù)表單相映射的數據(如果在客戶(hù)指定的情況下,還包括對數據進(jìn)行校驗)。Action根據業(yè)務(wù)邏輯的需要,對數據狀態(tài)進(jìn)行修改,在改變系統狀態(tài)后,ActionForm則自動(dòng)的回寫(xiě)新的數據狀態(tài)并保持。程序員對JSP與ActionForm Bean的對應關(guān)系,通常感到很迷惑,JSP與ActionForm到底是1:1,還是N:1,對此,Struts本身對此并沒(méi)有提出自己的觀(guān)點(diǎn)。無(wú)論是一對一,還是多對一,Struts本身并不關(guān)心,它都能很好得工作。Struts在它的開(kāi)發(fā)文檔中指出,對于較小規模的開(kāi)發(fā),開(kāi)發(fā)人員可以根據自己的需要,每個(gè)模塊只寫(xiě)一個(gè)ActionForm Bean,甚至整個(gè)應用程序只寫(xiě)一個(gè)ActionForm Bean.當然,Struts也不反對每個(gè)ActionForm Bean只對應一個(gè)JSP,他們之間的對應關(guān)系,由開(kāi)發(fā)人員自己決定。

在我看來(lái),正如Entity EJB對J2EE的重大貢獻一樣,Entity EJB使得程序員對二維關(guān)系數據庫的存取對象化了,程序員可以使用Set 或者Get等面向對象的方法來(lái)操縱關(guān)系數據庫的數據,而ActionForm也使得程序員對網(wǎng)頁(yè)的數據存取奇跡般的對象化了,程序員同樣也可以使用Set 或者Get等面向對象的方法存取網(wǎng)頁(yè)上的數據,這是一個(gè)開(kāi)發(fā)模式方式上的重大轉變?;诖?,我個(gè)人認為ActionForm與JSP即VIEW層的關(guān)系最好是一對一的關(guān)系,這樣,在理解上會(huì )更清晰一些。但是,這樣也會(huì )帶來(lái)一個(gè)很現實(shí)的問(wèn)題,在一個(gè)應用程序中,也許有非常多得JSP頁(yè)面,如果每個(gè)ActionForm 都只對應一個(gè)JSP頁(yè)面,那么系統的Java代碼就會(huì )急劇膨脹起來(lái),而且,每個(gè)ActionForm都是只有很簡(jiǎn)單的Set或者Get方法存取數據,那么,如何簡(jiǎn)化Struts應用程序的開(kāi)發(fā)呢?

在Struts1.1 中,Struts引入了DynaActionForm和Dyna Bean,試圖解決這個(gè)問(wèn)題,在我看來(lái),DynaActionForm的引入,破壞了對網(wǎng)頁(yè)存取對象化的概念,使開(kāi)發(fā)人員重新回到了使用HashTable、Map、Collection、ArrayList等集合對象來(lái)實(shí)現對數據進(jìn)行存取的老路上來(lái)。雖然應用程序的靈活性大大增加了,但是代碼的可讀性也大大降低了,開(kāi)發(fā)人員之間的交流難度也增加了。

在傳統的應用程序對ActionForm Bean的訪(fǎng)問(wèn)中,我們通常都寫(xiě)成如下的形式:

            Connection conn=DriverManager.getConnection("JDBC URL ");            sql=" select *  from some tables ";            PreparedStatement stmt = conn.prepareStatement(sql);            ResultSet rs = stmt.executeQuery();            ArrayList array=new ArrayList();            while (rs.next()) {            AActionForm actionForm =new AActionForm ();            actionForm.setId(rs.getString("Id"));            actionForm.setName(rs.getString("Name"));            array.add(actionForm);            }            

在A(yíng)ction 的Execute方法中,我們 把這個(gè)集合用request.setAttribute("array", array)存儲起來(lái),然后在JSP頁(yè)面中,我們用iterate Tag把數據循環(huán)現實(shí)出來(lái)。代碼通常都是這個(gè)樣子:

            <logic:present name=" array " scope="request">            <logic:iterate name=" array " id=" array "            type="com.bhsky.webis.Goods">            <tr align="center">            <td class="table2">            <bean:write name=" array " property="goodsid"/>            </td>            <td class="table2">            <bean:write name=" array " property="goodsname"/>            </td>            </tr>            </logic:iterate>            </logic:present>            

在Struts中,對數據的訪(fǎng)問(wèn)和顯示的寫(xiě)法通常都是很固定的,在VIEW層,我們是沒(méi)有辦法簡(jiǎn)化自己的代碼的,在A(yíng)ction層,其寫(xiě)法通常也很固定,只是做一個(gè)頁(yè)面的跳轉,商業(yè)邏輯和對數據得訪(fǎng)問(wèn),通常都是放在JavaBean中。那么,在此,我提出一種運用類(lèi)反射的機制,使應用程序對ActionForm Bean的賦值自動(dòng)化,即應用程序通過(guò)一個(gè)簡(jiǎn)單的接口,使用一個(gè)通用的方法,就可以完成對ActionForm Bean的賦值,而不必在每個(gè)使用ActionFormBean的地方,都把數據庫中的值手動(dòng)賦值給ActionForm Bean,然后再在JSP頁(yè)面中顯示出來(lái)。雖然它不能減少ActionForm Bean的數量,但是,它至少使應用程序對ActionForm Bean的賦值自動(dòng)化了,從而減少了程序出錯概率,提高了程軟件開(kāi)發(fā)效率。





回頁(yè)首


類(lèi)反射的概念:

關(guān)于類(lèi)反射的概念,在此我就不詳細介紹了,它不是本文的重點(diǎn),IBM developerWorks網(wǎng)站上有大量介紹類(lèi)反射概念的文章,大家可以找出來(lái)參考一下。其實(shí),Struts本身就大量利用了類(lèi)反射的機制。





回頁(yè)首


如何應用類(lèi)反射機制簡(jiǎn)化Struts應用程序的開(kāi)發(fā):

1、 先定義Action FormBean:

                package com.bhsky.webis.system;            import org.apache.struts.action.*;            import javax.servlet.http.*;            public class UsersActionForm extends ActionForm {            private String usr_id;            private String usr_name;            public void setUsr_id(String usr_id) {            this.usr_id = usr_id;            }            public String getUsr_id() {            return usr_id;            }            public String getUsr_memo() {            return usr_memo;            }            public void setUsr_name(String usr_name) {            this.usr_name = usr_name;            }            }            

2、 編寫(xiě)通用的為ActionFormBean賦值的方法:

                /////////////////////////////////////////////////////////////////////////////            //Function: 完成ResultSet對象向ArrayList對象為集合的對象的轉化            //Para:sql,指定的查詢(xún)Sql            //Para:className,Sql相對應得JavaBean/FormBean類(lèi)的名字            //Return:以類(lèi)className為一條記錄的結果集,完成ResultSet對象向ArrayList對象為集//合的className對象的轉化            //////////////////////////////////////////////////////////////////////////////            public ArrayList Select(String sql,String className){            ArrayList paraList=new ArrayList();            try{            if (conn == null){            Connection();            }            PreparedStatement stmt = conn.prepareStatement(sql);            ResultSet rs = stmt.executeQuery();            String recordValue="";            Object c1=null;            paraList=new ArrayList();            ResultSetMetaData rsmd = rs.getMetaData();            int columnCount = rsmd.getColumnCount();            while (rs.next()){            c1=Class.forName(className).newInstance();            for (int i=1; i<=columnCount; i++) {            if(rs.getString(rsmd.getColumnName(i))!=null){            recordValue=rs.getString(rsmd.getColumnName(i));            }else{            recordValue="";            }            Method            m=c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),            new Class[]{recordValue.getClass()});            m.invoke (c1, new Object[]{recordValue});            }            paraList.add(c1);            }            }catch(SQLException ex){            }catch(ClassNotFoundException e){            }catch(NoSuchMethodException e) {            }catch(InvocationTargetException e){            }catch (IllegalAccessException e){            }catch(InstantiationException e){            } finaly{            closeConnection();            return paraList;            }            }            

3、 在JavaBean封裝的商業(yè)邏輯中調用Select 方法,然后在JSP頁(yè)面上顯示出來(lái):

               //Function:取得用戶(hù)列表            //Para:            //Return:返回用戶(hù)列表            /////////////////////////////////////////////////////////////////////////////            public ArrayList getUsers(){            ArrayList ret=null;            DatabaseManage db=new DatabaseManage();            String sql=" select usr_id,usr_name "            +" from users " ;            ret=db.Select(sql," com.bhsky. webis.system.UsersActionForm");            return ret;            }            

4、 在A(yíng)ction的execute方法中調用getUsers()方法:

               public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm,            HttpServletRequest request, HttpServletResponse httpServletResponse)            {            /**@todo: complete the business logic here, this is just a skeleton.*/            UsersActionForm uaf=(UsersActionForm)actionForm;            SystemService ubb=new SystemService();            ArrayList userList=ubb.getUsers();            request.setAttribute("userList",userList);            ActionForward actionForward=actionMapping.findForward(url);            return actionForward;            }            

5、 在JSP中顯示:

               <table width="700" class="1" border="1" cellspacing="1" align="center">            <tr>            <td class="list" >用戶(hù)ID</td>            <td class="list" >姓  名</td>            </tr>            <logic:present name="userList" scope="request">            <logic:iterate name="userList" id="userList"            type="com.bhsky.webis.system.UsersActionForm">            <tr>            <td class="cell1"  height="22"><bean:write name="userList"            property="usr_id"/></td>            <td class="cell1"  height="22"><bean:write name="userList"            property="usr_name"/></td>            </tr>            </logic:iterate>            </logic:present>            </table>            





回頁(yè)首


結語(yǔ):

我們通過(guò)運用類(lèi)反射機制,在一個(gè)Struts應用開(kāi)發(fā)中,完成了一個(gè)通用查詢(xún)方法的實(shí)現。它使得程序員擺脫了在每個(gè)應用程序中都要編寫(xiě)枯燥的set、get等方法來(lái)訪(fǎng)問(wèn)ActionForm Bean,從而簡(jiǎn)化了Struts應用程序的開(kāi)發(fā)。





回頁(yè)首






回頁(yè)首


關(guān)于作者

邢波濤 , 您可以通過(guò) xbt@bhsky.com 與他聯(lián)系。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Struts教程
blogjava - hexuzhong-利用myeclipse快速開(kāi)發(fā)struts應用程序
Struts開(kāi)發(fā)技巧
JavaEE高級框架學(xué)習筆記(七)Struts高級ActionForm
Struts在Tomcat中的安裝配置及工作流程
Java面試題專(zhuān)題之SSH框架
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久