|
2007年10月9日
用戶 A 寫道: 我從實用的角度上來說 **** 框架/技術是相當爛的一個東西. 從理論上也許先進. 用戶 B 反駁道: 我不喜歡聽沒有證據的東西。不知道你指的"**** 是相當爛的一個東西"什么意思?不知道你使用****有多久?是做了具體的項目體會出來它很爛還是玩了半天就覺得它爛?能不能舉出具體的例子? 我認為 **** 很棒,因為這是我在做項目和學習的過程中體會到的。 國外有很多牛人都認為 ****很棒,牛人 XXX 從????年就已經在他的項目中使用了自己的****架構,至今有很多大型的項目都在使用這個****架構。**** 在此之上做了很多的改進,總結了框架 A 和框架 B 的不足,是經過很多考驗和實踐總結的成果,希望大家不要只花了半天時間就把它否定掉。 把 **** 替換成不同的框架/技術, 這就是當前技術推廣貼的一貫文風.  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/05/158295.html
Welcome to the home of the Spring Framework, the leading full-stack Java/JEE application framework. Led and sustained by Interface21, Spring delivers significant benefits for many projects, increasing development productivity and runtime performance while improving test coverage and application quality. Submitted by Nicole Konicki on Tue, 2007-10-30 10:38. Technical Article In this TSS article, Rod Johnson explains what Spring sets out to achieve and how it can help the community develop enterprise Java applications. Submitted by Colin Sampaleanu on Thu, 2007-11-01 16:00. News and Announcements Interface21 is pleased to offer a number of Spring Framework 2.0 and AOP training events in the upcoming period, delivered by the people who build and sustain the Spring Framework. For full details, please visit the main training information page. Here is a summary of some of the upcoming courses and venues: - North America
- Core Spring: November 6th - 9th, New York, NY
- Core Spring: November 13th - 16th, Dallas, TX
- Core Spring: November 27th - 30th, Washington, DC
- Core Spring: December 4th - 7th, San Diego, CA
- Core Spring: December 17th - 20th, Washington, DC
- Core Spring: December 17th - 20th, Boston, MA
- Core Spring: January 8th - 11th, Orlando, FL
- Core Spring: January 15th - 18th, Chicago, IL
- Core Spring: January 22nd - 25th, Seattle, WA
- Core Spring: January 29th - Feb 1st, Washington, DC (Dulles)
- Europe
- Core Spring: November 5th - 8th, Oslo, Norway
- Core Spring: November 6th - 9th, Paris, France
- Core AOP: November 15th - 16th, Malmo, Sweden
- Core Spring: November 20th - 23rd, Stuttgard, Germany
- Core Spring: November 20th - 23rd, Amsterdam, Netherlands
- Core Web Services: November 26th - 27th, Amsterdam, Netherlands
- Core Spring: November 27th - 30th, Copenhagen, Denmark
- Core AOP: December 6th - 7th, London, UK
- Core Spring: December 11th - 14th, London, UK
- Core Spring: January 15th - 18th, London, UK
- Australia/Asia/Other
- Core Spring: November 5th - 8th, Brisbane, Australia
- Core Spring: November 5th - 8th, New Delhi, India
- Core Spring: November 19th - 22nd, Bangalore, India
- Core Spring: November 20th - 23rd, Cheng Du, China
- Core Spring: December 3rd - 6th, Sydney, Australia
- Core Spring: December 10th - 13th, Melbourne, Australia
- Core Spring: December 18th - 21st, Dalian, China
... plus others Interested in a full-course of Spring during Winter? The Spring Experience 2007 conference is taking place in sunny Hollywood, Florida, from Dec. 12th-15th.
| 今天去 http://www.springframework.org/ 看了一眼, 很不幸的首頁充斥了培訓信息, 還有在中國的... 其實 Spring 的法律上的版權所有者: Interface21 公司, 是有他們自己的網站的. 不過, 開源軟件不等于放棄版權, 這個大家一定要清楚啊. 讓一個 .org 的網站充滿了這樣的信息, 真是一種悲哀. 錢, 錢, 錢....  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/06/158490.html
摘要: MyEclipse 自帶的 Hibernate 和 Spring 教程(含視頻)翻譯, 內容包括: 簡介 建議的聽眾 系統需求 開始工作 反向工程 編寫和運行 Hibernate 整合 Spring 代碼 小結 常見問題 FAQ 資源 反饋
閱讀全文 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/07/158875.html
原創講解JSP過濾器和監聽器
BeanSoft(劉長炯) 2007年11月
關于這個問題, 比較復雜的說. 不過我希望通過例子來解釋會方便理解一些.
假設有一個非常危險的任務, 是九死一生. 需要你揣著炸藥包從北平開車走高速路過保定去石家莊把鬼子的碉堡給炸了. 注意: 這個任務十分艱巨, 有可能半路炸藥爆炸. 所以出發前你需要苦練10元一本的<<鐵布衫>>, 還需要立遺囑交代一下后事. 下面是路線圖: 去時路線: 北平 ==> 高速路收費站入口(都有警察和警犬) A? ==> 保定收費站 B ==> 石家莊收費站 C ==> 炸碉堡 D ==> 轉車(剛才的車已經炸沒了) E => 回來路線: 石家莊收費站 ==> 保定收費站 ==> 高速路收費站出口(都有警察和警犬) A ==> 安全回到北平 G
那么我們先簡介可能發生的情況.? A 點有可能被警察和警犬發現, 所以你只能被扭送回北平.? 即使不被發現, 還可能出現收費時發現10個現大洋一個路口的買路錢沒帶!! 哎, 只能又回去了. 還有最慘的: 高速路入口寫著: 對不起, 到石家莊的路線因為施工不通! 只好回家等著吧. 到了B和C你可能還會被人發現帶了炸藥包, 或者發現買路費少帶了! 極有可能又被扭送回北平, 注意已經在半道了, 是不會讓你繼續到石家莊的, 所以你會被從車上逮下來, 然后轉到警車上帶回來!? 也就是從 B 或者 C 直接返回. 好了, 最佳情況就是你炸了碉堡, 也成功的返回了. 然后你可以開心的把<<鐵布衫>>扔了, 然后宣告遺囑作廢.
OK, 以上過程, 就是過濾器和監聽器的真實案例.
那么炸碉堡這個任務, 就相當于要調用 JSP 或者 Servlet 來獲得執行結果(炸碉堡 D ).? 在執行之前你需要做一些準備工作, 相當于要寫一個 監聽器 com.allanlxf.ums.web.ServiceListener 在里面你可以做一些事情例如初始化資源, 例如上文的苦練<<鐵布衫>>, 立遺囑, 這個相當于代碼中的 public void contextInitialized(ServletContextEvent sce) 這樣一個初始化事件. 那么在整個任務完成之后, 這些事情你就要考慮應該作廢了, 所以需要 public void contextDestroyed(ServletContextEvent sce) 這樣一個銷毀事件, 例如把<<鐵布衫>>扔了, 然后宣告遺囑作廢, 也就是收回資源.
那么過濾器在哪里呢? 它位于任務的 A B C 點. 注意是雙向路程都會經過的. 也就是請求和響應都會經過. 但是過濾器也會檢查不同的情況, 例如 A 點實際上有兩個過濾功能: 查炸藥包和收買路錢. 這就相當于配置了: ?? ?????? sessionFilter ???? * *.do ???? * REQUEST ???? * FORWARD ?? ? 兩個過濾功能都要檢查. 如果成功了怎么辦呢? 會繼續讓你走下一個路口, 注意不是讓你直接成功. 也就是代碼: ??????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經登錄并且當前路徑仍然停留在登錄頁面????? {??????????? ?????????? chain.doFilter(request, response);//繼續走下面的過濾器或者任務(不保證最終任務, 因為下個過濾器也可能讓你回來) ?????????? 只有當走到 C 點的時候, 下一步才是執行了最終的任務: 執行JSP或者Servlet. ?????? } 反過來怎么辦? 把你扭送上警車, 強行返回! 這樣你連路口 B C 和最終任務都無法訪問了. 也就是不會讓你訪問下一個過濾器和執行最終的 JSP 或者 Serlvet, 可以選擇直接返回, 或者放警車上帶回去. ?????? { ?????????? return;// 直接返回 ?????????? 或者 response.sendRedirect(request.getContextPath() + "/login.jsp");//則扭送上警車, 強行返回到警察局 ?????? }
那么在 E 點發生了什么? 也就是你可能替換掉了原來的 response 對象,? 也就是換車. 這意味著你可以在過濾器里私下修改請求和響應對象.
雖然已經不那么抽象了, 但是要理解可能還是需要耐心體會的.
===================================================================== 注: 原始問題
??? 1.請看下面一段代碼和其注釋: import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class SessionFilter extends HttpFilter
{
?? public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
?????????????? throws ServletException, IOException
?? {
?????? String path = request.getServletPath();//取得該servlet的路徑名稱
?????? path = path.substring(0, path.indexOf("."));?? //獲得路徑中.之前的部分
?????? HttpSession session = request.getSession();//從請求中取得session為得是從session中讀取用戶是否登錄的標志值
?????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經登錄并且當前路徑仍然停留在登錄頁面
?????? {???????????
???????? *? chain.doFilter(request, response);//則將當前濾鏡加入到濾鏡鏈條當中
?????? }else//若用戶尚未成功登錄
?????? {
?????????? response.sendRedirect(request.getContextPath() + "/login.jsp");//則使用請求重定向轉到登錄頁面
?????? }???????
?? }
}
/*
* 該Filter濾鏡類所過濾的是用戶在瀏覽器中輸入的
* 當前web application的訪問路徑,通過判斷用戶是
* 否成功登錄而決定是否對訪問路徑加以限止
* 在該web application的web.xml配置文件中為
* 該filte濾鏡做了相應配置
*/
請問: 上面代碼FilterChain對象盛裝的是Filter對象, 可它是怎么工作的啊? 加*號的語句是何用意啊,不是過濾路徑嗎, 為什么要將請求與響應加入呢?
2.請看下面一段代碼:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public abstract class HttpFilter implements Filter
{
?? private FilterConfig config;
?? public void init(FilterConfig config) throws ServletException
?? {
?????? this.config = config;
?????? init();
?? }
?? public void init() throws ServletException
?? {
?? }
?? public String getInitParameter(String name)
?? {
?????? return config.getInitParameter(name);
?? }
?? public ServletContext getServletContext()
?? {
?????? return config.getServletContext();
?? }
?? public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
?????????????? throws ServletException, IOException
?? {
?????? doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);
?? }
?? public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
?????????????? throws ServletException, IOException;
?? public void destroy()
?? {
?? }
}
請問: 該類就這樣寫了一下,沒有包含任何行為,它如何完成過濾工作啊?
3.請看下面代碼: package com.allanlxf.ums.web;
import javax.servlet.*;
//import javax.servlet.http.*;
import com.allanlxf.ums.service.SystemService;
import com.allanlxf.ums.service.StudentService;
public class ServiceListener implements ServletContextListener
{
?? public void contextInitialized(ServletContextEvent sce)
?? {
?????? ServletContext application = sce.getServletContext();
?????? StudentService service = new StudentService();
?????? application.setAttribute("studentService", service);
?????? SystemService systemService = new SystemService();
?????? application.setAttribute("systemService", systemService);
?? }
?? public void contextDestroyed(ServletContextEvent sce)
?? {
?? }
}
/*
*本類是該web application的監聽器類,在該類中,
*將兩個無為本系統提供服務的兩個對象寫入到了
*application隱含對象中(這樣保證在該系統的任何
*地方都能夠取得這兩個服務類對象的引用)
*在本系統的web.xml文件中對該監聽器做了配置
*/
請問: 為什么要將服務類對象寫入到程序上下文中呢,直接創建不也一樣嗎? ???? 監聽器只有這樣的功能嗎,是否還有其它功能呢?
3.請看下面的配置文件內容:
?? ?????? sessionFilter ?????? com.allanlxf.ums.web.SessionFilter ?? ??? ?? ?????? sessionFilter ???? * *.do ???? * REQUEST ???? * FORWARD ?? ??????? ?? ?????? com.allanlxf.ums.web.ServiceListener ???
請問: 加*號的三項是什么意思?
當初老師講的時候,許多基本的原則原理尚不清楚,這些根本沒有聽明白,當然,老師也未細講,只說會用即可, 可是若不能明白其本質,用也只能用這一點兒, 怎么成呢, 希望您能夠比較詳悉的講一下. thank you very much!
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/09/159374.html
MyEclipse 6 實戰開發講解視頻入門 6 Web 入門開發 - JSP/HTML/JDBC 登錄 本視頻介紹了開發中最難而又最容易被輕視的部分: JSP, 部分是因為很多人過分夸大了 Web 層框架例如 Struts 1 or 2, Spring MVC, JSF, Wichet 等等的作用(事實上對于編寫復雜的頁面, 這些框架都沒多大幫助). JSP 是表現層, 實際上不是那么容易做好的, 因為它綜合了 Web 層的幾乎所有技術, 包括但不限于 DHTML, JavaScript, CSS, AJAX, 緩存等. 友情提示: 下載微軟網盤文件時關閉下載工具, 否則你將得到錯誤的文件, 雙擊 EXE 會出來 DOS 窗口. 正確操作是點擊文件名后能看到顯示下載鏈接和文件大小等信息. 代碼: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/6_JSPHelloWorld.zip 445KB 視頻(第一部分): http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_6_1.exe 22分05秒 8.20MB 視頻(第二部分): http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_6_2.exe 40分26秒 10.5 MB 1. 新建 Web 項目 2. 編寫首頁,登錄提交表單頁面并加入客戶端表單驗證 JavaScript, 超鏈接CSS 3. 編寫后臺 Java 類 - 業務層(Biz Layer)和數據層(DAO) 4. 編寫 JSP, 加入必要的驗證并調用后臺業務類 5. 測試運行, 驗證登錄和退出 6. SQL 注入: 用戶輸入名字為 user' or '1' = '1 拼出的攻擊SQL為: select * from myuser where user = 'user' or '1' = '1' and password = 'abc' 視頻截圖:

 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/19/161502.html
