java.lang.InstantiationException
在Struts creating form bean的時候遇到這個異常
在form bean 中加一個無參的構造函數就Ok了
API中有寫:
public ServletInputStream getInputStream() throws java.io.IOException
ServletInputStream
. Either this method or getReader()
may be called to read the body, not both.
ServletInputStream
object containing the body of the request
java.lang.IllegalStateException
- if the getReader()
method has already been called for this request
java.io.IOException
- if an input or output exception occurred
eclipse中如果選中一個變量,則在本源文件中高亮顯示相同的變量 Window->Preferences,在type filter text 中輸入Mark Occurrences 在Java-Editor-Mark Occurrences中將Mark occurrences of the selected element in the current file.選中OK即可 |
工作快三年了,一直沒有用到spring,做的幾個項目全部基于struts+hibernate,昨天忙完手頭的活兒,自己建了個struts+spring+hibernate的demo,能用MyEclipse自動生成的全部自動生成,表映射、pojo、SessionFactory、applicationContext.xml、struts-config.xml都自動生成了,弄了兩個jsp,一個add,一個view
運行發現,spring未被加載,原因找來找去找不到,最后還是看了以前寫的一篇blog,可能存在重復jar包,有沖突,確實發現Myeclipse自動鍵入的jar包好多好多,而且有的有重復,搗鼓出以前做的例子,復制lib里面的jar包,果然OK了,實現了增查。
spring確實是個好東西,強大、強大。
Google SSH整合的例子,發現都是Struts2SpringHibernate了,俺還struts1呢,out了
** Unable to load Mozilla for hosted mode **解決辦法:
java.lang.UnsatisfiedLinkError:
/home/dhofmann/development/ide/gwt-linux-1.4.61/mozilla-1.7.12/libxpcom.so:
libstdc++.so.5: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
需求為:在頁面的文本框輸入一個x、y坐標,之間用","隔開,Action中有一個Point類型的屬性,Point類里面有兩個字段,分別是x,y,int型,要求當頁面提交時將文本框中的字符串轉換成Point對象,當Action返回到頁面時將Point轉換成字符串顯示
1、首先做一個jsp用于輸入和提交:point.jsp
2、再建一個用于顯示的jsp-converter.jsp
3、Action類 ConverterAction
4、struts.xml
5、轉換類 ConverterPoint
6、配置轉換
在ConverterAction 類的同一目錄下定義屬性文件ConverterAction-conversion.properties,注意文件名,-conversion.properties為固定不變,ConverterAction為Action的名字,文件內容:
point=com.test.struts2.action.ConverterPoint
Ok了,這樣就完工了
注意到<s:textfield name="point" label="Point"></s:textfield>
中的label屬性,它指定了文本框前面顯示的內容,還自動加了冒號,哈哈,挺聰明的嘛,但是擔心這樣在復雜的頁面設計中是不是好使。
哦對了,要想這么寫,要在頁面上方加上這個:<%@ taglib prefix="s" uri="/struts-tags" %>
2、Action
前面說的Action不再需要繼承任何struts類,現在看來要失望了,為了方便起見還是建議集成ActionSupport類,目前覺得有用的是ActionSupport中定義了幾個static的result name,比如SUCCESS、ERROR,原來的return "success";現在可以寫成return super.SUCCESS;,將標識用的字符串常量定義成static的是一直提倡的,還有就是validate()方法,驗證有錯誤可以調用addFieldError()方法,好像就是struts1 ActionForm里的東西,有所改進的是super.addFieldError("username", "username is null");將在頁面中顯示的效果為:錯誤信息"username is null"將在名字為"username"文本框的上面顯示,這些如果能用ajax實現就好了。
對于Action解耦,可能在于它不再需要HttpServletRequest 、HttpServletResponse這樣的容器運行時參數吧
Powered by Zoundry Raven
以為萬事大吉了呢,昨晚上因為Integer的一個方法發現了問題
Integer中有個方法valueOf
static Integer |
valueOf(int i)
返回一個表示指定的 int 值的 Integer 實例。 |
static Integer |
valueOf(String s)
返回保持指定的 String 的值的 Integer 對象。 |
static Integer |
valueOf(String s, int radix)
返回一個 Integer 對象,該對象中保持了用第二個參數提供的基數進行分析時從指定的 String 中提取的值。 |
其中valueOf(int i)
也就是在1.5之前沒有這個方法,但是在eclipse中卻有這個方法的提示
找了半天,原來問題出在這,在Java Build Path 中Libraries 中jdk是1.5的,把它remove掉,添加一個1.4的就OK了
還是功力不夠啊 充電 充電ing
根據主鍵Id得到一個持久對象,Hibernate中有兩個方法,一個get,一個load,他們兩個參數相同,都返回一個Object
它們的區別:
執行get方法即時生成查詢sql去查詢數據庫得到相應的pojo,如果數據庫中沒有相應記錄,則返回null
執行load方法不會即時產生sql語句,而是在用到返回的對象時采取查詢數據庫,也就是load方法有默認的延遲加載,在執行load方法后返回的不是一個pojo對象,是pojo對象的一個代理(據說Hibernate是用代理的方式實現延遲加載的,這塊還迷糊),如果數據庫中沒有相應記錄,load方法會拋出異常ObjectNotFoundException
看了一下我們用MyEclipse hibernate工具通過數據庫生成的DAO類,它的findById方法是用的session.get()方法,這是即時獲得pojo對象,如果是load方法,在執行完load后如果關閉了session,那在接下來用到這個pojo對象時恐怕會報session已關閉的錯誤。
還有就是這兩個方法的第二個參數id,它必須是實現了java.io.Serializable接口,也就是可序列化的。
今天好像是立冬,冬天到了,抓緊時間充充電,明天接著學...
回來轉眼上了一星期班了,忙的屁滾尿流
一年前的系統要增加兩個大功能,200多個報表要挨個修改,報表校驗的頁面效果客戶又提出了新建議,一個字 改
從昨天晚上開始搗鼓到現在終于解決了一個問題,心情好了些,上來寫寫,哈哈
這兩天用了baidu 百度空間中的彈出窗口js,感覺不錯,很強大,很好很簡單的解決了好幾個問題,界面友好度以及美化也好多了,以前都是硬邦邦window.open();
有興趣的朋友搜索"百度 popup"就好了,已經有人給出了注釋,強大。
最有意思的是用javascript獲取和設置style
DOM標準引入了覆蓋樣式表的概念,當我們用document.getElementById("id").style.backgroundColor 獲取樣式時 獲取的只是id中style屬性中設置的背景色,如果id中的style屬性中沒有設置background-color那么就會返回空,也就是說如果id用class屬性引用了一個外部樣式表,在這個外部樣式表中設置的背景色,那么不好意思document.getElementById("id").style.backgroundColor 這種寫法不好使,如果要獲取外部樣式表中的設置,需要用到window對象的getComputedStyle()方法,代碼這樣寫window.getComputedStyle(id,null).backgroundColor
但是兼容問題又來了,這么寫在firefox中好使,但在IE中不好使
兩者兼容的方式寫成
window.getComputedStyle?window.getComputedStyle(id,null).backgroundColor:id.currentStyle["backgroundColor"];
如果是獲取背景色,這種方法在firefox和IE中的返回值還是不一樣的,IE中是返回"#ffff99"樣子的,而firefox中返回"rgb(238, 44, 34) "
值得注意的是:window.getComputedStyle(id,null)這種方式不能設置樣式,只能獲取,要設置還得寫成類似這樣id.style.background="#EE2C21";
參考:
JavaScript權威指南
http://bokee.shinylife.net/blog/article.asp?id=817
http://book.csdn.net/bookfiles/679/10067921329.shtml
它可以實現url重寫,從而隱藏實際的url,同時使url看起來更美觀,簡單
最令人興奮的是它一下解決了一值在尋找的blog用戶訪問自己的空間的問題
比如http://hi.baidu.com/liuspring 就顯示我的空間
2、在項目的web.xml配置過濾器
3、將urlrewrite-2.6.0.jar放入lib文件夾
4、新建urlrewrite.xml文件置于WEB-INF目錄
5、配置urlrewrite.xml
url匹配使用正則表達式的規則,
實驗中發現一個問題,就是必須把里面的正則表達式用小括號括起來,在正則表達式中叫分組
不然會報異常:
java.lang.IndexOutOfBoundsException: No group 2
哈哈,前幾日還費勁的自己寫Servlet重寫url呢,原來這有現成的,更加覺得自己現在的水平遇到的問題網上的前輩們早都遇到過了,一定要站在巨人的肩膀上,少走彎路啊。
把我的servlet貼在這,呵呵,參考自blojsom
感覺普元的報表有點水晶的味道,弄了個分組報表,又建數據源又建數據集有設行分組,列分組的,趕緊挺麻煩,沒有用潤乾好使,雖然潤乾工作量也挺大
看來老板要貼了心上普元了,接下來可能要實戰了,不知道啥樣,現在有兩點困難;
1\、普元報的錯誤,無從下手,不知道哪出的毛病,比如有時在展現層的毛病,而在邏輯處理層報錯,摸不著頭腦啊。
2、普元的構件不熟悉,據說有1000多個構件,不像java api一樣按照功能分的包,它是按層分的包,業務邏輯層構件、運算層構件、展現層構件。要實現一個功能怎么能知道構件包里有沒有現成的,恐怕這只能慢慢熟悉那些構件庫了
3、覺得普元的報表系統不怎么樣,至少沒有什么讓人耳目一新的,工作流系統還挺強,對工作流不熟悉,不敢說什么,然后就是可維護性,可擴展性,可能一直是自己寫代碼的,看不見代碼總覺得不踏實最然功能實現了并以更迅速的
4、聽頭兒說這是未來軟件開發的趨勢,聽得我直郁悶,未來開發就是這么托構件然后用連線一拉基本完事兒了嗎?!得,要不我還是轉行做小買賣去吧,嗚嗚,總的來說,覺得這種模式對程序員個人的發展沒多大好處,核心代碼都被封裝好了,不知道什么是類,對象,方法,面向對象,也能輕而易舉做軟件工程師了,呵呵,工程師以后不值錢嘍。
自己的一點感覺,胡侃一通,不知道合不合乎邏輯,在前面的blog里有朋友留言說"千萬別被普元忽悠了",哈哈,不知道那位兄弟的理由是什么,想多聽聽大家的意見,望廣留言,多謝多謝多謝!!!
<root>
<data>
<myEntity>
<myField1>1234</myField1>
<myField2>This is demo</myField2>
</myEntity>
</data>
</root>
例子2:EntityList的格式為
<root>
<data>
<list length=2>
<myEntity name="test1">
<myField1>1234</myField1>
<myField2>This is demo</myField2>
</myEntity>
<myEntity name="test2">
<myField1>2345</myField1>
<myField2>This is demo</myField2>
</myEntity>
<list>
</data>
</root>
通過Xpath來訪問數據,比如
/root/data /myEntity將訪問到例子1中的<myEntity>實體
/root/data/myEntity/ myField1 將訪問到例子1中的myField1,結果為1234
/root/data/list/myEntity[@name="test1"]將訪問例子2中的<myEntity name="test1"> 實體
/root/data/list/myEntity[@name="test1"]/myField1將訪問例子2中的myField1,值為1234
感覺看不到親切的java代碼很不爽,呵呵
然后練習自定義運算邏輯,這下自己寫類了呵呵,eos能夠由向導自動生成類和方法體,就像Myeclipse中新建struts的action一樣,發現eos的方法都是靜態的,都是返回一個int整型值,參數列表也都是Document doc, BizContext param,看起來只有方法名可以自定義了,呵呵!
之前說過普元這套東西都是用xml格式傳遞參數的,這里就是從param中獲取xml,然后拆解每個要用到的節點,來獲取傳入的參數,然后經過處理后把返回值再放到xml節點中,好費勁。
然后是handler,為了靈活的加入新的處理,可以在一個業務邏輯的前后加入多個handler,跟一般的過濾器寫法沒什么差別。
然后是jsp Tag自定義,也是繼承了javax.servlet.jsp.tagext.TagSupport,沒有普元的東西
再然后是復雜查詢,多表查詢,他是創建一個查詢實體,就是視圖啦
一天下來對普元EOS了解的多了些,它以方法為單位作為構成構件,以達到重用的目的,各個層之間以xml格式作為聯系,開發人員基本上已圖形化開發,不接觸底層技術,給程序員的門檻降低了(大學生就業更難了呵呵),開發系統開始工業化,把零件裝起來,螺絲擰上就OK了
可能經歷實際開發了,會有多一些不一樣的感觸吧
還是沒鬧明白難道這就是所謂SOA嗎???
公司要購進普元的EOS開發工具,組織為期5天的培訓
為了今天的培訓我把我的筆記本系統都重裝了,折騰了半天裝數據庫,裝EOS,裝EOS補丁,不知道干嘛不做一個集成了補丁的安裝包
安裝過程中要配置數據庫,要初始化數據庫,會向數據庫中自動建好多表,然后安裝成功后可以在服務控制臺管理。
首先做了個HelloWorld
界面就是這樣的
首先新建一個構件包(面向構件的開發嘛),每個構建包下有頁面構件page,展現邏輯構件pr,業務邏輯構件biz,數據邏輯構件data等等。
我的理解就是每個構件就相當于分層架構中的一層,page就是jsp頁面,pr是Struts的action,biz是spring的bean,data是hibernate的映射,普元在這之上又進行了封裝,以前我們在各個層之間傳遞數據通常由一個DTO數據傳遞對象,而普元在各個層用xml來傳遞,普元把普遍通用的實現邏輯處理都封裝成了構件,我們只要調用構件就行了。
之后又來了復雜點有刺激的,通過向導實現對一個單表的增刪改查,向導跟vs.net中的那個數據連接,數據適配器拖到頁面上選擇表,選擇字段,就自動生成了增刪改查,只是vs.net中可以看到生成的C#的代碼,而普元生成的只是一堆xml。
原來一天未必能完成的事,現在十分鐘做完,能傻瓜的都傻瓜了,真的也要下崗了。
哦,對了,這些和SOA怎么聯系上呢?