解決辦法:將tomcat5.5\work\Catalina\localhost\peam\SESSIONS.ser刪除。如果正常關閉服務端,該文件是自動刪除的。
分析:EOFException表示輸入過程中意外地到達文件尾或流尾的信號,導致從session中獲取數據失敗。異常是tomcat本身的問題,由于tomcat上次非正常關閉時有一些活動session被持久化(表現為一些臨時文件),在重啟時,tomcat嘗試去恢復這些session的持久化數據但又讀取失敗造成的。此異常不影響系統的使用。
解決辦法:將tomcat5.5\work\Catalina\localhost\peam\SESSIONS.ser刪除。如果正常關閉服務端,該文件是自動刪除的。 當增加Hibernate Capabilites后增加Struts Capabilites,運行項目時,控制臺報錯信息:
/----------------------------------------------org.apache.commons.collections.SequencedHashMap ...... /---------------------------------------------- 解決方案: 下載commons-beanutils-1.7.0.zip; 將其中commons-beanutils.jar文件替換Tomcat6.0下WEB-INF/lib/commons-beanutils-1.7; 解決問題. 這個錯誤可能是myeclipse6.0版本的一個問題,就是在整合web層和struts層出現的問題 解決方法如下: 1)下載6.0.1版本的myeclipse開發 2)下載最新的org.apache.commons.collections,講原來的去掉就行了,然后講最新的加進去 <html:messages> 例如: Action方法中: Action的調用的方法,可以寫真Action實現類的父類 BaseDispatchAction 中: public ActionMessages saveMessage(HttpServletRequest request, String key) { protected ActionMessages saveMessage(ActionMessages messages, messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(key)); 頁面: <html:messages id="msg" message="true"><bean:write name="msg"/></html:messages> <html:errors> 如果Action中這樣設定(false),頁面的提示信息將不從資源文件里讀取: 源碼下載:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703 1. 準備工具:MyEclipse 6.0.1 GA、mysql-connector-java-5.0.4-bin.jar、MySql GUI Tools 5.0(便于管理MySql數據庫,不是必須) 1.1. 新建工程 操作:[Menu] File/New/Web Project 工程名:login 2. Struts 部分
2.2. 創建 ActionForm 類 操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form 類名:LoginForm 在 “Form Properties” 選項卡為 loginForm 新增兩個屬性:username、password; 在 “JSP” 選項卡鉤選 “Create JSP form” 選項,將新建路徑改為 “/login.jsp”(login.jsp文件將被自動創建)。 2.3. 創建 Action 類 操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action 類名:LoginAction 在 “Form” 選項卡的 “Name” 項選擇 “loginForm”,”Input Source” 項輸入 “/login.jsp”。 2.4. 創建 index.jsp 文件 如果沒有,創建 index.jsp 文件,并添加一個指向 login.jsp 的鏈接:<a href=”login.jsp”>Login</a>。 2.5. 創建Forword類 操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword 類名:indexForword “Name” 項輸入 “indexForword” ,”Path” 項輸入 “/index.jsp” 。 2.6. 修改 LoginAction.java 文件 修改 LoginAction 類的 execute 方法: public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, 2.7. 修改 login.jsp 文件 修改 <html:form> 標簽:<html:form action=”/login”>。 2.8. 測試 操作:[Menu] Run/Run,選擇 MyEclipse Server Application 方式運行 (要正常執行Run操作,需先安裝 Tomcat5.5 。) 點擊 index.jsp 頁面的 “Login” 鏈接,跳轉到 login.jsp 頁面。在 login.jsp 頁面輸入 “test/test”,應該會登錄成功,然后跳轉到 index.jsp 頁面;輸入 “test/123″ ,應該保持在 login.jsp 頁面。 如果測試成功,證明 Structs 運行正常。 3. Spring 部分
操作:[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities Spring 版本( Spring version )選擇 “Spring 1″; 開發包(libraries)選擇 “Spring 1.2 AOP Libraries、Spring 1.2 Core Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence JDBC Libraries” 四項; JAR Library Installation 選擇 “copy checked…” ,”Library Folder” 項選擇 “/WebRoot/WEB-INF/lib”(這樣的話所需的類庫都將拷貝到項目目錄,方便以后的布署)。 點擊 “下一步(Next)” 創建配置文件,修改文件路徑(Folder)到 “WebRoot/WEB-INF” 目錄(以便和Struts配置文件一起管理),文件名稱為默認的”applicationContext.xml”。 點擊 “完成(Finish)” 。 3.2. 配置 struts-config.xml 文件 添加 Spring 插件(在 <message-resources> 標簽后面添加): <plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”> 修改 LoginAction 的配置(只需修改 type 屬性): <action-mappings > </action-mappings> 3.3. 修改 Spring 配置文件 applicationContext.xml <?xml version=”1.0″ encoding=”UTF-8″?> <beans> 3.4. 測試 同上一次測試。測試成功證明 Spring 運行正常。 4. Hibernate 部分下面開始 Hibernate 部分,將原例修改為使用數據庫進行用戶名/密碼驗證。 4.1. 創建 mysql 數據庫和表 添加表的代碼如下: CREATE TABLE user_table( insert into user_table (USERNAME,PASSWORD) values (’test’,'test’) 4.2. 創建 MyEclipse 數據庫驅動(DB Driver) 操作:[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower 在 DB Brower 的菜單中選擇 “New” ,”Driver Name” 項輸入 “login-conn” ,”Connection URL” 項輸入 “jdbc:mysql://localhost:3306/test” ,然后輸入正確的用戶名(User Name)和密碼(Password)按實際情況輸入; 在 “Driver JARs” 項添加 “mysql-connector-java-5.0.4-bin.jar” (可從網上下載),在 “Driver classname” 里選擇 “com.mysql.jdbc.Driver” ,其它自選。 點擊 “完成(Finish)”。 4.3. 添加 Hibernate 功能支持 操作:[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities Hibernate 版本(Hibernate Specification)選擇 “Hibernate 3.1″ ,開發包(libraries)選擇 Hibernate 3.1 Core Libraries 一項; JAR Library Installation 選擇 “copy checked…” ,”Library Folder” 選擇 “/WebRoot/WEB-INF/lib” 。 點擊 “下一步(Next)” 設置配置文件,選擇 “Spring configuration file (applicationContext.xml)” 。 “下一步(Next)” 設置 Spring-Hibernate,選擇 “Existing Spring configuration file” ,”SessionFactory ID” 項輸入 “sessionFactory” 。
“下一步(Next)” 創建數據源對象,在 Bean Id 中輸入 dataSource,”DataSource” 項選擇 “Use JDBC Dirver” ,DB Driver 項選擇 “login-conn” ,其余項會自動填充; 記得選中 “Copy DB driver jar(s) to project and add to buidpath” 項,以便將數據連接的庫文件復制到項目,方便以后的布署。 “下一步(Next)” 創建 SessionFactory 類,”Java package” 項設置為 “com.login.Hibernate” (沒有則點擊”New”按鈕添加),”Class name” 項修改為”SessionFactory” ,Java Compliance Level選擇和創建項目時選擇的Java版本。(本例中并沒有用到SessionFactory類,留作今后擴展) 點擊 “完成(Finish)”。 4.4. 創建對象關系映射(ORM)的相關文件 操作:[Menu] Window/Open Perspective/MyEclipse Database Explorer 選中 user_table 表,點擊右鍵,在出現的菜單中選擇 “Hibernate Reverse Engnieering” 。 在彈出的窗口中保持 “Java package” 項為 “com.login” ; 選中 “Hibernate mapping file (*.hbm.xml) for each databases table” ,并保持 “Update hibernate…” 項選中; 選中 “Java Data Object” 項,并保持 “Create abstract class” 選中; “Base persistent class” 項留空; 取消 “Java Data Access Object…” 項和 “Use custom templates” 項。 點擊 “下一步(Next)” ,再點擊 “下一步(Next)” ,在 “Configure reverse engineering details” 頁選中 “user_table” 表,在右邊出現的 “Class Name” 項中輸入 “com.login.User”,其它不變。 點擊 “完成(Finish)”。 完成此操作,會在 “com.login” 包下創建三個文件:AbstractUser.java、User.java、User.hbm.xml。 4.5. 創建 UserDAO.java 接口和 UserDAOImpl.java 類 UserDAO 和 UserDAOImpl 通過 Hibernate 訪問數據庫。 UseDAO.java 內容如下: package com.login; public interface UserDAO { package com.login; import java.util.List; public class UserDAOImpl extends HibernateDaoSupport implements UserDAO { public boolean isValidUser(String username, String password) { 4.6. 修改 LoginAction.java 文件 使用 UseDAO 對象來驗證: package com.login.struts.action; import javax.servlet.http.HttpServletRequest; public class LoginAction extends Action { public UserDAO getUserDAO() { public void setUserDAO(UserDAO userDAO) { public ActionForward execute(ActionMapping mapping, ActionForm form, LoginForm loginForm = (LoginForm) form; if( userDAO.isValidUser( username, password ) ){ 綠色字體為修改部分。 4.7. Spring 的最終配制文件 applicationContext.xml <?xml version=”1.0″ encoding=”UTF-8″?> <beans> <bean id=”dataSource” <!– 配置sessionFactory, 注意這里引入的包的不同 –> <bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”> <bean id=”userDAO” class=”com.login.UserDAOImpl”> <bean id=”userDAOProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”> <bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”> </beans> 4.8. 測試 同第一次測試。
在spring2.0中,bean沒有“singleton”這個屬性,而是在“scope”中對它進行設定。“scope”可以設定為“singleton”和“prototype”默認情況下是“singleton”即和原先的“singleton=true”性質一樣,如果要實現單例模式則將“scope”設定為“prototype”,即和原先版本的“singleton=false”一樣。參考文檔鏈接地址:http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
根據用戶名和密碼進行校驗的方法 public boolean verify(String userName, String userPwd) { final String HQL="FROM UserTable u where u.userName=? and u.userPwd=?"; String[] hqlParameter=new String[2]; hqlParameter[0]=userName; hqlParameter[1]=userPwd; List list=this.getHibernateTemplate().find(HQL,hqlParameter); if(list.size()>0){ return true; } return false; } mysql-administrator的安裝與使用(圖文) <?xml version="1.0"?> <user_connections> <last_connection>0</last_connection> <password_storage_type>2</password_storage_type> <user_connection> <connection_name>NewConnection</connection_name> <username>root</username> <hostname>127.0.0.1</hostname> <port>3306</port> <schema>test</schema> <advanced_options/> <storage_path></storage_path> <notes></notes> <connection_type>0</connection_type> <storage_type>1</storage_type> <password_storage_type>2</password_storage_type> <password>root</password> </user_connection> </user_connections> 但是在備份的時候還是會出現錯誤 根據提示選擇open options 選擇 password storage OK 電腦每次自己啟動MySQLSystemTrayMonitor 就會在定制的時間備份數據庫 Your account information: Name: fei zhao Email: feifeixia2003@yahoo.com.cn Password: nehaifrowa You can log in to your new account and edit your profile options at: http://www.mysql.com/login.php
http://www.net.cn/static/customercare/support/demo/outlook/outlook.htm
fei.zhao@centralsoft.com.cn 211.155.226.126 有些事情現在已經很容易被忘記了,但是在開發原創的 Mac OS 的時候,業界到處出現新的圖形用戶接口(GUI),人們所做的工作差別相當小。Macintosh 的設計團隊在很多事情上是正確的,這很大程度上是因為他們在自己正在干什么這個問題上付出了難以想像的思考。雖然我要為 Internet Developer(英特網開發者)書寫一些腳本方面的集體思想,但我還是想去看一些過去的 Macintosh 人機界面指南,并且看看這些指導原則如何才能用到 Web 界面上,我認為這是很值當的。我很少去找可以拷貝的具體部件,而更多地尋找這個以友好聞名的界面后面隱藏的設計原則。 原則之一就是無模式。這個原則打動了我,因為它特別適合于 Web。正如 Mac 的設計者描述的那樣,模式界面(在這種界面下,您能做什么取決于您當前處于什么模式下)會“把用戶鎖定在一個操作上,用戶在該操作完成之前不允許進行其它任何操作”。使用單純的老版本HTML時,從某種意義上看,所有界面都是模式的,進行任何修改都需要裝載一個新的頁面。舉例來說,假定您在填充一個表單時需要一些幫助,則您必須轉到包含幫助信息的新頁面,然后再回到原來的頁面,以完成表單的填寫。 換句話說,您或者處于“幫助”模式,或者處于“表單填寫”模式。這凸顯了 Web 的兩個主要的限制:無態(即當點擊幫助連接時,您在表單中已經輸入的信息將會丟失)和遲延(即您必須等待頁面裝載)。因此我決定寫一點腳本來幫助處理這些問題。這些腳本通過動態 HTML (DHTML)技術在您點擊連接時彈出一個帶有幫助信息的方框。在我的演示中,就是使用它們來彈出與表單填寫相關的上下文幫助信息。這些腳本也可以用在別的地方,比如彈出一篇論文的術語定義。上述的兩種情況都以合理的方式給出了上下文相關的信息,即無模式的方式。同時,這個解決方案也避免了無態和遲延的問題。 實際上,我寫的這些基本函數可以用在任何需要在頁面上移動和改變對象可視性的地方。我做了一個快速下拉菜單的實例,就是為了演示同樣這些代碼的另外一種使用方式,您可能會用得到。 您可能會擔心有人還在使用版本比較老的瀏覽器,對此,我們可以相當輕松地使這些腳本自然地回退到原來的狀態,使那些使用老版本瀏覽器的用戶可以簡單地從一個單獨的頁面上獲得信息。我將在下面的“如何使用腳本”的部分中解釋如何實現這個目標。 腳本的目標這個腳本將創建動態菜單和彈出式對象。它包括一些跨瀏覽器的基本函數,用于移動和改變DHTML對象的可視性。在 Netscape 4.x 中,一個 DHTML 對象是一個通過絕對位置定位的 DIV,而對 Safari,Internet Explorer 4 和 5,或者 Netscape 6 來說,則是任何 HTML 元素。這些函數可以被用在大量的 DHTML 應用中;這里還給出的兩個實例,向您演示如何創建一個彈出式的提示(tip)和下拉式菜單。腳本中的主要函數如下:
編碼的挑戰遺憾的是,由于長期以來瀏覽器都是由各個廠商自行實現,所以書寫跨瀏覽器和跨平臺的 DHTML 通常是拜占庭式的條件分支。為任何一個瀏覽器書寫這些腳本都是非常輕松的;為了使它們工作在 Netscape 4 及其升級版本,以及工作在 Internet Explorer 4 及其升級版本上,事情就要復雜一些了;而使它們可以回退到比較老版本的瀏覽器的狀態,又增加了更多的復雜度。問題在于各個瀏覽器在如何尋找和操作 Web 頁面上的對象方面都有很多獨特之處,雖然我們對這種狀態已經比較熟悉了。為了方便,我寫了處理這些條件分支的代碼。 這些函數中有一些功能不能工作在更老一些的瀏覽器上,比如 Netscape 3。然而,使這些功能自然地退化并補臺困難。您只需進行如下操作:
我發現的最大挑戰是必須考慮瀏覽器處理事件的不同方式。事件發生時(比如 click 或者 mouseover 事件)光標的位置存儲在一個事件對象中,而不同瀏覽器對事件對象的處理有輕微的不同。當事件發生時,Netscape 4 和6都產生一個新的事件對象,您可以把這個對象作為一個參數傳遞到函數中;而 Internet Explorer 則使用一個獨立的全局 <a href="#" onclick="showPopup('popupName',
event);">click</a>
請注意,在事件邊上少了引號標識。那是因為它是一個對象,而不是文本。現在,在您的函數中就可以以如下方式使用傳入的事件對象了: function showPopup(nameOfPopup, eventObject) {
alert(eventObject.clientX);
}
一旦把對象傳遞給函數,您就可以通過讀取 把事件對象作為參數進行傳遞的唯一麻煩是在不支持事件對象的老版本瀏覽器上不能工作。為了繞開這個問題,我們在 popup.js 文件中包含一個函數,該函數為那些不存在事件對象的瀏覽器創建一個假的對象,在裝載文檔時運行: function createFakeEventObj() {
// create a fake event object for older browsers
//to avoid errors in function call when we
//need to pass the event object
if (!window.event) {
window.event = false;
}
}
這個函數把 在 Mac 版的 Internet Explorer 5 上有一個問題,即當彈出層出現在文本的上方時,只有部分內容可以被顯示。但是當我移動 DIV 標識,使之成為文檔體的第一個元素時,這個問題神秘地消失了。 還是在 Mac 版的 IE 5 上,由于某些原因, function resizeBlankDiv() {
// resize blank placeholder div so IE 5
// on mac will get all clicks in window
if ((navigator.appVersion.indexOf('MSIE 5') != -1)
&& (navigator.platform.indexOf('Mac') != -1)
&& getStyleObject('blankDiv')) {
getStyleObject('blankDiv').width =
document.body.clientWidth - 20;
getStyleObject('blankDiv').height =
document.body.clientHeight - 20;
}
}
遺憾的是,如果瀏覽器的尺寸被改變了,則只有一種方法可以恢復尺寸,即重新裝載整個文檔(您可能認為,只要用 在 Mac 版的 Internet Explorer 5 上,當您點擊一個連接時,會出現一個絕對大的輪廓,這個輪廓會和將要彈出的內容相重疊。為了解決這個問題,我在連接上增加了一條風格規則: .popupLink { outline: none }
Netscape 4 在 DIV 的命名上有一些怪異的問題。以數字開頭的名稱(比如“1div”),以及有些帶有下劃線的名稱(比如“my_div”)不能轉化為層,因此我通常都避免這兩種情況,把我的 DIV 按類似于 myDiv 或者 div1 的形式來命名。 Netscape 4 還有一個嚴重的缺陷,即當窗口的尺寸被改變時,所有的風格規則都會丟失。我沒有把修復這個缺陷的代碼包含進來,因為已經有好幾個這樣的代碼公布出來了,比如 Webmonke 上的這個. 最后,在 Netscape 4 中,如果您把 <a href="javascript:myFunction();">clickme</a>
而必須采取象下面的做法: <a href="#" onclick="myFunction();
return false;">clickme</a>
實際上,這也是確保您的腳本在不能運行這些函數的瀏覽器上自然退化的好方法。請注意“ 在這個演示中,我們討論的更深一些: <a href="#" onclick="return
!showPopup('nameFieldPopup', event);">
clickme</a>
我們不去深入到所有的細節,只是大概看看這行代碼,它的意思是運行 使用腳本如果要使用這些腳本來實現彈出機制,請按照如下這些步驟來進行:
下面對相關的函數逐一進行說明:
在怎合struts+hibernate+spring時,Tomcat出現了Error Listenerstart錯誤碼,郁悶的很,在網上找了很多的資料,提問的不少,但都沒有很標準的解釋以用解決的辦法,有的說是jar包的版本沖突,有的說是Tomcat的自身問題,各解釋都有,基本上所有的方法我都試過了。就這個問題搞了兩天。終于找到了解決的辦法:在web.xml時將:
<!-- 使用監聽方式載入Spring上下文 --> 改為: <!-- 使用監聽方式載入Spring上下文 --> 一、在Myeclipse軟件中部署 1、 在Myeclipse中,創建好工程后,在Myeclipse菜單欄中選擇 Windows -> Preferences -> Myeclipse -> Tomcat5,選擇"Enable";Tomact Home Directory要選擇你機器上Tomcat所安裝的目錄。然后,再Windows -> Preferences -> Myeclipse -> Tomcat5 ->JDK,確保這個是有對應的jdk版本,若沒有,則通過"Add"添加其安裝路徑。ok 2、選擇工具欄上的 3、 在工具欄上選擇 4、 運行程序。在IE中輸入http://localhost:8080/aa/WebRoot/index.jsp(aa為工程名字) 二、在Tomcat的server.xml配置文件中部署 1、在Tomcat下,找到conf文件下的server.xml,打開。 2、在<Host>和</host>之間加上如下代碼: 1
2 <Context path="/虛擬目錄名" docBase="目標目錄位置" debug="0" reloadable="true" > 3 </Context> (嚴格區分大小寫,當path=""時,此時的虛擬目錄直接為root--->http://localhost:8080/) path:表示在瀏覽器中輸入http://localhost:8080/虛擬目錄名 docBase:表示你的程序包的物理絕對路徑,默認的絕對路徑是 %tomcat_home%/webapps reloadable :為true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,我們可以在不重起tomcat的情況下改變應用程序;為false則不自動加載。 (我覺得這種部署方法就好在這里,可以不用重新啟動Tomcat。不知道前一種方法是不是在哪個地方進行配置即可實現同樣的效果。若有,請高人指點!) 示例: 1
2 1 <!-- 我的自定義目錄--> 3 2 <Context path="/wess" debug="0" docBase="C:\Documents and Settings\tt\workspace\Welcome_SS\WebRoot" reloadable="true"> 4 3 </Context> 5 4 3、 啟動Tomcat 在Myeclipse工具欄上選擇 4、 運行程序。在IE地址中輸入http://localhost/wess/index.jsp(引用上面示例配置時的情況)
附: 在lib下的struts-config.xml可以添加下面三句進行主頁默認的配置,即在IE中只需輸入到主頁所在目錄,而不必寫出主頁。如上面的配置就可只輸入http://localhost/wess <welcome-file-list> |