因為本項目已經停止更新, 僅提供代碼供參考, 本人保持版權, 不提供任何擔保和技術支持. 附帶用戶貢獻排行, 頁面點擊率等多個插件. Eclipse 項目文件(兩個都在才能編譯運行) JSPWiki 項目改進版 http://beansoft.java-cn.org/download/JSPWiki2.4.71_project_src.7z 5.91 MB 插件及中文模版增強文件 http://beansoft.java-cn.org/download/JSPWikiPlugins_project_src.7z 3.11 MB 下載, 導入, 編譯及數據庫配置, 運行視頻(無聲) http://beansoft.java-cn.org/download/jspwiki_beansoft.exe 3.0 MB 環境: JDK 1.5, Eclipse 3.3, Tomcat 6.0.14, Mysql 5.0, Windows XP 圖解發布過程 真實操作以視頻為準. 
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/20/161836.html
今天首頁看到一篇文章, 說了國人詆毀嫦娥一號的事. 也沒什么好說的, 怨天尤人是不對. 然后在上面點, 就看到了另外的一篇新聞: 奴隸般勞動,日本工會幫中國女工維權 http://news.qq.com/a/20071122/001583.htm 也許大家的忘性很大, 已經忘記了黑窯廠等等, 忘了北京方圓百里就是沒有任何現代氣息的城鄉結合部, 忘了苦苦掙扎在老家的農村的鄉親們, 忘了在溫州, 深圳打工的人. 當然, 我也是打工一員, 吃飽是沒問題, 可是也就僅此而已. 聰明人很多, 但是多數人卻很窮, 是大家不努力工作嘛? 不是. 那是什么呢? 這篇文章中日本工會的組織者說的一段話發人深思: “她們都是善良而誠實的勞動者,為了家族的責任,來到日本,決心努力勞動3年,卻在這里遭受了奴隸般的勞動生活,這是不公正的。構成社會的大部分成員都是普通勞動者,她們的權利和生活得不到保障的話,還談什么‘發展’?財富集中在一小部分人身上的時候,談‘發展’就是一種欺騙。 ” 2007年11月4日,日本廣島東部福山市的工會領袖武藤貢回復了這樣一封郵件給記者。半年多前,在他的幫助下,3名中國女工李紅慧、沈曉梅、繆秀琴與她們的日本雇主展開了長達一個多月的激烈斗爭,并成功拿回了自己應得的400多萬日元,回到她們位于蘇北農村的故鄉。..... 再摘一段人民網貼的內容: 書摘:1949年以后的蔣經國與臺灣 http://www.people.com.cn/GB/wenhua/1086/2078201.html 最近十年在臺灣任何一個有關"誰對臺灣貢獻最大"的民意調查里,蔣經國始終穩居首位。1960年代,臺灣經濟穩定累積成長,在有力的政治與社會條件中,技術官僚得以發揮最大的才干,加上國際資本和技術幾次轉移,臺灣成為有效率的接納者。到了1960年代末期,赤貧人口大幅降低,許多臺灣大學生畢業后就往美國跑,人民的生活已達小康的水平,唱歌、跳舞、打保齡球的娛樂活動如雨后春筍。如果說美國人努力影響蔣經國的看法,他們顯然沒有白費功夫,蔣經國幾次訪問美國,眼見美國生產力的強大,印象十分深刻。美國式的管理不是從上而下的教育和指令,而是法治文化中的契約精神,在這種遵守公共約定的自覺中,人人追求創新,力爭上游。這種現象對于一向習慣于蘇聯式思辨的蔣經國而言,確實耳目一新。此外,最具說服力的仍然是發展的事實本身,在美國受教育的知識菁英開始發揮影響力,他們根據所學結合臺灣的情形所制定的發展方案,確實行之有效,使得人民生活大幅改善,社會財富累積迅速。這樣的成果使得任何人都不得不重視美式管理背后的思維邏輯,一開始是經濟的,接著便是政治的。 全中國的人民, 向60年代的臺灣邁進吧! 我最希望的就是家鄉能早日出現 IT 業, 這樣我就不用背井離鄉了, 呵呵.  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/22/162489.html
這是 MyEclipse 幫助文檔中的內容的翻譯, 點擊菜單 Help -> Contents 可以看到 MyEclipse 的全部英文幫助文檔. 在線閱讀(完整內容含 Flash 動畫): http://beansoft.java-cn.org/myeclipse_doc_cn/ajaxtutorial/ 下載: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse中文文檔/ajaxtutorial.zip 1.53 MB 友情提示: 下載微軟網盤文件時關閉下載工具, 否則你將得到錯誤的文件, 雙擊 EXE 會出來 DOS 窗口. 正確操作是點擊文件名后能看到顯示下載鏈接和文件大小等信息. 翻譯: 劉長炯 BeanSoft@126.com Blog: http://www.aygfsteel.com/beansoft/ 日期: 2007-11-22 聲明: 中文文字版權歸 劉長炯 所有, 原文及相關的圖片等資源的版權歸原作者 Genuitec L.L.C 公司所有. 目錄 - 簡介
- 建議的聽眾
- 系統需求
- AJAX Debugging
- 小結
- 常見問題 FAQ
- 資源
- 反饋
本人原創 MyEclipse 6 幫助文檔中文版集中下載 http://cid-519b3f7aa2172030.skydrive.live.com/browse.aspx/Public/MyEclipse中文文檔  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/22/162498.html
近日看到各大中文網站紛紛嗆聲說 Spring 2.5 發布, 典型消息如下: 來自 Springframework 官方的消息,Spring 2.5 正式發布了。 http://www.springframework.org/node/561 該版本的主要特征包括: 對Spring2.0的平滑升級 —— Spring2.5被設計成為對Spring2.0的平滑升級,現存的代碼和配置文件不需要做任何更改。 更多XML命名空間配置 —— 新的命名空間包括和 完全支持Java 6和Java EE 5 —— Spring2.5支持Java 6和Java EE 5的所有新特性——同時也提供了對Java 1.4.2和J2EE1.3的支持。 完全支持基于注解的配置 —— 現在所有的配置都可以使用注解來實現,并且也支持 JSR250 注解。 基于注解的MVC controller —— Web Controller現在可以用如@RequestMapping這樣的注解來創建,無需實現任何接口。 對AspectJ的支持 —— 在一些環境下,增加了對AspectJ的裝載時編織支持,同時提供了一個新的bean切入點。 對OSGi的支持 —— Spring2.5框架的所有jar包都是兼容于OSGi的,以此來簡化在OSGi環境下對其的使用。 測試框架的巨大改變 —— 現在新的基于注解的測試框架已經支持TestNG和JUnit4 性能的改良 —— Spring2.5各方面的性能指標都有了顯著的改善。 沖著 完全支持基于注解的配置 這句話, 我興沖沖的下載了 Spring 2.5 以及其文檔, 企圖體驗一下 EJB 3 式的簡單快速的基于標注的開發, 然而, 遺憾的是官方文檔和消息的來源頁面: http://www.springframework.org/node/561, 沒有任何文字說到自己完全支持基于注解的配置. 我打開英文的 Reference, 仔細閱讀其中關于標注的部分, 然而遺憾的發現只是部分實現了標注, 請參考 http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-annotation-config , 簡單說就是實現了對 Autowired 和 Transaction, AOP 的標注支持, 而不是所有 bean 定義, 更不是說從此你可以不用寫 Bean 配置的 XML 文件了. 下午仔細試了半天, 企圖寫出標注配置的例子來, 也沒有成功實現不寫 bean 定義 XML 文件就能初始化 Bean 并注入所有屬性的功能(本來想做的例子是注入一個 message 的 String 屬性), 去閱讀下載的示例代碼(example目錄下的文件), 也沒有這樣的例子. 最后又發現了原來支持標注的版本在這里: http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a 它的名字叫 Spring JavaConfig. 最后我們再來看看原始頁面是如何介紹自己的標注的(http://www.springframework.org/node/561): Spring 2.5 enhances Spring 2.0 with many exciting new features, including: Full Java 6 and Java EE 5 support (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0) Full-featured annotation-driven dependency injection, including support for 'qualifiers' (注意這里只是說完整支持標注驅動的依賴注入, 而不是 complete supported annotation of all features) Support for auto-detecting application components in the classpath and auto-configuring them as Spring managed objects A new bean name pointcut element in AspectJ pointcut expressions Built-in support for AspectJ load-time weaving based on the LoadTimeWeaver abstraction New XML configuration namespaces "context" and "jms", for maximum convenience A completely revised integration test framework, with first-class support for JUnit 4 and TestNG A new annotation-based controller model for Spring MVC supporting Servlet and Portlet environments Extended SimpleJdbcTemplate functionality, including support for named SQL parameters Officially certified WebSphere support The packaging of Spring Framework jars as OSGi-compliant bundles out of the box The ability to deploy a Spring ApplicationContext as a JCA RAR file, for headless application modules JCA 1.5 message endpoint management, for Spring-managed JMS and CCI message listeners 小小的興奮了一把, 最后又不得不歸于失望, 繼續研究 XML 文件的編寫格式吧. 希望下次看到類似消息的時候能翻譯的準確一些, 免得誤導偶等開源軟件"消費者". 當然了, 也歡迎 Spring 2.5 高人們向偶分享完全使用標注的例子代碼, 那樣的話我真是太感謝了!  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/23/162700.html
這是 MyEclipse 幫助文檔中的內容的翻譯, 點擊菜單 Help -> Contents 可以看到 MyEclipse 的全部英文幫助文檔. 在線閱讀(完整內容含 Flash 動畫): http://beansoft.java-cn.org/myeclipse_doc_cn/springintroduction/ 下載: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse中文文檔/MyEclipse Spring 快速入門.zip 2.31MB 友情提示: 下載微軟網盤文件時關閉下載工具, 否則你將得到錯誤的文件, 雙擊 EXE 會出來 DOS 窗口. 正確操作是點擊文件名后能看到顯示下載鏈接和文件大小等信息. MyEclipse Spring 入門教程 翻譯: 劉長炯 BeanSoft@126.com Blog: http://www.aygfsteel.com/beansoft/ 日期: 2007-11-26 聲明: 中文文字版權歸 劉長炯 所有, 原文及相關的圖片等資源的版權歸原作者 Genuitec L.L.C 公司所有. 目錄 - 簡介
- 建議的聽眾
- 系統需求
- Spring 介紹
- 開始工作
- 可視化項目
- 理解和運行代碼
- 修改項目
- 小結
- FAQ
- 資源
- 反饋
本人原創 MyEclipse 6 幫助文檔中文版集中下載 http://cid-519b3f7aa2172030.skydrive.live.com/browse.aspx/Public/MyEclipse中文文檔  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/27/163416.html
MyEclipse 6 實戰開發講解視頻入門 8 XFire Web Service 入門開發 本視頻根據 MyEclipse 幫助文檔制作的對應的視頻. 友情提示: 下載微軟網盤文件時關閉下載工具, 否則你將得到錯誤的文件, 雙擊 EXE 會出來 DOS 窗口. 正確操作是點擊文件名后能看到顯示下載鏈接和文件大小等信息. 代碼:http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/8_WebService.zip 29 KB 視頻: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/myeclipse6_8.exe 19分16秒 7.4 MB - 簡介 MyEclipse on XFire 1.2
- 創建 Web Service Project
- 開發簡單的 Web Service
- 發布運行項目, 顯示 WSDL
- 用 Web Service Explorer 測試
- 編寫基于 XFire API 的客戶端并運行測試
- 新建單獨的 Web Service 客戶端項目
- 根據 WSDL 和 JAXB 生成客戶端代碼
- 調用客戶端代碼并運行測試代碼
視頻截圖: 
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/29/163907.html
本視頻根據自己翻譯的 MyEclipse 官方教材制作了對應的視頻, 視頻具體內容請參考 MyEclipse JSF 快速入門中文版. 友情提示: 下載微軟網盤文件時關閉下載工具, 否則你將得到錯誤的文件, 雙擊 EXE 會出來 DOS 窗口. 正確操作是點擊文件名后能看到顯示下載鏈接和文件大小等信息. 代碼: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/9_JSFLoginDemo.zip 9 KB 視頻: http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/myeclipse6_9.exe 15分31秒 6.6 MB 內容包括: 1.新建 Web Project 2. 添加 JSF 功能 3. 創建 Message Bundle 4. 創建 Managed Bean 5. 創建 userLogin.jsp 6. 創建 userLoginSuccess.jsp 7. 創建 導航規則 8. 發布并測試 9. 加入中文消息包 10. 測試 視頻截圖: 
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/30/164166.html
研究了很久新出的 Spring 2.5, 總算大致明白了如何用標注定義 Bean, 但是如何定義和注入類型為 java.lang.String 的 bean 仍然未解決, 希望得到高人幫助. 總的來看 Java EE 5 的標注開發方式開來是得到了大家的認可了. @Service 相當于定義 bean, 自動根據 bean 的類名生成一個首字母小寫的 bean @Autowired 則是自動注入依賴的類, 它會在類路徑中找成員對應的類/接口的實現類, 如果找到多個, 需要用 @Qualifier("chineseMan") 來指定對應的 bean 的 ID.
一定程度上大大簡化了代碼的編寫, 例如一對一的 bean 映射現在完全不需要寫任何額外的 bean 定義了.
下面是代碼的運行結果: man.sayHello()=抽你丫的 SimpleMan said: Hi org.example.EnglishMan@12bcd4b said: Fuck you! 代碼: beans.xml <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
<context:component-scan base-package="org.example"/>
</beans>
測試類:
import org.example.IMan; import org.example.SimpleMan; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan"); System.out.println(dao.hello()); IMan man = (IMan) ctx.getBean("usMan"); System.out.println(man.sayHello()); } }
自動探測和注入bean的類:
package org.example;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service;
@Service public class SimpleMan { // 自動注入名稱為 Man 的 Bean @Autowired(required = false) @Qualifier("chineseMan") //@Qualifier("usMan") private IMan man; /** * @return the man */ public IMan getMan() { return man; }
/** * @param man the man to set */ public void setMan(IMan man) { this.man = man; }
public String hello() { System.out.println("man.sayHello()=" + man.sayHello()); return "SimpleMan said: Hi"; } }
一個接口和兩個實現類:
package org.example;
/** * 抽象的人接口. * @author BeanSoft * @version 1.0 */ public interface IMan { /** * 打招呼的抽象定義. * @return 招呼的內容字符串 */ public String sayHello(); }
package org.example;
import org.springframework.stereotype.Service;
/** * 中國人的實現. * @author BeanSoft */ @Service public class ChineseMan implements IMan {
public String sayHello() { return "抽你丫的"; }
}
package org.example;
import org.springframework.stereotype.Service;
/** * @author BeanSoft * 美國大兵 */ @Service("usMan") // 這里定義了一個 id 為 usMan 的 Bean, 標注里面的屬性是 bean 的 id public class EnglishMan implements IMan {
public String sayHello() { return this + " said: Fuck you!"; }
}

