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

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

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

    2013年11月12日

    Java Web項(xiàng)目調(diào)試

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

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


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


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

     

    posted @ 2013-11-12 23:30 gps夢(mèng)想 閱讀(3018) | 評(píng)論 (1)編輯 收藏

    2012年9月15日

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

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

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

    Class UserService{

           private UserDao userDao;

                  public void deleteUser(User user){

                         user.setStatus(-1);

                         userDao.update(user);

    }

    }

           這個(gè)邏輯其實(shí)執(zhí)行的是更新操作,但接口名仍是deleteUser,因?yàn)樗峁┑拇_實(shí)是刪除“服務(wù)”,調(diào)用接口時(shí)我只需要知道我調(diào)用這個(gè)接口時(shí)會(huì)刪除對(duì)象,至于它怎么實(shí)現(xiàn),我管不著。

           Java中到處是指針引用,習(xí)慣了使用c語(yǔ)言指針的程序員往往會(huì)亂用指針,而破壞了面向?qū)ο蟮乃枷耄热?,我要查詢某個(gè)用戶的密碼,有人可能會(huì)這么寫:

           Class UserService{

                  private UserDao userDao;

                         public void queryUserPasswd(int id,User user){

                                String passwd=userdao.getUserPasswd(id)

    User.setPasswd(passwd);

    }

    }

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

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

    Class UserService{

                  public void deleteUser(UserDao userDao ,User user){

                         user.setStatus(-1);

                         userDao.update(user);

    }

    }

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

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

    posted @ 2012-09-15 11:06 gps夢(mèng)想 閱讀(2049) | 評(píng)論 (1)編輯 收藏

    2012年7月6日

    Android Adapter詳解

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

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

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

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

     

    寫自己的Adapter類實(shí)現(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 中對(duì)應(yīng)key的資源ID getView中自定義Item里面的事件監(jiān)聽(tīng),自定義新的重載后的顯示界面返回 convertView。 如果需要使用到父類SimpleAdapter 顯示效果需要調(diào)用super.getView方法為 convertView 賦值。

    posted @ 2012-07-06 11:19 gps夢(mèng)想 閱讀(2682) | 評(píng)論 (0)編輯 收藏

    2012年5月15日

    JAVA中==與equals()用法的區(qū)別

    在java中"=="是用來(lái)比較兩者儲(chǔ)存值的地址是否相同,比如A==B,就是比較A和B所儲(chǔ)存值的地址是否相同。

    再來(lái)看看equals()的使用 

    在java中有這兩種情況存在:

          1、使用object類中的equals()方法,這個(gè)是java中最初的equals()方法

             如果你自定義一個(gè)類A,并且沒(méi)有去繼承其他的類,這時(shí)A中的equals()

             的功能就是比較兩者儲(chǔ)存值的地址是否相同。因?yàn)樗械念惗祭^承object

             類,而object類中有equals()這樣的方法

            object類中的equals()方法的源代碼如下:

              public boolean equals(object obj)

              {

                return this == obj;

              }

     

             從這段代碼中,我們可以再次確定,這種情況下的equals()方法的功能是

             比較兩者儲(chǔ)存值的地址。

     

     

          2、自定義一個(gè)類B,但B類繼承了c類,而c類中的equals()方法已經(jīng)被重寫過(guò)

                了,這種情形就需要具體情況具體分析了,但大部分被重寫的equals()方

                法所擁有的功能就是比較兩者儲(chǔ)存值的內(nèi)容是否相同,而不再是比較地址

                了。比如:創(chuàng)建一個(gè)String對(duì)象  String str1 = new String("1");

                String str2 = new String("1");  

                這時(shí)str1.equals(str2)比較的就是str1和str2中儲(chǔ)存值的內(nèi)容是否相同 

                了,因?yàn)镾tring類中的equals()就被重寫了,但這并不意味著所有被重寫

                過(guò)的equals()方法都是用來(lái)比較內(nèi)容的(因?yàn)槟壳拔宜龅降闹挥羞@種情

                況,如果大家有興趣可以去多研究研究

    總結(jié):"=="就只有一種用法,而equals()有兩種用法,只是所使用的環(huán)境不一樣而已。

    posted @ 2012-05-15 11:56 gps夢(mèng)想 閱讀(717) | 評(píng)論 (0)編輯 收藏

    WARN com.opensymphony.xwork2.ognl.OgnlValueStack異常的解決辦法

    WARN com.opensymphony.xwork2.ognl.OgnlValueStack:60 - Error setting expression 'ssc.x' with value '[Ljava.lang.String;@28d320d6'

    ognl.OgnlException: target is null for setProperty(null, "x", [Ljava.lang.String;@28d320d6)

    ognl.OgnlException: target is null for setProperty(null, "y", [Ljava.lang.String;@32a88bc2) 

    的解決辦法

    Struts2
    這個(gè)異常是在提交表單的時(shí)候發(fā)生的,乍一看以為是Struts2類型轉(zhuǎn)換的錯(cuò)誤,但是程序中又壓根兒沒(méi)有用到Struts2的類型轉(zhuǎn)換,而且前臺(tái)頁(yè)面
    index.jsp中也沒(méi)有設(shè)置x,y這些參數(shù);且這個(gè)錯(cuò)誤并不會(huì)影響程序的正常運(yùn)行,找了很久,最后發(fā)現(xiàn)是提交按鈕的緣故,提交按鈕引用的是一個(gè)圖片,
    如下:

    <input id="submit" type="image" name="ssc" src="asserts/images/5.jpg"/>

    由于表單提交中設(shè)置了name屬性,所以struts2會(huì)進(jìn)行接收相應(yīng)的值,查找它的set 和 get方法,而action里面沒(méi)有這個(gè)name值的,所以才出現(xiàn)了如上錯(cuò)誤??梢赃@樣寫:

    <input id="submit" type="image"  src="asserts/images/5.jpg" />

    將name屬性去掉即可。

    其實(shí),在struts.xml文件里可以配置"struts.devMode"屬性。

    當(dāng)
    struts.devMode = true時(shí),使用struts在默認(rèn)配置下對(duì)任何提交到action的參數(shù)強(qiáng)制需要setter方法,html表單數(shù)
    據(jù)中有和action屬性匹配不上的參數(shù)名時(shí)就會(huì)提示這樣的信息。所以,在開發(fā)過(guò)程中將這個(gè)屬性設(shè)為true還是很好的,它可以幫我們發(fā)現(xiàn)一些可能出現(xiàn)但
    又被我們忽視的問(wèn)題,犯的“錯(cuò)誤”越多,才能積累很多的經(jīng)驗(yàn)。

    轉(zhuǎn)自百度空間:

    http://hi.baidu.com/gpsdreamer/item/544050ed0e00e4d0e1a5d4cd

    posted @ 2012-05-15 11:54 gps夢(mèng)想 閱讀(14876) | 評(píng)論 (5)編輯 收藏

    Spring中使用ibatis完整分析

    1. 首先看Spring中beans的配置:

    1) <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">

    第一個(gè)bean作為配置連接數(shù)據(jù)庫(kù),設(shè)置DriverManager以及用戶名密碼

    2) <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

    第二個(gè)bean就是選擇SqlMapClient,并且填寫該xml的路徑:

    XmlSqlMapClientBuilder xmlBuilder =new XmlSqlMapClientBuilder();

    SqlMapClient sqlMap = xmlBuilder.buildSqlMap(reader);

    3) <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">

    <property name="sqlMapClient">

                <ref bean="sqlMapClient" />

     </property>

     </bean>

    第三個(gè)bean,SqlMapClientTemplate是SqlMapClient的封裝類.
    SqlMapClient中包含著session的管理.
    SqlMapClientTemplate用于session的封裝,以及異常的捕捉.
    所以按照以上的推斷來(lái)說(shuō).應(yīng)該盡量使用SqlMapClientTemplate.
    保證session以及Exception的正常以及統(tǒng)一.

    2. 然后就是SqlMapClient的配置:

    <sqlMap resource="sql/gpsData_sqlmap_mapping.xml"/>

    配置gpsData類與數(shù)據(jù)庫(kù)的對(duì)應(yīng)關(guān)系

    3. 這兩個(gè)xml文件配置好以后就可以在自己的DAO類中寫相應(yīng)的增刪改查方法了。

    public class IbatisGpsDataDao extends BaseDao implements GpsDataDao{

    }

        該類集成了BaseDao類,BaseDao提供了SqlMapClientTemplate的對(duì)象操作,該對(duì)象正是在Spring beans中配置的。通過(guò)獲得這個(gè)SqlMapClientTemplate,進(jìn)行增刪改查的操作。

    例如下面的insert方法:

    public long insertGpsDataDo(GpsDataDo gpsdata) {

    if(gpsdata == null){

    throw new IllegalArgumentException();

    }

    return (Long) getSqlMapClientTemplate().insert("GpsData.insertGpsData",gpsdata);

    }

    posted @ 2012-05-15 11:52 gps夢(mèng)想 閱讀(674) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題  
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲伊人久久精品| 亚洲AV中文无码字幕色三| 久久久久亚洲av无码专区喷水 | mm1313亚洲精品国产| 色噜噜的亚洲男人的天堂| 成人免费无码大片a毛片软件| 亚洲一区二区三区91| 午夜性色一区二区三区免费不卡视频| 亚洲视频中文字幕在线| www视频免费看| 亚洲精品综合在线影院| 日本一区二区三区日本免费| 婷婷国产偷v国产偷v亚洲| 国产精品无码一二区免费| 视频一区在线免费观看| 伊人久久精品亚洲午夜| 日本免费久久久久久久网站| 亚洲综合激情另类小说区| 国产麻豆视频免费观看| 精品国产_亚洲人成在线| 久久亚洲高清综合| 久久国产乱子免费精品| 国产人成亚洲第一网站在线播放| 性感美女视频在线观看免费精品| 国产成人综合亚洲| 亚洲av无码一区二区乱子伦as| 足恋玩丝袜脚视频免费网站| 亚洲日韩国产一区二区三区在线| 四虎亚洲国产成人久久精品| 中文字幕在线视频免费| 久久精品a亚洲国产v高清不卡| 毛片免费在线播放| 国产无限免费观看黄网站| 亚洲午夜在线电影| 好吊妞在线成人免费| 久久久久久久久久免免费精品| 亚洲日本国产乱码va在线观看| 免费永久国产在线视频| 99精品一区二区免费视频| 亚洲国产成人AV网站| 亚洲日本va午夜中文字幕一区|