|
posted @ 2007-11-22 13:57 代林 閱讀(1417) | 評論 (0) | 編輯 收藏
posted @ 2007-11-22 13:57 代林 閱讀(1417) | 評論 (0) | 編輯 收藏
posted @ 2007-11-14 10:17 代林 閱讀(2883) | 評論 (2) | 編輯 收藏 Struts 運(yùn)行環(huán)境
1.1 Struts 1.0 和1.1版本當(dāng)前主要有兩個版本,struts 1.0 release 和 struts 1.1 beta 3。Struts 1.0 和1.1差別很大,主要有兩點(diǎn):
盡管struts 1.0 是正式發(fā)布版,但是結(jié)構(gòu)已經(jīng)老化,功能也已經(jīng)固化。所以我們的Framework不選用struts 1.0, 而選用 struts 1.1。 1.2支持struts的應(yīng)用服務(wù)器根據(jù)apache官方網(wǎng)站的說法,struts幾乎支持所有的servlet containers, 下面是幾種主要的servlet containers
1.3配置說明我們公司目前項目中使用較多的應(yīng)用服務(wù)器是iPlanet Application Server, Tomcat。Struts 1.1 在這兩個應(yīng)用服務(wù)器下已經(jīng)配置通過。 Tomcat 與struts結(jié)合的很好,只需要將xxx.war 放到 webapp 目錄下,啟動Tomcat 即可,不需要其他額外的配置。 iPlanet 配置復(fù)雜一些,主要原因是xml parser 版本不一致,和struts 相關(guān)類不能加載。具體的配置說明請見《如何在 iAS 6.x 中配置Struts 1.1 beta x》。 在其他的應(yīng)用服務(wù)器上,還沒有嘗試struts, 今后根據(jù)項目需要會作進(jìn)一步的研究。 struts框架2.1 struts 體系結(jié)構(gòu)struts framework是MVC 模式的體現(xiàn),下面分別從模型、視圖、控制來看看struts的體系結(jié)構(gòu)(Architecture)。下圖顯示了struts framework的體系結(jié)構(gòu)響應(yīng)客戶請求時,各個部分工作的原理。
2.1.1 從視圖角度(View)主要由JSP建立,struts自身包含了一組可擴(kuò)展的自定義標(biāo)簽庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags。 2.1.2從模型角度(Model)模型主要是表示一個系統(tǒng)的狀態(tài)(有時候,改變系統(tǒng)狀態(tài)的業(yè)務(wù)邏輯操作也也劃分到模型中)。在Struts中,系統(tǒng)的狀態(tài)主要有ActiomForm Bean體現(xiàn),一般情況下,這些狀態(tài)是非持久性的。如果需要將這些狀態(tài)轉(zhuǎn)化為持久性數(shù)據(jù)存儲,Struts本身也提供了Utitle包,可以方便的與數(shù)據(jù)庫操作。 2.1.3 從控制器角度(Controller)在Struts framework中, Controller主要是ActionServlet,但是對于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協(xié)調(diào)完成。其中,Action扮演了真正的業(yè)務(wù)邏輯的實(shí)現(xiàn)者,而ActionMapping和ActionForward則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。 2.2 struts 的組件框架中所使用的組件:
2.3 struts 配置文件Struts-config.xml集中了所有頁面的導(dǎo)航定義。對于WEB項目,通過配置文件可迅速把握其脈絡(luò),這不管是對于前期的開發(fā),還是后期的維護(hù)或升級都是方便的。掌握Struts-config.xml是掌握Struts的關(guān)鍵所在。 在struts的早先版本中,只有一個struts配置文件struts-config.xml。但是,對大型項目來說,使用和修改這個配置文件,會成為瓶頸。在struts1.1中,支持sub-Application ,可以定義多個配置文件協(xié)同工作。 通過struts配置文件struts-config.xml 將struts各個組件聯(lián)系在一起。在struts-config.xml 中可以定義下面內(nèi)容:
2.3.1 配置全局轉(zhuǎn)發(fā)全局轉(zhuǎn)發(fā)用來在JSP頁之間創(chuàng)建邏輯名稱映射。全局轉(zhuǎn)發(fā)的例子:
2.3.2 配置ActionMappingActionMapping對象幫助進(jìn)行框架內(nèi)部的流程控制,它們可將請求URI映射到Action類,并且將Action類與ActionForm bean相關(guān)聯(lián)。ActionServlet在內(nèi)部使用這些映射,并將控制轉(zhuǎn)移到特定Action類的實(shí)例。所有Action類使用perform()或者execute()方法實(shí)現(xiàn)特定應(yīng)用程序代碼,返回一個ActionForward對象,其中包括響應(yīng)轉(zhuǎn)發(fā)的目標(biāo)頁面名稱。例如:
通過<forward>元素,可以定義資源的邏輯名稱,該資源是Action類的響應(yīng)要轉(zhuǎn)發(fā)的目標(biāo)。
2.3.3 配置ActionForm BeanActionServlet使用ActionForm來保存請求的參數(shù),這些bean的屬性名稱與HTTP請求參數(shù)中的名稱相對應(yīng),控制器將請求參數(shù)傳遞到ActionForm bean的實(shí)例,然后將這個實(shí)例傳送到Action類。例子:
2.3.4 配置JDBC數(shù)據(jù)源例子:
通過指定關(guān)鍵字名稱,Action類可以訪問數(shù)據(jù)源,比如: javax.sql.DataSource ds = servlet.findDataSource(“conPool”); javax.sql.Connection con = ds.getConnection(); struts標(biāo)記庫struts 標(biāo)記庫包含4種類型的標(biāo)記,分別是:
Struts提供了功能強(qiáng)大的Taglib,充分使用這些Tag,能最大限度的發(fā)揮Struts的作用。 由于標(biāo)記庫功能強(qiáng)大,所以掌握它需要花費(fèi)一定的時間。目前我們可以先從 struts-html taglib 學(xué)起,主要精力還是要先放在理解掌握struts導(dǎo)航功能上。 文檔《struts 標(biāo)記庫》可以幫助學(xué)習(xí)掌握struts taglib. 可視化設(shè)計工具和代碼生成器CaminoCamino 是基于 struts framework的可視化建模工具。使用camino 可以實(shí)現(xiàn)快速設(shè)計和開發(fā),主要特點(diǎn)有:
目前Camino的版本有2.05 和 3.0, 可以下載試用版。Camino 自帶了幫助文檔,可以方便學(xué)習(xí)Camino。 Struts exampleStruts 1.1 beta 3 的包中包含了幾個example, 可以幫助學(xué)習(xí)struts。
在Tomcat 4.1.18運(yùn)行環(huán)境下,只需要將 xxx.war 文件放到webapps 目錄下,啟動Tomcat 即可。 建議從struts-example 開始學(xué)習(xí),熟讀struts-config.xml, jsp, 和 java 源碼。 6、統(tǒng)一的IDE工具: eclipseEclipse 是由IBM支持的開發(fā)源碼的IDE, 目前的最新版本是2.1。與Netbeans, JBuilder相比,由以下特點(diǎn):
目前,每個項目使用的開發(fā)工具都不同,有JBuilder, Netbeans等。從長遠(yuǎn)考慮應(yīng)該采用開發(fā)源碼的IDE, 不存在盜版問題。現(xiàn)在開發(fā)源碼的IDE有Netbeans, Eclipse兩大陣營,分別由Sun 和 IBM支持。綜合上面的Eclipse特性,我推薦統(tǒng)一使用Eclipse。 7、參考資料
posted @ 2007-11-10 17:25 代林 閱讀(2152) | 評論 (2) | 編輯 收藏 2005 年的時候幫人收集整理修改的一份腳本級聯(lián)菜單, 沒用到 AJAX, 寫死的數(shù)據(jù). 效果自己試試就知道了. 支持主流瀏覽器. 自己現(xiàn)在看看這代碼就覺得頭大... 呵呵 腳本就是腳本啊. 一段時間放下就看不懂了. <HTML>
文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/22/154898.html posted @ 2007-11-10 17:21 代林 閱讀(311) | 評論 (0) | 編輯 收藏 /* * WebFXCookie class */ function WebFXCookie() { if (document.cookie.length) { this.cookies = ' ' + document.cookie; } } WebFXCookie.prototype.setCookie = function (key, value) { document.cookie = key + "=" + escape(value); } WebFXCookie.prototype.getCookie = function (key) { if (this.cookies) { var start = this.cookies.indexOf(' ' + key + '='); if (start == -1) { returnnull; } var end = this.cookies.indexOf(";", start); if (end == -1) { end = this.cookies.length; } end -= start; var cookie = this.cookies.substr(start,end); return unescape(cookie.substr(cookie.indexOf('=') + 1, cookie.length - cookie.indexOf('=') + 1)); } else { returnnull; } } function getCookieVal (offset) { var endstr=document.cookie.indexOf (";",offset);if (endstr==-1) endstr=document.cookie.length;return unescape(document.cookie.substring(offset, endstr)); } function GetCookie (name) { var arg=name+"=";var alen=arg.length;var clen=document.cookie.length;var i = 0;while (i<clen) { var j=i+alen;if (document.cookie.substring(i,j)==arg) return getCookieVal (j);i = document.cookie.indexOf(" ",i)+1;if (i==0) break; } returnnull; } function DeleteCookie (name) { var exp=new Date(); exp.setTime (exp.getTime()-1); var cval=GetCookie (name); document.cookie=name+"="+cval+"; expires="+exp.toGMTString(); } 文章來源:http://www.aygfsteel.com/beansoft/archive/2007/10/26/156057.html posted @ 2007-11-10 17:21 代林 閱讀(286) | 評論 (0) | 編輯 收藏 posted @ 2007-11-10 17:21 代林 閱讀(352) | 評論 (0) | 編輯 收藏 原創(chuàng)講解JSP過濾器和監(jiān)聽器 BeanSoft(劉長炯) 2007年11月 關(guān)于這個問題, 比較復(fù)雜的說. 不過我希望通過例子來解釋會方便理解一些. 假設(shè)有一個非常危險的任務(wù), 是九死一生. 需要你揣著炸藥包從北平開車走高速路過保定去石家莊把鬼子的碉堡給炸了. 注意: 這個任務(wù)十分艱巨, 有可能半路炸藥爆炸. 所以出發(fā)前你需要苦練10元一本的<<鐵布衫>>, 還需要立遺囑交代一下后事. 下面是路線圖: 那么我們先簡介可能發(fā)生的情況.? A 點(diǎn)有可能被警察和警犬發(fā)現(xiàn), 所以你只能被扭送回北平.? 即使不被發(fā)現(xiàn), 還可能出現(xiàn)收費(fèi)時發(fā)現(xiàn)10個現(xiàn)大洋一個路口的買路錢沒帶!! 哎, 只能又回去了. 還有最慘的: 高速路入口寫著: 對不起, 到石家莊的路線因為施工不通! 只好回家等著吧. OK, 以上過程, 就是過濾器和監(jiān)聽器的真實(shí)案例. 那么炸碉堡這個任務(wù), 就相當(dāng)于要調(diào)用 JSP 或者 Servlet 來獲得執(zhí)行結(jié)果(炸碉堡 D ).? 在執(zhí)行之前你需要做一些準(zhǔn)備工作, 相當(dāng)于要寫一個 那么過濾器在哪里呢? 它位于任務(wù)的 A B C 點(diǎn). 注意是雙向路程都會經(jīng)過的. 也就是請求和響應(yīng)都會經(jīng)過. 但是過濾器也會檢查不同的情況, 例如 A 點(diǎn)實(shí)際上有兩個過濾功能: 查炸藥包和收買路錢. 這就相當(dāng)于配置了: 那么在 E 點(diǎn)發(fā)生了什么? 也就是你可能替換掉了原來的 response 對象,? 也就是換車. 這意味著你可以在過濾器里私下修改請求和響應(yīng)對象. 雖然已經(jīng)不那么抽象了, 但是要理解可能還是需要耐心體會的. ===================================================================== ??? 1.請看下面一段代碼和其注釋: 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中讀取用戶是否登錄的標(biāo)志值 ?????? if(session.getAttribute("user") != null || path.equals("/login"))//若用戶已經(jīng)登錄并且當(dāng)前路徑仍然停留在登錄頁面 ?????? {??????????? ???????? *? chain.doFilter(request, response);//則將當(dāng)前濾鏡加入到濾鏡鏈條當(dāng)中 ?????? }else//若用戶尚未成功登錄 ?????? { ?????????? response.sendRedirect(request.getContextPath() + "/login.jsp");//則使用請求重定向轉(zhuǎn)到登錄頁面 ?????? }??????? ?? } } /* * 該Filter濾鏡類所過濾的是用戶在瀏覽器中輸入的 * 當(dāng)前web application的訪問路徑,通過判斷用戶是 * 否成功登錄而決定是否對訪問路徑加以限止 * 在該web application的web.xml配置文件中為 * 該filte濾鏡做了相應(yīng)配置 */ 請問: 上面代碼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.請看下面代碼: 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的監(jiān)聽器類,在該類中, *將兩個無為本系統(tǒng)提供服務(wù)的兩個對象寫入到了 *application隱含對象中(這樣保證在該系統(tǒng)的任何 *地方都能夠取得這兩個服務(wù)類對象的引用) *在本系統(tǒng)的web.xml文件中對該監(jiān)聽器做了配置 */ 請問: 為什么要將服務(wù)類對象寫入到程序上下文中呢,直接創(chuàng)建不也一樣嗎? 3.請看下面的配置文件內(nèi)容: ?? 請問: 加*號的三項是什么意思? 當(dāng)初老師講的時候,許多基本的原則原理尚不清楚,這些根本沒有聽明白,當(dāng)然,老師也未細(xì)講,只說會用即可, 可是若不能明白其本質(zhì),用也只能用這一點(diǎn)兒, 怎么成呢, 希望您能夠比較詳悉的講一下. thank you very much! 文章來源:http://www.aygfsteel.com/beansoft/archive/2007/11/09/159374.html posted @ 2007-11-10 17:21 代林 閱讀(1156) | 評論 (0) | 編輯 收藏 出處:javaresearch 作者:mandyhou
posted @ 2007-11-10 16:58 代林 閱讀(1523) | 評論 (1) | 編輯 收藏 以下所說的struts-config.xml和ApplicationResources.properties等文件名是缺省時使用的,如果你使用了多模塊,或指定了不同的資源文件名稱,這些名字要做相應(yīng)的修改。 1、“No bean found under attribute key XXX” 2、“Cannot find bean XXX in any scope” 3、“Missing message for key "XXX"” 4、“No getter method for property XXX of bean teacher” 5、“Cannot find ActionMappings or ActionFormBeans collection” 6、“Cannot retrieve mapping for action XXX” 7、HTTP Status 404 - /xxx/xxx.jsp 8、沒有任何異常信息,顯示空白頁面 9、“The element type "XXX" must be terminated by the matching end-tag "XXX".” 10、“Servlet.init() for servlet action threw exception” java.lang.NullPointerException 為解決問題,先下載struts的源碼包,然后在ActionServlet.java的第1003行插入斷點(diǎn),并對各變量進(jìn)行監(jiān)視。很丟人,我竟然把struts-config.xml文件弄丟了,因此出現(xiàn)了上面的異常,應(yīng)該是和CVS同步時不小心刪除的。 11、“Resources not defined for Validator” posted @ 2007-11-10 16:43 代林 閱讀(231) | 評論 (0) | 編輯 收藏 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
世界因你而精彩