文章來源: http://www.aygfsteel.com/beansoft/archive/2007/11/30/164230.html
這個分頁代碼基于 JDBC 2.0 的滾動游標的機制, 核心觀念就是利用 ResultSet 類里面的 boolean absolute( int row ) throws SQLException 方法進行數據的跳轉. 經過測試(數據小于1萬條, SQL Server 2000), 這個方法比用復合 SQL 語句查詢分頁的方案要快很多. 詳細 JavaDoc 如下: Moves the cursor to the given row number in this ResultSet object. If the row number is positive, the cursor moves to the given row number with respect to the beginning of the result set. The first row is row 1, the second is row 2, and so on. If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method absolute(-2) moves the cursor to the next-to-last row, and so on. An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first row or after the last row. Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last(). Parameters: row the number of the row to which the cursor should move. A positive number indicates the row number counting from the beginning of the result set; a negative number indicates the row number counting from the end of the result set Returns: true if the cursor is on the result set; false otherwise Throws: SQLException if a database access error occurs, or the result set type is TYPE_FORWARD_ONLY @since 1.2 /*
* @(#)Pager.java 1.00 2004-8-12
*
* Copyright 2004 . All rights reserved.
* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;
/**
* Pager, 基于 JDBC 2.0 滾動機制的分頁程序, 在 MySQL, SQLServer, Access, Oracle 下測試通過.
* @author 劉長炯
* @version 1.0 2004-8-12
*/
public class Pager {
/** Used database connection */
Connection conn = null;
public Pager() {
}
/**
* 分頁功能, 返回當頁的數據(JDBC 2.0 實現).
*
* @param currentPage
* 當前頁面數(取值范圍: 從 1 開始有效, 0 自動改為 1)
* @param pageCount
* 每頁顯示記錄數
*
* @return a Vector - 數據列表
*/
public Vector pageData(int currentPage, int pageCount) {
Vector results = new Vector();
String tableName = "table_name";// 要處理的表格名
ResultSet rs = null;
String sql = "SELECT * FROM " + tableName;
Statement stmt = null;
try {
// TODO: open connection
// 生成可滾動的結果集表達式
stmt = conn.createStatement(ResultSet.
TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery(sql);
int count = recordCount(); // 總記錄數
int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 總頁面數
if (currentPage <= 0) {
currentPage = 1;
}
// 超出頁碼范圍, 不返回數據
if (currentPage > totalPage) {
currentPage = totalPage;
return results;
}
if ((currentPage - 1) * pageCount > 0) {
// 移動結果集數據到當前頁
rs.absolute((currentPage - 1) * pageCount);
}
// rs.absolute(0); 在 ODBC 下會導致如下異常:java.sql.SQLException: Cursor
// position (0) is invalid
int i = 0; // Readed pages
while (rs.next() && i < pageCount) {
i++;
// TODO: Read each row and process to value object
ValueObject bean = new ValueObject();
// TODO: Read value to value object
result.add(bean);
}
} catch (Exception exception) {
System.out.println("Occur a error in " + getClass()
+ ".pageData() : " + exception.getMessage());
// exception.printStackTrace();
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return results;
}
/**
* 返回當前數據庫中記錄的總數.
*
* @return int 記錄總數
*/
public int recordCount() {
int allCount = -1;
String tableName = "table_name";// 要處理的表格名
String sql = "SELECT COUNT(*) FROM " + tableName;
ResultSet rs = null;
Statement stmt = null;
try {
// TODO: open connection
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
allCount = rs.getInt(1);
}
} catch (Exception exception) {
System.out
.println("Occur a error in " + getClass()
+ ".recordCount() : " + exception.getMessage());
} finally {
closeJDBCResource(stmt);
closeJDBCResource(rs);
closeJDBCResource(conn);
}
return allCount;
}
/**
* Close a jdbc resource, such as ResultSet, Statement, Connection.... All
* these objects must have a method signature is void close().
*
* @param resource -
* jdbc resouce to close
*/
public static void closeJDBCResource(Object resource) {
try {
Class clazz = resource.getClass();
java.lang.reflect.Method method = clazz.getMethod("close", null);
method.invoke(resource, null);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Test page.
* @param args
*/
public static void main(String[] args) {
// 分頁, 讀取第一頁數據, 共讀取5個記錄
Vector data = new Pager().pageData(1, 5);
// TODO: process value object, 更改類名
for(int i = 0; results != null && i < data.size(); i++) {
ValueObject bean = (ValueObject)data.get(i);
}
}
}
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/23/155318.html
2005 年的時候幫人收集整理修改的一份腳本級聯菜單, 沒用到 AJAX, 寫死的數據. 效果自己試試就知道了. 支持主流瀏覽器. 自己現在看看這代碼就覺得頭大... 呵呵 腳本就是腳本啊. 一段時間放下就看不懂了. <HTML> <HEAD> <TITLE>合同申請</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <SCRIPT LANGUAGE = JavaScript> /** Define object Dsy 構造器 fieldValues - 三個表單域的名稱, 可以通過 request.getParameter(xxx) 取值 defalutOptions - 默認選項 */ function Dsy(fieldValues, defalutOptions){ this.Items = {}; this.defalutOptions = defalutOptions;// 默認選項 this.fieldValues = fieldValues;// 三個表單域的名稱 } Dsy.prototype.add = function(id, iArray){ this.Items[id] = iArray; } Dsy.prototype.Exists = function(id){ if (typeof(this.Items[id]) == "undefined") return false; return true; }; Dsy.prototype.setup = function() { this.bean_change(0); } // This prototype method added by BeanSoft Studio Dsy.prototype.bean_change = function(v){ var str = "0"; for (i = 0; i < v; i++){ str += ("_" + (document.getElementById(this.fieldValues[i]).selectedIndex - 1)); }; var ss = document.getElementById(this.fieldValues[v]); // Avoid a null exception if(ss == null) return; with(ss){ length = 0; options[0] = new Option(this.defalutOptions[v], this.defalutOptions[v]); if (v && document.getElementById(this.fieldValues[v - 1]).selectedIndex > 0 || !v){ if (this.Exists(str)){ array = this.Items[str]; for (i = 0; i < array.length; i++) options[length] = new Option(array[i], array[i]); if (v) options[1].selected = true; } } if (++v < s.length){ this.bean_change(v); } } } function change(v){ dsy.bean_change(v);// Call test prototype } // Write form data string, 輸出表單腳本代碼 // dsy, object name // varName, 變量名 function toString(dsy, varName) { var str = ""; for(i = 0; i < dsy.fieldValues.length; i++) { str += "<select id=\"" + dsy.fieldValues[i] + "\" onChange=\"" + varName + ".bean_change(" + (i + 1) + ");\"></select>\r\n"; } str += "<br/>"; return str; } // 第一個對象 var dsy = new Dsy(["s1", "s2", "s3"], ["銷售方名稱", "銷售方聯系人", "聯系電話"]); var dsy1 = new Dsy(["s4", "s5", "s6"], ["最終用戶名稱", "最終用戶聯系人", "聯系電話"]); var dsy2 = new Dsy(s = ["s7", "s8", "s9"], ["廠商", "廠商銷售", "聯系電話"]); // 填入數據, 重復的代碼 dsy.add("0", ["亞信", "航天理想"]); dsy.add("0_0", ["亞信聯系人_1", "亞信聯系人_2"]); dsy.add("0_0_0", ["亞信聯系人_1聯系電話"]); dsy.add("0_0_1", ["亞信聯系人_2聯系電話"]); dsy.add("0_1", ["航天理想聯系人_1", "航天理想聯系人_2"]); dsy.add("0_1_0", ["航天理想聯系人_1聯系電話"]); dsy.add("0_1_1", ["航天理想聯系人_2聯系電話"]); dsy1.add("0", ["最終用戶1", "最終用戶2"]); dsy1.add("0_0", ["最終用戶1_聯系人1", "最終用戶1_聯系人2"]); dsy1.add("0_0_0", ["最終用戶1_聯系人1_電話"]); dsy1.add("0_0_1", ["最終用戶1_聯系人2_電話"]); dsy1.add("0_1", ["最終用戶2_聯系人1", "最終用戶2_聯系人2"]); dsy1.add("0_1_0", ["最終用戶2_聯系人1_電話"]); dsy1.add("0_1_1", ["最終用戶2_聯系人2_電話"]); dsy2.add("0", ["BEA", "Horizon"]); dsy2.add("0_0", ["張學友", "BeanSoft"]); dsy2.add("0_0_0", ["1234567890"]); dsy2.add("0_0_1", ["beansoft@126.com"]); dsy2.add("0_1", ["AAA", "BBB"]); dsy2.add("0_1_0", ["AAA_99999"]); dsy2.add("0_1_1", ["bbb_88888"]); function setup(){ // Initialize the object dsy.setup(); //依次調用 setup dsy1.setup(); dsy2.setup(); } function prints1(){ alert(document.frm.s1.value + " " + document.frm.s2.value + " " + document.frm.s3.value +"\r\n"); } //isNaN()檢查運算結果 http://tech.ccidnet.com/pub/article/c1115_a120997_p1.html </SCRIPT> </head> <body bgcolor="#E0E0E0" onload="setup()"> 多級關聯菜單: <form name="frm"> <!-- 方式1: 手工輸出 HTML 代碼, 便于排版 <select id="s1" onChange="dsy.bean_change(1);"></select> <select id="s2" onChange="dsy.bean_change(2);"></select> <select id="s3" onChange="dsy.bean_change(3);"></select> <br> <br> <br> <select id="s4" onChange="dsy1.bean_change(1);"></select> <select id="s5" onChange="dsy1.bean_change(2);"></select> <select id="s6" onChange="dsy1.bean_change(3);"></select> <br> <br> <br> <select id="s7" onChange="dsy2.bean_change(1);"></select> <select id="s8" onChange="dsy2.bean_change(2);"></select> <select id="s9" onChange="dsy2.bean_change(3);"></select> --> <SCRIPT LANGUAGE="JavaScript"> <!-- // 方式2: 腳本輸出表單 HTML 代碼, 代碼和上面注釋掉的類似 document.write(toString(dsy, "dsy")); document.write(toString(dsy1, "dsy1")); document.write(toString(dsy2, "dsy2")); //--> </SCRIPT> <input type=button name=b1 value="監測" onclick="prints1()"> </form> </body> </html>  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/22/154898.html
注: 昨天用 VMWare 試了試 Fedora Live, 下載地址: ftp://download.fedora.redhat.com/pub/fedora/linux/releases/7/Live/i386/ 里面的兩個 ISO 隨便下一個就行了, 還不錯, 安裝后登錄選擇語言, 竟然支持中文和中文輸入法, 要知道現在想找個安裝包為700MB 的 Linux 還能支持中文的還真不多啊. 不過感覺有點吃內存, 響應上不如 RedHat 快. 安裝后占用了 2.54 G 的空間. June 5th, 2007 Category: Ubuntu, Author: Nicky, Popularity: 30%  這次 Fedora 7 提供的 CD 鏡像分為兩大版本,Fedora 7 Live 和 Fedora 7 KDE Live,前者默認采用 GNOME 桌面環境,后者集成 KDE 環境,只有在 DVD 版中才同時提供 GNOME 和 KDE 這兩個供選擇。用過 Redhat Linux 的都知道,在安裝的時候可以選擇一個桌面環境,也可以同時選擇它們,現在 Fedora 7 真有點 Ubuntu 和 Kubuntu 的意思。我下載的是 Fedora 7 Live i686 來嘗試,整個安裝過程分為兩方面,安裝和配置,共 16 大步驟,花了我 30 張截圖,不過絕大多數設置默認就行,重點還是在分區上。 下面是安裝全過程。 一、進入 Live 桌面 1、下載 Fedora 7 Live,設置為光盤啟動后,選擇第一個從光盤鏡像啟動。
 2、直接回車進入
 3、進入到 Live 桌面
 這種 Live 安裝方式,對桌面用戶來說是最爽的。 二、進行安裝 1、雙擊桌面 install to fedora 圖標開始安裝。
 2、選擇鍵盤布局。
 3、問你是否初始化這個驅動器,選擇 Yes,否則無法繼續。
 4、開始分區,選擇 Create custom layout,自定義分區。
 Linux 分區和文件系統的選擇可以參考這篇文章。 可惜不提供 ReiserFS 文件系統的選擇。
 分區結束,點擊 Next。
 如果提示 Low Memory,選擇 Yes。
 5、選擇 GRUB 安裝位置,點擊 Next。
 6、網絡設備配置,可以讓它默認,點擊 Next。
 7、選擇時區,可以在下拉菜單中選擇,建議直接在地圖上點擊。
 8、設置超級用戶 root 的口令。
 9、安裝配置結束,點擊 Next 開始進行安裝。
 自動安裝過程
 10、安裝結束,點擊 Close 重新引導系統。
 三、安裝后的設置 1、重新引導,進入 GRUB 畫面。
 可以看到核心是 2.6.21,比 Ubuntu 7.04 稍高一點。
 啟動畫面很漂亮。
 2、開始進行設置,這里面大多數都可以默認,直接 Forward 就是。
 3、直接 Forward。
 4、選擇在哪些服務上啟用防火墻,可以都不選擇。
 5、直接 Forward。

6、設置時間。
 7、發送硬件信息到服務器,選 Do not send profile,點擊 Forward。
 再說一次 No, do not send。
 8、建立個人帳戶信息
 如果提示口令太弱,不管它,點擊 Yes。
 9、聲卡設置,完成點擊 Finish。
 到這里 Fedora 7 Live 的安裝才算徹底完成了,雖然很多步驟可以默認,直接點擊下一步,但相比 Ubuntu 7 步加 15 分鐘安裝的過程,說不繁瑣那是騙人的。 來自: http://www.osxcn.com/ubuntu/fedora-7-installation-notes.html  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/20/154442.html
用戶可在 NetBeans 中開發 JSR 295 (Beans Binding) 和 JSR 296 (Swing Application Framework) 的應用。本教程演示了這一過程。
 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/19/154173.html
從網上找的版本呢, 有白邊. 今天花時間改進了一下, 效果打開頁面的時候你就應該看到了. 如果配合 AJAX 做基于網頁版 Outlook 通知的話會有一點點用. 首先感謝最初的原作者(轉載的太多了, 找不到了). 顯示效果: 其實有人做的有更好的版本, 參考這里(也是僅支持IE的): Web的桌面提醒(Popup) 效果演示: http://webuc.net/MyProject/Popup/popup.htm 下載: http://webuc.net/MyProject/Popup/popup.rar
< SCRIPT > var oPopup; try { oPopup = window.createPopup(); } catch (e) { window.status = '彈出通知消息僅能用于 IE 下 ! '; }
var popTop = 10 ; var mytime;
function popmsg(msgstr){ if ( ! oPopup) { return ; } oPopup.document.body.innerHTML = msgstr; popshow(); }
function popshow(){ // window.status=popTop; if (popTop > 1720 ){ clearTimeout(mytime); oPopup.hide(); return ; } else if (popTop >= 1720 - 108 && popTop <= 1720 ){ oPopup.show(screen.width - 200 ,screen.height, 193 , 1720 - popTop); } else if (popTop >= 1500 && popTop < 1720 - 108 ){ oPopup.show(screen.width - 200 , screen.height - 220 + (popTop - 1500 ), 193 , 108 ); } else if (popTop <= 108 ){ oPopup.show(screen.width - 200 , screen.height, 193 , popTop); } else if (popTop <= 220 ){ oPopup.show(screen.width - 200 , screen.height - popTop, 193 , 108 ); } else { // window.status=popTop + " else"; oPopup.show(screen.width - 200 , screen.height - 220 , 193 , 108 ); }
popTop += 10 ; mytime = setTimeout( " popshow(); " , 40 ); }
function hidePop() { clearTimeout(mytime); oPopup.hide(); }
popmsg( " <div onclick='window.parent.hidePop()' title='點擊隱藏' style='cursor:pointer; background-image: url(http://www.aygfsteel.com/images/blogjava_net/beansoft/18269/o_qqbg.gif); width:193; height:108; color:white; padding-top:1em; padding-left:5; font-size:11pt; color:white' ><center><b>BlogJava 系統消息<br><br>請留言或者捐款支持 BeanSoft 的 Java EE 學習視頻, 謝謝 !!</b></center></div> " );
</ SCRIPT > 最后來一個支持頁面內的跨瀏覽器的: 完美仿MSN右下角彈出廣告代碼并可自動消失,附帶關閉按鈕. <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>先飛電腦技術網</title> </head> <Script language="JavaScript"> <!-- window.onload = getMsg; window.onresize = resizeDiv; window.onerror = function(){} //短信提示使用(asilas添加) var divTop,divLeft,divWidth,divHeight,docHeight,docWidth,objTimer,i = 0; function getMsg() { try{ divTop = parseInt(document.getElementById("eMeng").style.top,10) divLeft = parseInt(document.getElementById("eMeng").style.left,10) divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10) divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10) docWidth = document.body.clientWidth; docHeight = document.body.clientHeight; document.getElementById("eMeng").style.top = parseInt(document.body.scrollTop,10) + docHeight + 10;// divHeight document.getElementById("eMeng").style.left = parseInt(document.body.scrollLeft,10) + docWidth - divWidth document.getElementById("eMeng").style.visibility="visible" objTimer = window.setInterval("moveDiv()",10) } catch(e){} } function resizeDiv() { i+=1 if(i>300) closeDiv() //客戶想不用自動消失由用戶來自己關閉所以屏蔽這句 try{ divHeight = parseInt(document.getElementById("eMeng").offsetHeight,10) divWidth = parseInt(document.getElementById("eMeng").offsetWidth,10) docWidth = document.body.clientWidth; docHeight = document.body.clientHeight; document.getElementById("eMeng").style.top = docHeight - divHeight + parseInt(document.body.scrollTop,10) document.getElementById("eMeng").style.left = docWidth - divWidth + parseInt(document.body.scrollLeft,10) } catch(e){} } function moveDiv() { try { if(parseInt(document.getElementById("eMeng").style.top,10) <= (docHeight - divHeight + parseInt(document.body.scrollTop,10))) { window.clearInterval(objTimer) objTimer = window.setInterval("resizeDiv()",1) } divTop = parseInt(document.getElementById("eMeng").style.top,10) document.getElementById("eMeng").style.top = divTop - 1 } catch(e){} } function closeDiv() { document.getElementById('eMeng').style.visibility='hidden'; if(objTimer) window.clearInterval(objTimer) } --> </Script> <!--溫馨提示代碼開始--> <DIV id=eMeng style="BORDER-RIGHT: #455690 1px solid; BORDER-TOP: #a6b4cf 1px solid; Z-INDEX:99999; LEFT: 0px; VISIBILITY: hidden; BORDER-LEFT: #a6b4cf 1px solid; WIDTH: 180px; BORDER-BOTTOM: #455690 1px solid; POSITION: absolute; TOP: 0px; HEIGHT: 116px; BACKGROUND-COLOR: #c9d3f3"> <TABLE style="BORDER-TOP: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid" cellSpacing=0 cellPadding=0 width="100%" bgColor=#AFDCF3 border=0> <TBODY> <TR bgColor=#6699cc> <TD style="font-size: 12px; background-image: url('msgTopBg.gif'); color: #0f2c8c" width=30 height=24></TD> <TD style="font-weight: normal; font-size: 12px; background-image: url('msgTopBg.gif'); color: #ffffff; padding-left: 4px; padding-top: 4px" vAlign=center width="100%"> 網站溫馨提示:</TD> <TD style="background-image: url('msgTopBg.gif'); padding-right: 2px; padding-top: 2px" vAlign=center align=right width=19><span title=關閉 style="CURSOR: hand;color:white;font-size:12px;font-weight:bold;margin-right:4px;" onclick=closeDiv() >×</span><!--<IMG title=關閉 style="CURSOR: hand" onclick=closeDiv() hspace=3 src="msgClose.jpg">--></TD> </TR> <TR> <TD style="background-image: url(' padding-right: 1px; padding-bottom: 1px" colSpan=3 height=90> <DIV style="BORDER-RIGHT: #b9c9ef 1px solid; PADDING-RIGHT: 13px; BORDER-TOP: #728eb8 1px solid; PADDING-LEFT: 13px; FONT-SIZE: 12px; PADDING-BOTTOM: 13px; BORDER-LEFT: #728eb8 1px solid; WIDTH: 100%; COLOR: #1f336b; PADDING-TOP: 18px; BORDER-BOTTOM: #b9c9ef 1px solid; HEIGHT: 100%">先飛電腦技術網全新改版,免費精品網絡資源,你用了嗎?<BR> <DIV align=center style="word-break:break-all"><!--<a href=" target="_blank">--><a href=" target="_blank"> <font color=#FF0000>進入網站瀏覽</font></a></DIV> </DIV> </TD> </TR> </TBODY> </TABLE> </DIV> <!--溫馨提示代碼結束--> </html> 
文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/18/154020.html
Struts 里面的 <html:text> 之類的表單域標簽, 都有一個屬性叫: property, 這個屬性根據文檔是可以嵌套的, 例如下面的 formBean 嵌套了一個屬性 User: public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public class UserForm extends FormBean {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
那么對應的 JSP 頁面里的 Tag 可以寫成:
<html:text property="user.username" />
但是如果這時候有人還想給生成的表單加入 JavaScript 驗證的話, 必須用下面的寫法才能通過:
<script>
// 表單驗證函數
function validateForm(form) {
// this.user.username 會報錯
alert( this['user.username'] );
if(this['user.username'] .value == "") {
alert("用戶名不能為空!");
return false;
}
return true;
} </script>
這是因為 Struts 標簽最后產生的 HTML 如下所示:
<form onsubmit="return validateForm(this);">
<input name="user.username" />
</form>
直接引用 元素.user.username 肯定會出錯的. 正確的方法參考上上面的代碼段即可.  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/17/153565.html
這篇文章, 個人認為非常片面和誤導, 至于后記, 更是垃圾. 至于怎么樣, 大家自己看, 呵呵. 起碼, 企業不是軍隊, 領導不是總統, 員工也不是軍人, 社會的發展又不是戰爭. 在一切有關古巴的事物中,有一個人最讓我忘不了。 當美國戰爭爆發后,美國必須立即跟西班牙的反抗軍首領取得聯系。加西亞將軍在古巴叢林的山里—沒人知道確切的地點,所以無法寫信或打電話給他。美國總統必須盡快地獲得他的合作。 怎么辦呢? 有人對總統說:“有一個叫羅文的人,有辦法找到加西亞,也只有他才找得到。” 他們把羅文找來,交給他一封寫給加西亞的信。關于那個“名叫羅文的人”,如何拿了信,把它裝進一個油布制的袋里,封好,吊在胸口,劃著一艘小船,四天之后的一個夜里在古巴上岸,消逝于叢林中,接著在三個星期之后,從古巴島的那一邊出來,已徒步走過一個危機四伏的國家,把那封信交給了加西亞—這些細節都不是我想說明的。我要強調的重點是:麥金利總統把一封寫給加西亞的信交給了羅文;而羅文接過信之后,并沒有問:“他在什么地方?”像他這種人,我們應該為他塑造不朽的雕像,放在每一所大學里。年輕人所需要的不是學習書本上的知識,也不是聆聽他人種種的指導,而是要強調一種敬業精神,對于上級的托付,立即采取行動,全心全意去完成任務—“把信帶給加西亞”。 加西亞將軍已不在人間,但現在還有其他的加西亞。凡是需要眾多人才的企業經營者,有時候都會因為一般人的被動——無法或不愿意專心去做一件事——而大吃一驚:懶懶散散,漠不關心,馬馬虎虎的做事態度,似乎已經變成常態;除非苦口婆心、威迫利誘地叫屬下幫忙,或者除非奇跡出現——上帝派一名助手給他,沒有人能把事情辦成。 不信的話,我們來做個試驗:你此刻坐在辦公室—周圍有6名職員。其中一名叫來,對他說:“請幫我查一查百科全書,把哥立奇的生平做成一篇摘錄。” 那人職員會靜靜地說:“好的,先生”,然后說去執行嗎?我敢說他絕不會。他反而會滿臉狐疑地提出一個或數個下列的問題: 他是誰呀? 哪套百科全書? 這是我的工作嗎? 你不是指俾斯麥吧? 為什么不叫查理去做呢? 他是過世的人嗎? 急不急? 我是否把書拿來,由你自己來查? 你為什么要查他? 我敢以10比1的賭注跟你打賭,在你回答了他所提出的問題、解釋了怎么樣去查那資料,以及你為什么要查的理由之后,那個職員會走開,去找另一個職員幫他查哥立奇的資料,然后又回來對你說,根本查不到這個人。當然,我這個打賭可能會輸,但根據或然率,我還是會贏的。真的,如果你是聰明人,你就不會對你的“助理”解釋,你會滿面笑容地說“算啦”,然后自己去查。這種被動的行為,這種道德的愚行,這種心靈的脆弱,這種姑息的作風—都在把這個社會帶到三個和尚沒水喝的危險境界。如果人們都不能為了自己而自動自發,你又怎么能期待他們為別人采取行動呢? 你登廣告征求一名速記員,而應征者中,十之八九不會拼也不會寫——他們甚至不認為這些是必要條件。這種人能寫出一封給加西亞的信嗎? 在一家大公司里,總經理對我說:“你看那個簿記員。” “我看到了,他怎樣?” “他是個不錯的會計,不過如果我派他到城里去辦個小差事,他可能把任務完成,但也可能就在途中走進一家酒吧,而當他到了鬧市區,可能根本忘了他的差事。” 這種人你能派他送信給加西亞嗎? 近來我們聽到,許多人為“那些為了廉價工資工作而又無出頭之日的工人”,以及為“那些為求溫飽而工作的無家可歸人士”表示出同情,同時又把那些雇主罵得體無完膚。 但從沒有人提到,有些老板一直到年老,都無法使有些不求上進的懶蟲做點正經的工作;也沒有人提到,有些老板長久而耐心地想感動那些當他一轉身就投機取巧的 “員工”。在每一個商店和工廠,都有一個持續的整頓過程。公司負責人經常地送走那些顯然無法對公司有所貢獻的“員工”,同時也吸引新的進來。不論業務怎么忙碌,這種整頓一直進行著。只有當景況不佳,就業機會不多,整頓才會出現較佳的成績——那些不能勝任沒有才能的人,都被摒棄在就業的大門之外。只有最能干的人,才會被留下來。為了自己的利益,使得每個老板只保留對那些最佳的職員——那些能夠把信帶給加西亞的人。 我認識一個極為聰明的人,他沒有自己創業的能力,而對別人來說也沒有一絲一毫的價值,因為他老是瘋狂地懷疑他的雇主在壓榨他,或存心壓迫他。他無法下命令,也不敢接受命令。如果你要他帶封信給加西亞,他極可給回答說:“你自己帶去吧!” 當然,我知道像他這種道德不健全的人更值得同情;但是,我們也不會同情那些努力去從事一項大事業的人,他們不會因為下班的鈴聲而放下工作。他們因為努力去使那些漠不關心、偷懶被動、沒有良心的員工不至于離譜而日增白發。如果沒有這份努力和心血,那些員工將挨餓和無家可歸。 我是否說得太嚴重了?也許是吧。不過,當整個世界變成貧民窟,我要為成功者說幾句同情的話——在成功機會極小之下,他導引別人的力量,終于獲得了成功;但他從成功中所得到的一片空虛,除了食物之外,就是一片空無。我曾經是為了三餐而替人工作的人,也曾經當過老板,我知道這兩面的種種。貧窮是不好的;貧苦是不值得推介的;并非所有老板都是婪都、專橫者,就像并非所有的人都是善良者。 我欽佩的是那些不論老板是否在辦公室都努力工作的人;我也敬佩那些能夠把信交給加西亞的人;靜靜地把信拿去,不會提出任何愚笨問題,也不會存心隨手把信丟進水溝里,而是不顧一切地把信送到;這種人永遠不會被“解雇”,也永遠不必為了要求加薪而罷工。文明,就是為了焦心地尋找這種人才的一段長遠過程。這種人不論要求任何事物都會獲得。他在每個城市、村莊、鄉鎮—每個辦公室、公司、商店、工廠,都會受到歡迎。世界上急需這種人才,這種能夠把信帶給加西亞的人。 后記: 這是一個很多人都知道的故事,講述了一個可能改變一場戰爭結局或一個國家命運的敬業守責的人的故事,這讓人在許多方面心生感慨。卡內基把它與企業經營聯系起來,閱讀這篇文章,最強的感覺就是:卡內基怎么知道那么多我們企業的事?不僅有經營者的心聲,也有職員的感受。在充斥著懶懶散散、漠不關心、馬馬虎虎做事態度的表象下,能把信帶給加西亞的人才彌足珍貴。 那么,我們來看一下能把信帶給加西亞的人具有什么樣的特質: ——“把信帶給加西亞”要有積極的態度,這個積極的態度會決定下一步的一切行動。國內一知名企業宣揚自己的工作理念是,“企業的每個員工不是螺絲釘而是發動機”,當然,發動機固然可以促進企業加大馬力發展,但不合格的螺絲釘同樣會影響到整個機器的運轉,如果做不了強大的發動機,那就安心做好一顆螺絲釘吧,努力做實事,盡心盡力,是一顆稱職的螺絲釘應有的本份,好高鶩遠,眼高手低,能“把信帶給加西亞”嗎? ——“把信帶給加西亞”要有主動的行動,行動本身就含有可能遇到麻煩甚至危險的含義,積極的行動就是要主動解決這些問題和麻煩,而不是被動地等待,消極地推諉。一家企業的老板炒掉了他們企業惟一的一名研究生,研究生不依不撓詢問被炒的原因,老板說,你找到的只是一份工作,而不是一項事業。勇于承擔責任,積極付出努力,我的上司說過一句雖然粗糙但很有道理的話:企業怎樣才能做好?就一條,你家里的事怎么做,你在公司就怎么做。 ——“把信帶給加西亞”要有極強的責任心,沒有哪個人說自己沒有責任心,但缺乏責任心幾乎無處不體現,有些人整日抱怨,有些人投機取巧,有些人劃地自封,有些人會找各種借口為自己開脫,這些都無法掩蓋責任心的缺乏…… 如此看來,卡內基在文章中提到的“把信帶給加西亞”的人是一個盡心盡力做好本職工作的人應當具備的素質,并不是什么高不可攀的要求,但為什么在社會中,不缺各類專業人才,不乏各種精英,卻獨獨缺乏“能把信帶給加西亞”的人?是制度的某種缺陷?文化的丑陋一面?還是個體的差異?似乎都不能完全解釋。卡內基是實證主義,他由此及彼,得出的結論也讓人信服。如果卡內基是個中國人,我們會和他討論一下世界觀的問題,那些不能“把信送給加西亞”的人一定是世界觀出了毛病,是對生活的態度出了偏差,我們崇尚的是“世界上怕就怕‘認真’二字”、“認真對待生活的人,生活一定會認真對待你”,聽起來似乎與企業經營相差較遠,但做事與做人是一致的,對生活采取敷衍態度的人不是能“把信送給加西亞”的。 如果你最近因為工作方面的事感到郁悶,比如你覺得老板對你不公、同事不好好和你配合、待遇太低要求加薪,或者因為自己的遠大理想正面臨新的選擇,那么請抽出半個小時閱讀這本《致加西亞的信》,它會幫你從另一個角度認識自己。 我也相信新空間公司里也有很多很好的“羅文”,但實際上大部分人都不能“主動準時地把信帶給加西亞。”事實勝于雄辯: 1.“請將個人當日計劃傳遞至管理秘書處。”的通知上個星期就在白板了,到了今天仍然有很多人無動于衷,小徐只能在通知的后面加“!”號。 2.3月21日到廣州參觀國際展覽原定早上7:30起程,但最后是8:30才動身。還是像上次去中山春游一樣,要打電話催,要到宿舍去拉,才能將部分人集合。 這樣的小事都做不好,業務上的事情更不用說了。我們的工作好像接力跑,很多人在接到棒后還未跑到接力點就把棒扔掉了,甚至有些人接到棒后根本就沒有跑。所以我們公司的管理層總要疲于奔命地為下屬留下的手尾“擦屁股”。 形成良好的的職業素質,不論你在哪一間公司工作,你都是最受歡迎的的! 文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/14/152683.html
<input type="button" onclick="ajaxTest()" value="AJAX測試">
<input type="button" onclick=" document.getElementById('weather').innerHTML='' " value="隱藏">
<script>
// 1. 初始化 請求 對象
// Mozilla/Firefox 下的
var xmlhttp = new XMLHttpRequest();
// IE 下的
//var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
//alert(xmlhttp);
function ajaxTest() {
// 指定要打開的頁面
xmlhttp.open("GET", "staticpage.html", true);// HTTP 請求的方式, URL, 是否異步
// 指定頁面打開完之后要進行的操作.
xmlhttp.onreadystatechange = mychange;
// 開始發起瀏覽請求, Mozilla 必須加 null
xmlhttp.send(null);
}
// 這個函數就是每次狀態改變要調用的函數
function mychange() {
// 請求已完成
if(xmlhttp.readyState == 4) {
//alert(xmlhttp.readyState);
alert(xmlhttp.responseText);
// 更新對應的 HTML 元素里面顯示的內容
// 根據 ID 引用頁面里面的元素 document.getElementById(元素名)
document.getElementById('weather').innerHTML = xmlhttp.responseText;
}
}
</script>
<div id="weather"></div>  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/12/152318.html
1. 靜態頁面的亂碼問題 文件的編碼和瀏覽器要顯示的編碼不一致。 1) 檢查文件原始的編碼, 可以用記事本打開, 然后選擇另存為來看; 2) 給當前頁面加入一個指令來建議瀏覽器用指定的編碼來顯示文件字符內容. <meta http-equiv="content-type" content="text/html; charset=GBK"> 3) 如果系統是英文XP,沒裝東亞字符集支持, 也會顯示亂碼. 2. JSP 頁面的亂碼問題 1) page 指令有個 pageEncoding="GBK" 這個會指定當前頁面保存的編碼, 如果寫成ISO8859-1就不能保存漢字; 2) page 指令的 contentType="text/html; charset=ISO8859-1" 也會像靜態頁面一樣讓瀏覽器來優先選擇一種編碼. 如果JSP亂碼的話,一般就顯示成?,而且不管你給瀏覽器選什么樣的編碼,它都不能正確顯示 3. 表單提交的亂碼問題(Tomcat 特有) 1). POST 的亂碼 a. 首先瀏覽器提交表單的編碼是根據表單所在頁面來決定的, 而不是根據提交后的 JSP 頁面的編碼來決定的. 把所有的頁面的編碼都設置成一樣的,例如 GBK. b. 處理方式就是在獲取參數之前設置編碼: request.setCharacterEncoding("GBK"); c. 可以用過濾器的方式來解決, Tomcat 已經帶了一個現成的: apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.java web.xml <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2) GET 方式的亂碼 用 setCharacterEncoding() 不能解決. TOMCAT 的一個BUG, GET 方式傳送的表單參數總是用的 ISO8859-1 編碼. 我們要把它轉成 GBK 方式. String username = request.getParameter("username"); System.out.println(username); // 轉碼, 先取得原始的二進制字節數組 byte[] data = username.getBytes("ISO8859-1"); // 根據新的字符集再構造新的字符串 username = new String(data, "GBK"); 小結: 所有的頁面(除了最后的 GET 的亂碼問題)都用統一的編碼(GBK或者UTF-8), 就不會出現亂碼問題. 4. 用過濾器來一次編碼徹底解決表單參數的亂碼問題 Tomcat 5/6 GBK 編碼下完美解決中文表單問題的過濾器  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/10/151848.html
分頁的設計和編碼, 代碼下載請訪問: 用 MyEclipse 開發的 Hibernate + JSP 分頁代碼(跳頁錯誤已修正) 1. 當前頁碼的表單參數 listuser.do?page=2 同時轉換成一個 int 類型的頁碼變量 int currentPage = Integer.parseInt( request.getParameter("page");// 當前頁 2. 下一頁 listuser.do?page=${currentPage+1} 上一頁 listuser.do?page=${currentPage-1} 3. 一頁顯示多少數據 int pageSize = 5;//每頁顯示的數據數 4. 總頁數 totalPage 1) 先從數據庫取得總記錄數 dao.UserDAO#getUserTotalCount() int totalCount = executeQuery("select count(*) from Users"); 2) 根據一頁的數據類計算出總頁數 dao.UserManager#getTotalPage(int pageSize) // 得到頁面總數 int totalPageCount = ((totalCount + pageSize) - 1) / pageSize; if(totalPageCount == 0) { totalPageCount = 1; } 5. 從數據庫里把第currentPage頁的數據讀取出來(Hibernate), DAO 層的代碼 dao.UserDAO#findPagedAll(int currentPage, int pageSize) 兩個參數: currentPage 當前頁(從1開始的) pageSize 取多少數據 String queryString = "from User"; Query queryObject = getSession().createQuery(queryString); queryObject.setFirstResult((currentPage - 1) * pageSize); queryObject.setMaxResults(pageSize); List result = queryObject.list(); 6. 在前臺顯示上下頁的鏈接,并根據總頁數的上下限來避免讓用戶跳到第-1頁或者比最大頁數還大的頁碼哪里 <c:if test="${currentPage > 1}"> [ 上一頁的鏈接 ] </c:if> <c:if test="${currentPage <= 1}"> [ 上一頁的文本 ] </c:if> 7. 通過 forEach 來顯示數據 <c:forEach items="${users}" var="user" > ${user.id} ${user.username} <c:/forEach> 8. 通過下拉菜單來跳轉頁面 轉到 <script> // 頁面跳轉函數 // 參數: 包含網址的選擇框(SELECT元素) function jumpPage(select) { var newUrl = "/hibernate_page/index.jsp?page=" + select.value; //alert(newUrl); document.location = newUrl; } </script> <!-- 輸出 HTML SELECT 元素, 并選中當前頁面編碼 --> <select onchange='jumpPage(this);'> <option value="1" selected>1頁</option> <option value="2" >2頁</option> </select>  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/10/151704.html
最近有同學做項目的時候發現 Spring 整合 Hibernate 時候用的 HibernateTemplate 不支持分頁, 上網搜了搜找到結果并測試成功, 只需要用下面的方法就能分頁: /**
* 使用hql 語句進行操作
* @param hql HSQL 查詢語句
* @param offset 開始取數據的下標
* @param length 讀取數據記錄數
* @return List 結果集
*/
public List getListForPage(final String hql, final int offset,
final int length) {
List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list = query.list();
return list;
}
});
return list;
}  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/10/151702.html
常見的 Tomcat 5 表單編碼提交后亂碼的解決方案有很多, 有改 Tomcat Connector 屬性的, 有加過濾器的. 但是 Tomcat 自帶的那個過濾器只解決了 POST 方式的亂碼卻不能處理 GET 方式的亂碼. 在這里那我就給出一個不需要修改任何 Tomcat 配置文件的完美解決中文問題的過濾器的代碼: 首先是我們的測試頁面: index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>表單測試頁面</title>
</head>
<body>
<form action="action.jsp">
GET 方式: <input type=text name="name" value="GET 中文">
<input type=submit>
</form>
<form action="action.jsp" method="POST">
POST 方式: <input type=text name="name" value="POST 中文">
<input type=submit>
</form>
</body>
</html>
和普通的表單沒有任何區別.
然后就是表單提交頁面 action.jsp:
<%@ page language="java" pageEncoding="GBK"%>
<html>
<body>
參數: <%=request.getParameter("name") %> <br>
</body>
</html>
接著是過濾器的配置文件 web.xml (用 2.5 版本也可以):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>TomcatFormFilter</filter-name>
<filter-class>filters.TomcatFormFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TomcatFormFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
最后最關鍵的就是我們的過濾器代碼了, 對 GET 方式使用請求包裝器, 而 POST 方式則用 setCharacterEncoding():
package filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class TomcatFormFilter implements Filter {
/**
* Request.java
* 對 HttpServletRequestWrapper 進行擴充, 不影響原來的功能并能提供所有的 HttpServletRequest
* 接口中的功能. 它可以統一的對 Tomcat 默認設置下的中文問題進行解決而只需要用新的 Request 對象替換頁面中的
* request 對象即可.
*/
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
/**
* 轉換由表單讀取的數據的內碼.
* 從 ISO 字符轉到 GBK.
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 讀取參數 -- 修正了中文問題.
*/
public String getParameter(String name)
{
return toChi(getHttpServletRequest().getParameter(name));
}
/**
* 讀取參數列表 - 修正了中文問題.
*/
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("GBK");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
怎么樣, 是不是很簡單也很方便呢?  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/09/151368.html
隨著JPA得到眾多廠商和開發人員的認同, 如同 Resin 的新聞中所說的那樣: 2007-07-18 Resin 3.1.2 adds significant features Resin 3.1.2 now includes an implementation of the Java Persistence API, which is a major feature of the Enterprise Java Beans 3.0 standard. New features have also been added to the Hessian 2.0 web services protocol that allow for better security and message compression. Resin's JAX-WS support continues to improve with better support for WSDL handling and handler chains. Both Resin and the Quercus Java-PHP engine also underwent major reliability tests making them even more solid than before. "Before JPA, developers had to choose from an array of non-standard, incompatible API's to do object persistence. JPA standardizes this fundamental task and makes it easier for developers to get their applications written faster. Resin's JPA implementation is efficient and reliable, so our customers can start using this exciting new standard right away," said Emil Ong, Software Engineer at Caucho Technology. Resin 的最新版也開始支持內置的 JPA 了. 像上面這段話上所說, JPA 最大的優點就是把開發人員從各種各樣的包和API中解放出來, 例如你的程序不再需要導入 org.hibernate.*** 或者 com.oracle.***, 而且便于隨時切換底層引擎. 這就像 JDBC 所起的作用那樣. PS: Resin 是另一款性能和易用性上都超過 Tomcat 的 Java Web 服務器, 同時也支持 Java 實現的 PHP. 雖然 Tomcat 是標準的實現, 但是 Resin 在很多地方都比 Tomcat 優秀.  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/09/151360.html
| Project Name | Type | Lead | Version | Release Date | Download | Downloads | Hibernate 開發指南 | 原創 | Xiaxin(夏昕) | | | 92頁, 530K | 131,158 | 《深入淺出Hibernate》 | 原創書籍 | Xiaxin(夏昕),Cao Xiaogang(曹曉鋼),Jerry Tang(唐勇) | | | 隨書示例, 7.5M | 190,908 | IBatis2 開發指南 | 原創 | Xiaxin(夏昕) | | | 48頁,319K | 75,404 | Spring 開發指南 | 原創 | Xiaxin (夏昕) | | | 169頁, 1.02M | 171,842 | Hibernate 手冊 | 翻譯 | Cao Xiaogang(曹曉鋼) | 3.2 | | 238頁,1.42M (PDF) HTML HTML_Single | 135,028 | Webwork2 開發指南 | 原創 | Xiaxin (夏昕) | | | 60頁, 550K | 41,739 | 持續集成實踐之CruiseControl | 原創 | mathaw | | | 34頁, 964K | 19,690 | Shift To Dynamic(smalltalk) | 原創 | Raimundox(徐昊) | 0.3 | | 27頁,1.98M | 15,561 | luntbuild手冊 | 翻譯 | melthaw | | | web site | 15,627 | Mapping Objects to Relational Databases | 翻譯 | mochow(huhu) | | | 34頁,571K | 25,175 | SpringFramework概述 | 翻譯 | DigitalSonic | | | 24頁,322K | 22,095 | Java網絡程序員看Continuation
| 原創 | 劉暢 | | 2006/02/16 | 57頁,1.45M | 90,087 | Hibernate Annotation Reference | 翻譯 | melthaw | | | 進行中 已提交給hibernate小組,等待英文正式版本發布 | | Spring 2.0 Reference | 翻譯 | DigitalSonic | 2.0 | 2006/10/22 | HTML , PDF(509頁, 3.74M) ,CHM(2.2M) | 95,748(gro下載統計) | [OSGI Opendoc] | 原創 | Bluedavy | | | 90頁,3M | 130,663 | Seam 2.0 Reference | 翻譯 | Xiaogang Cao | 2.0 | | 進行中 | 架構風格與基于網絡的軟件架構設計 (NEW!) | 翻譯 | 原著:Roy Thomas Fielding博士,翻譯:李錕、廖志剛、劉丹、楊光 | | 2007/6/28 | PDF(84頁,810K) | 48,271 | Using the Rake Build Language (NEW!) | 翻譯 | 原著:Martin Fowler,翻譯:DigitalSonic | | 2007/6/1 | PDF(19頁,333K) | 5,202 | OSWorkflow中文手冊 (NEW!) | 翻譯 | 原作:OSWorkflow團隊;翻譯:陳剛 | 2.8 | 2007/8/21 | PDF(50頁,790K) | 16,218 | | | | | | | 總計:1,230,416 | (備注:下載量統計到2007年10月8日1:20, 以apache log文件為準,未區分flashget等軟件分段下載情況) 滿江紅站點還為以下開源軟件軟件/組織提供Hosting服務: 歡迎您的加入:我們可以為開源軟件提供CVS/SVN/wiki/JIRA等服務.請email: caoxg at yahoo.com 聯系. 目前管理員小組成員: 夏昕(nuke), 徐昊(Raimundox),mochow, 劉暢(liu chang),曹曉鋼 | | 感謝同志們的無私奉獻, 給廣大初學者帶來了福音. http://wiki.redsaga.com/confluence/display/RSTEAM/Home  文章來源: http://www.aygfsteel.com/beansoft/archive/2007/10/09/151237.html
|