
posted @ 2011-03-09 16:48 寒武紀 閱讀(13763) | 評論 (4) | 編輯 收藏
posts - 37, comments - 143, trackbacks - 0, articles - 0 |
||
1. Redmine安裝前提條件 官方的安裝指南:http://www.redmine.org/projects/redmine/wiki/RedmineInstall Notes: Ruby 1.9 is not supported yet. You have to use Ruby 1.8.x as stated above. 安裝主要版本選擇:ruby 1.8.6,rubygems1.3.5,rake 0.8.3,rack 1.0.1,I18n 0.4.2,rails 2.3.5 使用yum安裝ruby相關的軟件 yum -y install ruby ruby-devel ruby-libs ruby-irb ruby-rdoc ruby-mysql 如果沒有ruby-mysql,則從http://www.tmtm.org/en/ruby/mysql/ 下載手動安裝 /etc/yum.repos.d/ 目錄下創建yum源文件ruby.repo,內容如下: -------------------------------------------------------------------------------- [ruby] -------------------------------------------------------------------------------- 升級ruby: yum --enablerepo=ruby update ruby 因為直接通過yum安裝的rubygems是0.9.4,所以選擇手工下載安裝的方式 wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz 安裝完后運行gem –v檢查一下版本是否正常,(當然還可以直接用yum安裝,然后通過gem本身的更新來實現,那從rubyforge下載的就應該是.gem結束的升級文件) gem install rails –v=2.3.5 gem install rack –v=1.0.1 gem install rake –v=0.8.3 gem install -v=0.4.2 i18n wget http://rubyforge.org/frs/download.php/74128/redmine-1.1.1.tar.gz 拷貝壓縮文件到要安裝的目錄,比如 /var/www目錄下,解壓 tar xzvf redmine-1.1.1.tar.gz cd redmine-1.1.1 配置數據庫連接yml文件(在redmine目錄下進行如下操作) cd config cp database.yml.example database.yml vi database.yml 添加如下內容: production: rake db:migrate RAILS_ENV=production 如果沒有異常,在redmine安裝目錄下執行啟動服務器的命令: ruby script/server -e production & 這樣redmine就會偵聽本機IP的3000端口,輸入URL:http://IP:3000 就可以看到登陸界面,如果是本機就直接 http://localhost:3000。 但這樣只是以獨立的方式啟動redmine的服務器,在后臺執行,有些不足,因為客戶端的訪問日志會在終端上直接顯示。并且你退出終端時,服務器進程也會跟著關閉,后面再介紹啟動和關閉腳本的編寫,以及如何用nginx做反向代理,或是用Apache也可以,這個網上可以搜索到很多資料。 打開iptables:vi /etc/sysconfig/iptables 添加下面一行到文件里面 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT 然后重啟iptables /sbin/service iptables restart 到此為止就完成redmine的安裝,過程比較繁瑣,主要是各種組件和模塊的版本匹配問題。大多數情況下根據安裝的錯誤提示和Google就可以解決滴。
posted @ 2011-03-01 09:47 寒武紀 閱讀(3096) | 評論 (1) | 編輯 收藏 非常喜歡這種輕量級的JDBC封裝,比起Hibernate和iBatis,可以非常自由和靈活地運用和自行二次封裝,由于dbutils的BeanHandler轉換方式采取了反射技術,在性能上肯定有所損失,所以項目中基本上都使用MapHandler方式來轉換數據,當然就是自己寫的代碼多一點,也無所謂。一般的查詢、子查詢、聯合查詢、包括視圖查詢等等都很正常,但是發現一個比較小的問題,就是在使用聚合函數的場所,例如:select user_type, count(*) as count from `user` group by user_type這種類型查詢的時候,MapHandler方式不起作用,as列都變成key為空串的K-V對,導致有許多地方使用map.get("")代碼的情況出現,這種寫法當然是不太好的,容易出問題。
鑒于前面沒有時間了解,就都粗略使用了上面那種粗暴的map.get("")來處理,最好的情況是讓dbutils組件能自動識別到as類型的列名。于是有空了就專門看了看它的源代碼,發現最主要的一段代碼如下: 1
CaseInsensitiveHashMap是dbutils自定義的一個Map,忽略鍵大小寫的K-V字典,但是key使用的是ResultSetMetaData.getColumnName(),我想問題大概出在這里,于是認真翻了翻java的api文檔(開發做久了容易遺忘基礎),果然,原來getColumnName()是:獲取指定列的名稱;而as關鍵字之后,使列名稱變成用于顯示的意義,這個時候應該使用getColumnLabel():獲取用于打印輸出和顯示的指定列的建議標題。建議標題通常由 SQL ![]() 2 ![]() 3 ![]() 4 ![]() 5 ![]() 6 ![]() 7 ![]() 8 ![]() 9 ![]() 10 ![]() 11 ![]() AS 子句來指定。如果未指定 SQL AS ,則從 getColumnLabel 返回的值將和 getColumnName 方法返回的值相同。自己手動試驗了一下,果然如所料,問題就出在這里。所以呢,如果想要dbutils在自動轉換Map及MapList時能識別聚合函數的列名,那么最好的做法就是重載這種方式,懶一點的,你就干脆修改上面那段代碼,讓它判斷是否使用了as關鍵字。個人暫時搞不清楚官方為什么沒有考慮這一步,有時間再思考一下! posted @ 2011-02-12 17:33 寒武紀 閱讀(3028) | 評論 (7) | 編輯 收藏 在項目中剛好有一個地方需要在服務器端處理一個請求后,重定向到另一個Action,這樣瀏覽器的url才會變成另一個url,用戶重新刷新時,才不會彈出一個對話框問你是不是要重新提交form。于是就自然而然地用了redirectAction。大概如下:
1
![]() 2 ![]() 3 ![]() 因為重定義會丟失所有的請求參數和值棧,所以這里轉向時,加了一個請求參數msg,msg在要重定向的action中設置。 問題來了,重定向到myapp_myInfo.action時,這個Action里面取出msg參數時變成亂碼!!! 不論中文或是英語還是數字,全是亂碼,折騰了一翻,URLEncoder、URLDEncoder進行URL Base64編碼和解碼處理,包括new String(msg.getBtye("ISO-8859-1"), "UTF-8")這種處理方式仍無法奏效。google了一下并且抱起書本認真看了看struts2重定向問題后。大概有了個思路。 所有的重定向操作都會丟失所有的請求參數、請求屬性等,當然包括Action的處理結果也會丟失。 首先搞清楚redirect、redirectAction的區別: 1. redirect類型struts2是調用HttpServletResponse的sendRedirect(String)方法來重定向到指定的資源,可以是一個視圖結果,也可以是其它類型的Action; 2. redirectAction同樣是重新生成一個全新的請求。但是struts2內部卻是使用ActionMapperFactory提供的ActionMapper來重定向,它只能跳轉到另外一個Action; 由于redirectAction使用的是ActionMapper來重定向,也就同時使用ActionMapper的編碼方式重新進行編碼,這就導致了后面在取出參數時變成亂碼,沒有具體閱讀它的源代碼,但是多次不同的編碼再想重新還原出來就有點麻煩了。而redirect是使用HttpServletResponse來重定向,就不存在上面的問題。最后改為redirect來重定向,結果如下: 1
注意:在myapp_myInfo.action對應的Action必須對msg參數做一次轉碼,因為前面的Action過來時就做了URL base64編碼,如果直接發給瀏覽器,就會在瀏覽器看到一串帶%的URL base64編碼字符,所以要加上![]() 2 ![]() 3 ![]() 4 ![]() 1
把它設置回為中文,瀏覽器才能正常。![]() 2 ![]() 還得提到另一個重定向類型chain,它是Action鏈,還能維持當前的值棧不變。不過用它重定向后,雖然跳到其它Action,但是在瀏覽器端的URL是不會變化的,這樣開頭提到的那個問題仍是無法解決的! posted @ 2011-01-14 16:41 寒武紀 閱讀(6770) | 評論 (3) | 編輯 收藏 摘要: 項目中使用了FreeMarker做為視圖技術,相對來說因為freemarker在視圖上有一些邏輯處理功能,某些地方就顯得比較方便,特別是macro的使用,當然也不是說JSP就沒有這個功能,只是以前用JSP寫起來沒有這么順手....... 閱讀全文
posted @ 2010-11-10 15:43 寒武紀 閱讀(3092) | 評論 (3) | 編輯 收藏 摘要: 都說roller在國外是二次開發博客系統的首選,但是下載源代碼之后發現是它是基于netbeans項目結構開發的。平時用習慣了Eclipse,所以想搬到MyEclipse上面,但沒有想到居然那么不容易,折騰了整整一天,才最終跑起來。網上的參考信息太少,大概都是那二三篇的轉貼,全部結合起來就差不多可以解決,借此總結一下,希望用到的朋友有參考作用! 閱讀全文
posted @ 2009-11-22 21:04 寒武紀 閱讀(2253) | 評論 (2) | 編輯 收藏 最近的二個項目,由于規模較小,都是十張表之內,而且表關聯非常少。所以用了一下iBatis做為數據庫關系映射,本著減少手寫JDBC代碼的目的,想著可以減少工作量。但是卻遇到了二個令人郁悶的問題。由于環境的限制,使用了jdk1.4.x編譯的iBatis2.3版本,沒有使用最近的。
第一問題: 其中的一個項目,有一個表為它配置了sql Map的一個delete操作,非常簡單,大概就是delete from xxx where id=#value#這樣的語句,然后用sqlMapClient進行操作,日志打印完全正常,沒有報任何Exception,返回影響記錄數也是正確的。但是進數據庫一看,巍然不動!左查查,右查查,查不出任何毛病。更奇怪的是,數據庫表之間的所有關聯和索引全部取消,還是存在這問題。其它的三個字段比較少的表,這樣配置,同樣的api調用卻正常!這個出問題的數據庫表字段大概20+個左右。 第二個問題:另一個項目,是二期重構,本來一期也不復雜,全部是使用JDBC實現的,只是有些表的字段太多,JDBC寫到煩,特別是處理一些NULL的插入,還有批處理時異常日志的詳細處理也有點煩。近期做二期升級,就算采用iBatis來減少一些代碼量,于于喜涮涮地搞上去了,代碼的確減少了許多。單元測試也能通過,后來就設置了比較復雜的數據。發現問題的現場如下:在一個業務接口中,一個事務中包含了許多SQL操作,有delete,也有insert,大概十個sql語句左右,全部放在一個batch中執行,整個batch提交一個事務。測試環境提供了31個類似的業務數據,總共執行31個事務,采用for的循環執行調用,每逢索引 i = 10*n 的時候就會卡住,這個操作得花很長時間,最后能通過。后來進行跟蹤,發現是在執行第一個語句delete一個記錄(delete from xxx where id='xx')同樣也是單表刪除。搜索了google,baidu,沒有任何資源,翻遍了文檔沒有任何說明,查了網站FAQ也沒有辦法。于是,只能.......郁悶! 為什么遇到delete都會有這個問題?不曉得有沒有高手遇到同樣的問題,這里算是總結的同時也提問,希望有遇到相同類型的高手給個解決的方案。如果不行,就得倒回去用JDBC實現,就此iBatis的體驗使用也就擱置,估計以后也不會碰它了。Hibernate就不用了,有點小題大作。 google了才知道,原來iBatis的書籍、論壇、資料、討論等等相比Hibernate要少很多。學習是很簡單,但是遇到這種細節的時候,又不太愿意花時間去研究源代碼(都是現實所逼,有個球時間呀?)。所以選框架要慎重!!! posted @ 2009-08-21 16:52 寒武紀 閱讀(4324) | 評論 (24) | 編輯 收藏 Java環境安裝
1. 從sun主頁下載JDK for Linux版本。這里下載的是jdk-6u6-linux-i586.bin。 2. 用root用戶登錄ubuntu,或是在普通用戶下用su命令切換用戶。切換到所需的安裝目錄。類型:cd <目錄路徑名> 例如,要在 /usr/java/ 目錄中 安裝軟件,請鍵入:cd /usr/java/,把jdk-6u6-linux-i586.bin文件拷貝這個目錄里面,設置權限為可執行類型:chmod a+x jre-6u6-linux-i586.bin 3. 啟動安裝過程。鍵入:./jre-6u<version>-linux-i586.bin。接下來會提示二進制的許可協議,鍵入yes回車即可。安裝過程如果遇到一些問題,都同樣鍵入yes就可以。 4. 一路下來,最后看到Done字樣,就完成了Java環境的安裝。安裝的位置就是當前目錄 /usr/java,當然你可以選擇在別的位置。可以用ls命令查看一下是否正常。 環境變量配置 上面安裝完畢后,直接在shell里面輸入java是不起作用的,需要先配置一下環境變量。一般都會用export命令,不過這樣設置只對當前shell起作用,重啟或是切換到別的shell會話就不起作用了。可以選擇配置 .bashr文件。用vi或是gedit打開,在末尾添加下面的內容 export JAVA_HOME=/usr/java/jdk1.6.0_06 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 然后保存。再在shell里面試驗一下是否安裝成功。echo一下各個變量是否正常,然后輸入java -version看看。 還有一種方式是修改/etc/profile,這樣相當于修改系統配置文件,對所有用戶都有影響,我在嘗試的過程可能輸入了一些異常字符,導致整個ubuntu無法用GUI登錄,無奈只能用文本登錄,然后再次把profile改回來才正常。 好了之后可以先試一下用vi新建一個Hello的Java文件,然后編譯一下試運行。 Eclipse安裝 Linux下面的Eclipse在ubuntu的界面渲染下看起來非常漂亮。先從Eclipse社區下載一個Linux版本的,這里下載的是europa版本的gz包。只要解壓到一個目錄就可以,這里選擇/opt/eclipse下面。Eclipse是解壓就可以使用的。不過為了方便,我們在桌面做一個啟動器把啟動目標指向到Eclipse的安裝目的地,選擇里面已有的圖標文件,這樣就完成了。不過默認Eclipse是找不到Java執行路徑的,有網友寫了這樣一個腳本eclipse.sh 放到/usr/local/bin目錄下,記得加上775權限。然后把啟動器位置指到這里eclispe.sh。下面是eclipse.sh的內容: #!/bin/bash # # 執行 eclipse 2.1.1 # export JAVA_HOME=/usr/java/XXX export CLASSPATH=/usr/java/XXX/lib /opt/eclipse/eclipse -vm /usr/java/XXX/bin/java -data ~/workspace & # -vm 參數用以指定使用哪一個 jvm 來執行Eclipse, # -date參數用以指定Eclipse的數據目錄。在此指定其存在用戶根目錄(~)下的workspace目錄中 還有一個比較笨的方法,Eclipse默認會去找它自己目錄下是不是有jre存在,如果有,它就可以啟動,那么你可以直接把先前安裝好的JDK里面的JRE目錄整個復制到Eclipse里面。然后就可以直接運行了。下面看一下效果 posted @ 2008-08-29 17:07 寒武紀 閱讀(38192) | 評論 (6) | 編輯 收藏 |
||