工作中會(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)試,但有一種情況,就是開(kāi)發(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ì)。
Android Adapter 是將數(shù)據(jù)綁定到UI 界面上的橋接類(lèi)。 Adapter負(fù)責(zé)創(chuàng)建和顯示每個(gè)項(xiàng)目的子View和提供對(duì)下層數(shù)據(jù)的訪問(wèn)。支持Adapter綁定的UI控件必須擴(kuò)展Adapter View抽象類(lèi)。創(chuàng)建自己的繼承自AdapterView的控件和創(chuàng)建新的Adapter類(lèi)來(lái)綁定它們是可能的。
Android 系統(tǒng)本身提供了兩種現(xiàn)成的Adapter 供我們使用。
1.ArrayAdapter:它是一個(gè)綁定View到一組對(duì)象的通用類(lèi)。默認(rèn)情況下,ArrayAdapter綁定每個(gè)對(duì)象的toString值到layout中預(yù)先定義的TextView空間上。構(gòu)造函數(shù)允許用戶使用更加復(fù)雜的Layout或者通過(guò)重寫(xiě)getView方法來(lái)擴(kuò)展類(lèi)從而使用TextView的替代物
2.SimpleCursorAdapter:它綁定View到Content Provider 查詢返回的游標(biāo)上。指定一個(gè)XML layout定義,然后將數(shù)據(jù)集的每一列的值綁定到layout中的一個(gè)View
寫(xiě)自己的Adapter類(lèi)實(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。 如果需要使用到父類(lèi)SimpleAdapter 顯示效果需要調(diào)用super.getView方法為 convertView 賦值。
在java中"=="是用來(lái)比較兩者儲(chǔ)存值的地址是否相同,比如A==B,就是比較A和B所儲(chǔ)存值的地址是否相同。
再來(lái)看看equals()的使用
在java中有這兩種情況存在:
1、使用object類(lèi)中的equals()方法,這個(gè)是java中最初的equals()方法
如果你自定義一個(gè)類(lèi)A,并且沒(méi)有去繼承其他的類(lèi),這時(shí)A中的equals()
的功能就是比較兩者儲(chǔ)存值的地址是否相同。因?yàn)樗械念?lèi)都繼承object
類(lèi),而object類(lèi)中有equals()這樣的方法
object類(lèi)中的equals()方法的源代碼如下:
public boolean equals(object obj)
{
return this == obj;
}
從這段代碼中,我們可以再次確定,這種情況下的equals()方法的功能是
比較兩者儲(chǔ)存值的地址。
2、自定義一個(gè)類(lèi)B,但B類(lèi)繼承了c類(lèi),而c類(lèi)中的equals()方法已經(jīng)被重寫(xiě)過(guò)
了,這種情形就需要具體情況具體分析了,但大部分被重寫(xiě)的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類(lèi)中的equals()就被重寫(xiě)了,但這并不意味著所有被重寫(xiě)
過(guò)的equals()方法都是用來(lái)比較內(nèi)容的(因?yàn)槟壳拔宜龅降闹挥羞@種情
況,如果大家有興趣可以去多研究研究
總結(jié):"=="就只有一種用法,而equals()有兩種用法,只是所使用的環(huán)境不一樣而已。
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類(lèi)型轉(zhuǎn)換的錯(cuò)誤,但是程序中又壓根兒沒(méi)有用到Struts2的類(lèi)型轉(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ò)誤。可以這樣寫(xiě):
<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ì)提示這樣的信息。所以,在開(kāi)發(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
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,并且填寫(xiě)該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的封裝類(lèi).
SqlMapClient中包含著session的管理.
SqlMapClientTemplate用于session的封裝,以及異常的捕捉.
所以按照以上的推斷來(lái)說(shuō).應(yīng)該盡量使用SqlMapClientTemplate.
保證session以及Exception的正常以及統(tǒng)一.
2. 然后就是SqlMapClient的配置:
<sqlMap resource="sql/gpsData_sqlmap_mapping.xml"/>
配置gpsData類(lèi)與數(shù)據(jù)庫(kù)的對(duì)應(yīng)關(guān)系
3. 這兩個(gè)xml文件配置好以后就可以在自己的DAO類(lèi)中寫(xiě)相應(yīng)的增刪改查方法了。
public class IbatisGpsDataDao extends BaseDao implements GpsDataDao{
…
}
該類(lèi)集成了BaseDao類(lèi),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);
}