2012年7月6日

          Java Web項目調(diào)試

          工作中會帶一些實習(xí)生或新人,大多缺乏經(jīng)驗,項目調(diào)試是他們很頭疼的問題,代碼出了問題往往就束手無策了,很影響工作效率。其實代碼調(diào)試是有步驟可循的,代碼出了問題要做的第一件事情是定位問題,只有知道問題出在哪才能解決。

          一個Java Web項目通常是由前端和后端組成的,請求是由前端發(fā)送給后臺代碼處理的,所以我們要做的第一件事情就是確定問題出在前端還是后端,先要保證前端發(fā)送給后端的請求參數(shù)是對的,有些同學(xué)在請求參數(shù)不對或者請求根本沒有到達(dá)后臺的情況下盲目地去檢查后臺代碼是不對的。


          前臺請求通常通過form、超鏈接或ajax等方法提交給后臺,我們必須確定提交的鏈接是對的,然后是參數(shù),提交的參數(shù)我們可以通過瀏覽器地址或者一些瀏覽器調(diào)試工具(例如火狐的firebug)得到。


          如果請求鏈接是對的、參數(shù)也是對的,那就是后臺的問題了,后臺問題通常通過eclipse的debug工作調(diào)試,但有一種情況,就是開發(fā)中會運(yùn)用一些mvc框架,例如struts2、spring
          mvc等,我們在后臺某個地方加斷點根本就沒反應(yīng),這時候有個很簡單的方法,把斷點加到control層的代碼入口處,如果還沒反應(yīng),那就是框架配置問題了,要檢查配置對不對。

           

          posted @ 2013-11-12 23:30 gps夢想 閱讀(3021) | 評論 (1)編輯 收藏

          淺析JAVA面向?qū)ο笏枷?/a>

          對象,你可以理解成一種具有屬性和行為的實體,它可向外部提供服務(wù)。而使用這個對象,可忽略其內(nèi)部的細(xì)節(jié),只需要知道使用這種服務(wù)時的“投入”、“產(chǎn)出”即可,因此,“高內(nèi)聚、低耦合”是面向?qū)ο缶幊痰幕舅枷搿?/span>

          略舉一例,平時我們工作中要刪除某條數(shù)據(jù),一般不是真的delete掉,而是用一個status標(biāo)識,status-1表示刪除,你寫刪除接口時完全可以這么寫:

          Class UserService{

                 private UserDao userDao;

                        public void deleteUser(User user){

                               user.setStatus(-1);

                               userDao.update(user);

          }

          }

                 這個邏輯其實執(zhí)行的是更新操作,但接口名仍是deleteUser,因為它提供的確實是刪除“服務(wù)”,調(diào)用接口時我只需要知道我調(diào)用這個接口時會刪除對象,至于它怎么實現(xiàn),我管不著。

                 Java中到處是指針引用,習(xí)慣了使用c語言指針的程序員往往會亂用指針,而破壞了面向?qū)ο蟮乃枷耄热纾乙樵兡硞€用戶的密碼,有人可能會這么寫:

                 Class UserService{

                        private UserDao userDao;

                               public void queryUserPasswd(int id,User user){

                                      String passwd=userdao.getUserPasswd(id)

          User.setPasswd(passwd);

          }

          }

                 這種寫法在語法上沒什么問題,也能得到正確的值,但傳個user對象進(jìn)來就有些不妥了,我要得到密碼,傳個用戶的密碼,只要給個id就可以把密碼返回給調(diào)用者了,干嘛要讓人再傳個對象進(jìn)來?

                 作為一個項目經(jīng)理,在工作過程中,確實會遇到令人哭笑不得的接口,就像上面那個刪除接口吧,有人會這么寫:

          Class UserService{

                        public void deleteUser(UserDao userDao ,User user){

                               user.setStatus(-1);

                               userDao.update(user);

          }

          }

          這接口寫得,讓人摸不著頭腦了,我刪除一個user對象,還要傳個userDao給你,意思是你為我提供服務(wù),我還要給個工具給你,這說不通吧!

          Java是純粹的面向?qū)ο笳Z言,寫Java程序時要時刻記住,你在為別人提供服務(wù),為別人提供服務(wù)就不應(yīng)該提出過多的附加要求。這個問題在使用MVC模式分層思想的時候體現(xiàn)得更加嚴(yán)重。在使用MVC模式開發(fā)的時候,往往將整個項目分成幾層:action層、service層、數(shù)據(jù)庫處理層(dao層)等等,每一層往往由不同的程序員編寫,這時候要格外提醒自己在為別人提供服務(wù)。在一個新項目開始的時候往往會出現(xiàn)一個問題:在增加某條數(shù)據(jù)時,要對這條數(shù)據(jù)的字段進(jìn)行驗證,不能為空或者長度過長等等,如果沒有驗證容易拋錯,在分層編寫接口時,開發(fā)人員經(jīng)常想這個驗證應(yīng)該在上層或者下層做吧,我這邊得到的數(shù)據(jù)是正確的,最后導(dǎo)致誰都沒做驗證。只要你記住了提供“服務(wù)”的思想,就不應(yīng)該要求別人給你的數(shù)據(jù)是正確的,而是應(yīng)該處理各種非正常問題,保證用戶給你的任何數(shù)據(jù)你都能給出相應(yīng)的返回,當(dāng)然,在實際的項目中項目經(jīng)理可能規(guī)定數(shù)據(jù)驗證在service層做。

          posted @ 2012-09-15 11:06 gps夢想 閱讀(2052) | 評論 (1)編輯 收藏

          Android Adapter詳解

          Android Adapter 是將數(shù)據(jù)綁定到UI 界面上的橋接類。 Adapter負(fù)責(zé)創(chuàng)建和顯示每個項目的子View和提供對下層數(shù)據(jù)的訪問。支持Adapter綁定的UI控件必須擴(kuò)展Adapter View抽象類。創(chuàng)建自己的繼承自AdapterView的控件和創(chuàng)建新的Adapter類來綁定它們是可能的。

          Android 系統(tǒng)本身提供了兩種現(xiàn)成的Adapter 供我們使用。

          1.ArrayAdapter:它是一個綁定View到一組對象的通用類。默認(rèn)情況下,ArrayAdapter綁定每個對象的toString值到layout中預(yù)先定義的TextView空間上。構(gòu)造函數(shù)允許用戶使用更加復(fù)雜的Layout或者通過重寫getView方法來擴(kuò)展類從而使用TextView的替代物

          2.SimpleCursorAdapter:它綁定ViewContent Provider 查詢返回的游標(biāo)上。指定一個XML layout定義,然后將數(shù)據(jù)集的每一列的值綁定到layout中的一個View

           

          寫自己的Adapter類實現(xiàn)更多復(fù)雜的UI界面和數(shù)據(jù)綁定

             
          public class MyAdapter extends SimpleAdapter {
              
                
          private LayoutInflater mInflater;
                
          private Context context;
                
          private List<Map<String,Object>> list;
                
          private int resource;
                
          private String[] tags;
                
          private int[] ids;
                
          public MyAdapter(Context context, List<Map<String,Object>> items, int resource,
                        String[] tags,
          int[] ids) {
                    
          super(context, items, resource, tags, ids);
                    
                    
          this.mInflater = LayoutInflater.from(context);
                    
          this.context = context;
                    
          this.list = items;
                    
          this.resource = resource;
                    
          this.tags = tags;
                    
          this.ids = ids;
                }
                
                
          public int getCount() {
                    
          return list.size();
                }
                
                
          public Object getItem(int position) {
                    
          return list.get(position);
                }
                
                
          public long getItemId(int position) {
                    
          return position;
                }
                
                
          public View getView(final int position, View convertView, ViewGroup parent) {
                    convertView 
          = super.getView(position, convertView, parent);
                    
          if (convertView == null) {  
                        Toast.makeText(context, 
          "this is null"2000).show(); 
                       
                   
                    } 
          else {   
                        
                    } 
                   
                    ImageView more 
          = (ImageView) convertView.findViewById(R.id.iv_more); 
                    
                    more.setOnClickListener(
          new View.OnClickListener() {
                        
          public void onClick(View arg0) {
                            Intent intent 
          = new Intent(context, VehicleInfoActivity.class);
                            intent.putExtra(
          "vehicleID", VehicleListActivity.idList.get(position));
                            intent.putExtra(
          "CameraID""0");
                            Toast.makeText(context, 
          "sssssss"2000).show();  
                            context.startActivity(intent);
                            
                
                        }
                    });
                    
                    
          return convertView;
                }
          }

          主要重載getCount 方法,getView方法 getItem方法 getItemId方法; 參數(shù)解析:context:傳入的上下文Activity, items 綁定數(shù)據(jù)的列表, resource layout布局ID, tags 綁定數(shù)據(jù)的key, ids Item 中對應(yīng)key的資源ID getView中自定義Item里面的事件監(jiān)聽,自定義新的重載后的顯示界面返回 convertView 如果需要使用到父類SimpleAdapter 顯示效果需要調(diào)用super.getView方法為 convertView 賦值。

          posted @ 2012-07-06 11:19 gps夢想 閱讀(2685) | 評論 (0)編輯 收藏

          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 蚌埠市| 吉木萨尔县| 阳新县| 牙克石市| 三亚市| 安多县| 简阳市| 镇原县| 微山县| 万安县| 井陉县| 安顺市| 高邮市| 崇信县| 永定县| 翼城县| 惠东县| 洛南县| 北安市| 望江县| 牟定县| 正定县| 河东区| 霞浦县| 开化县| 雅安市| 日土县| 凤庆县| 井陉县| 武功县| 怀化市| 五莲县| 吴江市| 凌海市| 丹凤县| 瑞金市| 山阳县| 黑河市| 新化县| 德钦县| 北京市|