在本文還未涉及到客戶端驗證,在服務端也可做簡單驗證。在客戶端驗證并不保險。
@葛坤進
你說的服務端處理是什么意思,是指調用execute方法,還是指處理請求參數。struts1.x的調用過程是這樣的。
首先struts1.x會通過actionform對象裝載客戶端的請求參數,然后會調用actionform類的validate方法,最后會調用Action類的execute方法,這個過程無需爭辯,也不需要看struts1.x源代碼,誰做都會這么做的。 至于簡單驗證和復雜驗證,只是邏輯上區分一下。就算是客戶端的javascript,同樣可以通過ajax進行與數據庫相關的驗證。當然,非要在validate里進行數據庫驗證也沒有什么。不過一般ActionForm類里可直接訪問請求參數,因此,一般用于直接驗證請求參數的值是否合法。
@葛坤進
DAO?這篇文章只是演示如何使用Struts1.x,還沒上升到層次的概念。一個Helloworld是不需要使用任何設計模式的,那與本文的主旨不符。否則就成唯模式論了!
但愿本文能給想學習struts1.x的朋友帶來收獲!_^_
@aaa
你這異常是建立mystruts.actionform.ProductForm錯誤,你將ProductForm類放在哪了?
當客戶端不支持cookie是,就會使用url來傳遞sessionid,否則會直接用cookie來傳遞sessionid。
re: 銀河系列原創教程 銀河使者 2009-02-25 09:14
@膘叔
試了cyberarticle,總體來說不錯,不過不知怎么著,把我的空格都變成?了,暈。
@test
你是用myeclipse開發的嗎?那不太可能,struts1.x是否可成功發布?
@test
原因是你沒引用LinkedList,在程序前面加上import java.util.*;
我一般是手寫的,MyEclipse或jbuilder也許能自動生成services.xml,但我沒用過。
這些類應該放在WEB-INF\lib目錄或WEB-INF\classes目錄中,如果要在內部使用,直接調用就可以了,如果在外部使用(如發布成WebService),建議你使用spring來處理,這樣只要在aar文件中放一個services.xml就可以了,直接可以將spring的裝配bean發布成webservice。
你可以參考我的文章:
http://www.tkk7.com/nokiaguy/archive/2009/nokiaguy/archive/2009/02/13/254499.html
@zhuyongjp
被調用的類需要放在axis2目錄中的WEB-INF\lib目錄或WEB-INF\classes目錄中,這樣就可以調用了
哈哈,struts 1.x快發完了,完事統一做pdf
@zhy
是的,也可以是web根目錄。
<forward name="newProduct" path="/mystruts/newProduct.jsp" /> 這么不行嗎,<forward>沒有子元素。這么也可以的。這是xml的寫法,與struts沒關系。
如果用戶修改密碼或刪除用戶,可以在修改或刪除密碼后將session里的相關內容刪除,這樣客戶端必須要重新登錄才能繼續使用了。
@Alexwan
如果用戶修改密碼,可以在修改密碼后將session里的相關內容刪除,這樣客戶端必須要重新登錄才能繼續使用了。
@剛哥
你的那個是C++的算法,基本思路類型,都是數據結構講的,哈哈!!這些數據結構書上都有,看看就知道了!
@剛哥
這算法是很多年前寫的,現在看看寫成用變量定義數組了。估計是用Java用多了,不小心寫成Java格式的了。以前這些算法好象都調試過,可能是這個沒測試過。可能當初是寫的示意代碼。基本上都忘了細節了。^_^
不需要參數就是參數為0,用
<operation name="getPeopleInfo " mep="http://www.w3.org/2006/01/wsdl/in-out">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</operation>
啊,我很久以前寫的東西,一直沒發,現在發上了。現在仍然有很多人在使用struts1.x。
@wjywilliam
沒錯,可以通過invocation.getAction()獲得Action對象的屬性,但并不建議這么做,使用ValueStack接口的setValue和findValue方法更容易實現設置和獲得Action對象的屬性值的工作。
@123
運行不了可能是配置錯了,把錯誤信息和配置方法貼出來看看。Java的東西剛開始是誰都會為配置頭痛,慢慢就好了。
@這是一個好教程
這兩個jar可以到www.apache.org上的commons子項目上下載。這兩個文件是必須的。
re: 銀河系列原創教程 銀河使者 2009-02-10 19:03
可惜啊,現在blogjava還未提供做pdf的功能,有空放到我在javaeye的blog里做一下,哈哈
@1121
放到一起是在開發階段,發布了,就已經放到jar包中了。
@yapituy
這個我也試了,但客戶端也是未補獲AxisFault異常,我用java、c#和delphi試的客戶端,都未補獲AxisFault異常,不知axis2內部是如何處理的,也許是有bug,也許是服務端程序的設置問題,最終還沒解決,還是就是超時的問題,可能是axis2本身的問題。
用到其他的再加上,但makefile這些已經適合大多數程序了。
re: Struts2.1.6測試小記 銀河使者 2009-02-09 13:30
@zero
不用struts2的ajax也行,自己用其他的ajax framework,繞過struts 2。
struts 2分為兩部分,后端的攔截器,action等,以及前臺的struts 2標簽,這些標簽并不是必須的,也可直接用html表單。struts 2的標簽有時排版有些別扭,要想排好,還得了解struts 2中的模板。而且這些不能在象dreamweaver中設計。
re: Struts2.1.6測試小記 銀河使者 2009-02-09 12:43
如果用ajax,可以用其他的,如jquery,struts 2本身的ajax功能不太好用,也比較復雜。不知道struts 2中的ajax是自己做的,還是集成的。
這以前試的struts2.0.11有的只有ie里好使,firefox里不好使啊。ajax要實現真正的跨瀏覽器是很困難的
應該是有的,就象Spring-struts插件一樣。在applicationContext.xml中有一些裝配bean可以在一裝載applicationContext.xml文件時就被自動裝載。不過這樣的bean我還沒有實現過,只要在這些bean中可獲得application,應該是可行的。還有就是可以在action中檢查application是否存在該bean,如果不存在,就獲得bean,并保存。也可以在攔截器中做這樣的事,這樣就不耦合了。
@Hadis
你的意思是這個Bean通過DAO獲得,而這個DAO對象需要使用Spring獲得。并想在程序啟動時(這是指程序第一次運行的時候吧)通過Spring獲得該DAO對象,并通過DAO對象再從數據庫的某個表映射成一個Bean,然后將這個Bean對象保存在application。如果上這個意思,實現的方法很多。
如果想讓程序第一次運行之前就完成這個動作,可以使用Servlet監聽器,監聽域對象(application對象,實際上就是ServletContext對象)的創建和銷毀,要想監聽servletContext對象,需要實現ServletContextListener接口,在ServletContextListener接口的contextInitialized方法中通過Spring獲得DAO,再獲得Bean,這個方法在ServletContext對象創建之后立刻被調用。關于監聽器的細節請參閱相關的文檔吧!!!
re: Struts2.1.6測試小記 銀河使者 2009-02-07 22:24
@zero
試的哪個ajax特性
另外會話是可以持久化的,但不知axis2是如何處理的
不知你的用戶有多少,10000,還是20000,或更多,一個會話只占很小的內存。當然,除了使用會話解決你的問題外,還有另外一個方法可以達到同樣的效果。使用會話的目的是為了進行權限驗證,你可以為每一個web service方法都加上一個用戶名和密碼,可以將這些放到類中進行傳遞,這樣就不需要會話了,每次調用方法程序都從數據庫中驗證,你也可以定義一個靜態的Map對象在服務端來保存經常登錄的用戶名和密碼,這樣當這些用戶調用該方法時就不用再到數據庫中去驗證了。如博客園和blogjava所使用的msn writer寫blog,就是使用的MetaWebBlog API,這個API雖然不是Web Service(只是一個遠程方法調用),但使用的就是我說的第二種方法,每一方法都有一個用戶名和密碼。你看看這些方法就知道了:
http://www.cnblogs.com/nokiaguy/services/metaweblog.aspx
這是application級別的,只有服務器重啟或重新發布應用程序會話才會消失。而其他級別的我試了一下,并不能跨服務共享會話。
re: Struts2.1.6測試小記 銀河使者 2009-02-06 18:20
@隔葉黃鶯
是的,如果通過配置文件來實現多個方法,可以通過url的方式來實現(使用!),也可以在<action>元素中使用method屬性來配置。
但使用注釋還沒有試過是否可以使用這種方式。
@々上善若水々
就是傳送二進制(字節流),至于字節流里是什么,完全由用戶自己定義,當然可以是文件夾里的內容,而且都自己實現還是個好處,可以實現斷點上傳功能。甚至是多線程上傳。在服務端利用Servlet就可以實現。
要是在客戶端直接用java編寫程序上傳文件,直接用tcp傳二進制流就可以(當然,這要服務端也是自己實現),模擬http上傳效率有些低。
@zb
你用wsdl2java試一下就知道了,wsdl2java的用法見《WebService大講堂之Axis2(1):用POJO實現0配置的WebService》
如果是字節,wsdl2java會使用DataHandler類型處理,詳見我的第四篇關于axis2的文章:
http://www.tkk7.com/nokiaguy/archive/2009/02/archive/2009/01/archive/2009/01/22/252305.html
@robin
data.DataForm這個類在使用wsdl2java命令生成客戶端的stub類時已自動生成了。我們只要使用就可以了,在內部,axis2會將data.DataForm轉換成基于soap協議的請求和響應消息。這個我們一般不用去管他。就直接將data.DataForm當成本地的類使用即可。不過要注意,不能自己在本地建立個與data.DataForm的內容一樣的類,stub只能使用自己生成的類。你可以看一下stub代碼。
對于本文并未直接使用wsdl2java生成stub代碼,是使用的RPC調用方式,對于這種方式,只要直接將服務端的data.DataForm復制給客戶端即可。客戶端的data.DataForm類就是服務端的data.DataForm類,只要將data.DataForm類同客戶端一定發布即可。
你如果用過c#就會看到也是自動生成了相應的data.DataForm類。
re: 令我頭疼的JSP亂碼問題 銀河使者 2009-02-03 14:50
還有就是URLEncoding=是處理服務端接收客戶數據時的亂碼的,這與頁面顯示亂碼無關。
re: 令我頭疼的JSP亂碼問題 銀河使者 2009-02-03 14:49
AL32UTF8和UTF8類似,只是高級的UTF-8,這不用轉換
你先看看頁面上編碼的設置是否為UTF-8,還有就是看一下頁面的源代碼,用記事本打開,看盾能否正常顯示。從數據庫中取出的是UTF-8編碼的字符,如果頁面出現亂碼,有可能是使用了其他的編碼方式進行了解碼。還是有就是看看你的web程序是不是什么地方用了GBK處理了。在發送到客戶端之前就成亂碼了。如response.setCharacter(...),或使用其他的方法處理的。
re: 感謝死亡 銀河使者 2009-02-01 09:42
以前看過一個美劇“星際之門:亞特蘭蒂斯”,劇中的亞特蘭蒂斯人擁有高度的文明。在他們的時代,正在研究一種可以使人永遠不死的方法,這種方法就是使生命脫離脆弱的肉體,相當于靈魂出殼,亞特蘭蒂斯人管這種技術叫“升天”,使生命以純能量的形式存在。但這種技術并不穩定,有時會失敗,使人永遠消失。 雖然這是科幻,不過科學總是在發展,未來總是充滿不確定性。也許處在遙遠未來的人類會成為這劇中的亞特蘭蒂斯人,完成亞特蘭蒂斯人未完成的事業。說到這,突然想起安徒生位于丹麥首都哥本哈根的墓志銘上寫的那樣“雖然我的肉體死亡了,但我的靈魂將得到永生”。
最后祝人類一路走好,happy new year!
re: JDBC查詢動態封裝 銀河使者 2009-01-31 21:05
@ cccp21
在使用ResultSet時當然不能關閉Connection,不知道你為什么會在使用ResultSet之間關閉Connection,這個Connection是共享的?還是用的什么其他方式。為了提高效率,可以使用連接池,一般每個Connection都是線程獨享的,用完了再還給連接池。以上只針對Web應用,如果是桌面引用,建議使用Web Service方式。
如果想關閉ResultSet方便些,可以使用jdbc+spring的方式,也就是jdbcTemplate,這個很方便。基本原理是從連接池中獲得一個Connection,執行一條或多條SQL語句,返回結果(這個結果也是封裝的,和你的方法差不多,但考慮了異常處理),在返回結果之前,Connection就已經關閉了,關閉的動作是由Spring自動完成的。 而對于用戶來說,只是調用了JdbcTemplate的一個方法來獲得查詢結果。再也不用考慮什么Connection、ResultSet,另人討厭。不過對于小程序,用什么都行,我還是喜歡直接用jdbc,對于大一點的程序,尤其對Web程序,個人認為用jdbc +Spring比較好,如果想更高級一些,還跨數據庫,可以使用hibernate+spring的方式。
re: 跳出多層循環的簡單方法(Java版) 銀河使者 2009-01-30 19:33
@Robin's Java World
我試了,的確不可以,就象java的const關鍵字,也不能使用,雖然是保留字。如果你有可以的例子,貼了來,讓我也學習一下。
re: 跳出多層循環的簡單方法(Java版) 銀河使者 2009-01-30 19:27
象下面的程序可以嗎?
String[] arr = new String[]{"a", "b", "c"};
for(String s: arr)
{
for(String ss: arr)
{
for(String sss: arr)
{
System.out.print(sss);
goto labelA;
}
}
}
labelA:
不行啊,