截止到今天下午,中午把自己的應用部署到了Google app engine,用了一周的時間啊,真是費勁周折
好長時間了,聽說Google出了個
Google App Engine - Google Code,說是可以讓用戶上傳自己的應用,但是只支持python,當時就想什么
時候支持java啦啊,上個月看新聞就聽說Google app engine 要開始支持java啦,哈哈,喜,到時候把我的寫的blog傳上去,哈哈
上周,終于知道了Google app engine終于開始宣布支持java了,哈哈呼呼,動手,到官網一看,沒有支持java的動靜啊,
對,英文頁面,哈哈,看來中文的還是慢一拍啊
首先到注冊一個,竟然還要手機號發(fā)注冊碼,Google了一下 說在手機號前加 86就OK了,填上手機號點按鈕,呦,短信馬
上就來啦,搞定,注冊成功。
這下下載SDK,還有eclipse插件,幫助文檔只有英文的,配合Google工具欄的翻譯功能,基本能看懂,哈哈,感覺一路下
來,英語水平有所上升啊,哈哈
打開eclipse,裝上插件,很輕松的建了第一個應用,插件自動生成了一個小實例,部署上去,驚嘆于Google的GWT
開始一直我原來寫的blog程序,原來到處找免費的空間,jsp的空間不好找,先是找了
http://www.eatj.com/,但是沒24小
時(好像是)就會自動停止,必須手動重啟服務,原來還堅持去上去看看,后來終于因為有一次很忙時間太長被注銷了,接下來就聽
說了
http://www.stax.net/,跟Google的路子差不多,好像還更自定義些,繼續(xù)使用著,搞java朋友可以去看看
因為google app engine使用Google Account,原來的用戶管理模塊需要剔除,原來數(shù)據(jù)庫使用的是mysql hibernate,現(xiàn)在
Google 使用JDO,數(shù)據(jù)庫被封裝了,還好,當初設計是采用了工廠模式,實現(xiàn)了數(shù)據(jù)庫訪問模塊與業(yè)務處理模塊的松耦合,很容易
配置數(shù)據(jù)庫訪問模塊的更改,感受到好的設計真是為以后修改省很多事啊。
接著說部署我的Google app engine,終于改好相關代碼,準備上傳了,噩夢開始了
1、Unable to upload:
java.lang.IllegalStateException: cannot find javac executable based on java.home, tried “D:\Java\jdk1.6.0_13
\jre\bin\javac.exe” and “D:\Java\bin\javac.exe”
參考http://zhuyx808.javaeye.com/blog/370124
http://onlypython.group.javaeye.com/group/blog/366471
http://618119.com/archives/2009/04/12/148.html
2、決定轉戰(zhàn)Linux..
手上有四個版本的Linux,Ubuntu,Redhat,F(xiàn)edora,openSUSE,都裝過,后來感覺還是Fedora比較好用,我裝的是
Fedora9,F(xiàn)edora10正在下載中
以下Linux安裝配置,僅限于在Fedora9上安裝通過,資料都是通過Google搜索得來,感謝各位網友,網絡的力量真是強大。
1、在VMware中裝上Fedora9后,首先安裝VMware-tools,方便與主機交互
首先需要下載相應的kernel-devel.rpm包進行安裝
首先查看內核版本:uname -r一下,我的是2.6.25-14.fc9.i686,
所以下載kernel-devel-2.6.25-14.fc9.i686.rpm,然后運行rpm -ivh kernel-devel-2.6.25-14.fc9.i686.rpm 進行安裝. 內核安
裝完畢后,需要用這個命令確定內核 C header 的安裝目錄:ls -d /usr/src/kernels/$(uname -r)*/include
安裝內核具體步驟如下:
[root@localhost ~]# uname -r
2.6.25-14.fc9.i686
[root@localhost ~]# rpm -q kernel-devel
package kernel-devel is not installed
[root@localhost ~]# cd /home
[root@localhost home]# wget ftp://rpmfind.net/linux/fedora/releases/9/Everything/i386/os/Packages/kernel-devel-
2.6.25-14.fc9.i686.rpm
[root@localhost home]# rpm -i kernel-devel-2.6.25-14.fc9.i686.rpm
[root@localhost home]# rpm -q kernel-devel
kernel-devel-2.6.25-14.fc9.i686
再安裝gcc,否則安裝VMware-tools時會提示:Setup is unable to find the "gcc" program on your machine. Please make
sure it
is installed. Do you want to specify the location of this program by hand?
[yes]
What is the location of the "gcc" program on your machine?
在命令行執(zhí)行:yum install gcc
然后安裝VMware Tools就行了,打開菜單“VM -> Install VMware Tools”,然后有光盤自動彈出,把里面的源代碼拷貝出來.我的文
件是VMwareTools-6.5.0-xxxxx.tar.gz,我把它拷貝到/opt里.
安裝 VMware TOOLS
cd /opt
tar -zxvf VMwareTools-6.5.0-xxxxx.tar.gz
cd vmware-tools-distrib/
./vmware-install.pl
再一路安回車OK
2、由于在裝載xorg-x11-drv-vmmouse驅動時的一個bug,在客戶虛擬機的顯示中,鼠標位置可能不正確。直到被更新前,在客戶機
中添加Option NoAutoAddDevices到/etc/X11/xorg.conf文件的ServerFlags節(jié)中。如果需要,創(chuàng)建這個節(jié):
Section "ServerFlags"
Option "NoAutoAddDevices"
EndSection
3、第一,安裝JDK
第一,到http://java.sun.com下載最新JDK,當前本人下載的是jdk1.6.0_02!下載文件:jdk-6u2-linux-i586-rpm.bin.注意是
rpm.bin的!
第二,給下載回來的文件增加執(zhí)行權限:chmod 755 jdk-6u2-linux-i586-rpm.bin.
第三,執(zhí)行文件:./jdk-6u2-linux-i586-rpm.bin.
第四,執(zhí)行文件產生一個rpm文件,可直接雙擊執(zhí)行也可以在shell下執(zhí)行:rpm -ivh jdk-6u2-linux-i586-rpm.
第五:配置環(huán)境變量,環(huán)境變量配置可在全局文件/etc/profile下修改,這樣所有l(wèi)inux系統(tǒng)的用戶都可以用JDK,如果只是特定的
用戶用可修改/root/.bashrc文件,本人的修改為:
#java set
set JAVA_HOME=/usr/java/jdk1.6.0_02
export JAVA_HOME
export JRE_HOME=/usr/java/jre1.6.0_02
set JAVA_BIN=/usr/java/jre1.6.0_02
export JAVA_BIN
第五,當環(huán)境變量修改完后,重起系統(tǒng),在shell下輸入java,看是否輸入相關JAVA幫助信息,如果有,說明已經安裝成功!如果沒有,
檢查一下變量環(huán)境設置是否有誤!
2,安裝Eclipse,Eclipse不需要安裝,只要解壓縮就行了
運行Google app Engine不需要Tomcat
3,安裝tomcat的方法跟安裝eclipse的一樣,也是下一個tar.gz的文件按安裝eclipse方法和步驟就行了!進入tomcat/bin
下./startup.sh,如果在shell出現(xiàn)jdk的相關信息說明已經安裝成功啟動了,在firefox下打http://localhost:8080/出現(xiàn)tomcat頁就
大成功了!
在以上的安裝過程之中,出現(xiàn)了小插曲,就是tomcat找不到JDK,后來我又到JAVA網站下了一個JRE回來安裝,并建JRE_HOME,重起
TOMCAT,成功了!
4、運行Google App Engine的應用,提示
** Unable to load Mozilla for hosted mode **
java.lang.UnsatisfiedLinkError:
/home/dhofmann/development/ide/gwt-linux-1.4.61/mozilla-1.7.12/libxpcom.so:
libstdc++.so.5: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
解決辦法:
Search for stdc++5 in synaptic package manager (System->Administration->Synaptic) and then mark and install it. Or
use this console command:
yum install libstdc++.so.5
停止進程命令:
就是kill 比較不錯,如果kill不了. 加上-9
如#kill -9 1778
注1778 為進程pid
pid可以通過ps aux|grep 服務名查得
啟動Eclipse時,提示錯誤:
eclipse.buildId=M20090211-1700
java.version=1.6.0
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=zh_CN
Command-line arguments: -os linux -ws gtk -arch x86
!ENTRY org.eclipse.ui.workbench 4 0 2009-04-18 02:12:18.085
!MESSAGE Widget disposed too early!
!STACK 0
java.lang.RuntimeException: Widget disposed too early!
at org.eclipse.ui.internal.WorkbenchPartReference$1.widgetDisposed(WorkbenchPartReference.java:171)
在網上搜索得知:
eclipse.ini文件加個參數(shù)
-vmargs
-Dorg.eclipse.swt.browser.XULRunnerPath=
在Fedora9中安裝拼音輸入法
保證Fedora 9聯(lián)網的狀態(tài)下
在application->system tools->terminal 應用程序->系統(tǒng)工具->終端
輸入
su 回車
提示輸入root密碼
yum install scim 回車
系統(tǒng)會自動從一個鏡uy像站點檢索scim,并詢問是否下載,選擇y
下載完成后輸入
yum install scim-pinyin 回車
提示和操作如上
然后輸入
scim 回車
(筆者的電腦運行到starting SCIM后就沒有反應了,不過沒關系這時候可以按ctrl+c中斷)
選擇Fedora 9
System->Preference->Personal->Input Method
系統(tǒng)->首選項->個人->輸入法
選擇啟用新特性,然后選擇里面的SCIM,然后選擇配置SCIM,
在進入后的界面中選擇Global Set 全局設置,在這里設置激活熱鍵即可,然后重新啟動電腦,就可以在Fedora 9下面使用中文輸入
法了 雖然有點麻煩 但畢竟fedora等眾多l(xiāng)inux桌面系統(tǒng)還很年輕,有很多不足之處。
參考資料:
http://www.5dlinux.com/article/6/2007/linux_9042.html
http://zhidao.baidu.com/question/62290384.html
http://www.linuxidc.com/Linux/2008-09/16011.htm
好久沒寫了,過了個年,過了七天豬的日子,吃了睡睡了吃中間偶爾看看電視,為假期準備了幾個電影都沒看,唉:-(忙,上了幾天班了,怎么感覺這周過的這么慢呢,剛剛剛周四
昨兒看了一集struts2
總結幾點
1、struts.xml中的package標簽有個abstract="true"屬性,如果為true,則這個package中不能有<action>標簽,為true表示這個package為一個抽象package,就像java中的接口中不能有方法實現(xiàn)似的。
2、package標簽還有個namespace屬性,它關系到這個package中的action訪問路徑,默認是"",比如
<package name= "capinfo" extends= "struts-default" namespace="/hello">
<action name= "HelloWorld"
class= "com.capinfo.struts2.action.HelloWordAction" >
<result>/HelloWorld.jsp</result>
</action>
</package>
則jsp中則應為<form action="/hello/HelloWorld.action" method="post">,如果沒有找到hello/HelloWorld.action則會尋找namespace為""的,也就是HelloWorld.action,如果再沒有,就會拋出異常。
3、在struts1中可以有多個struts-config.xml的文件,只要在web.xml配置org.apache.struts.action.ActionServlet時加到config參數(shù)中,以逗號分隔,在struts2中也可以有多個struts.xml形式的文件,這次不需要修改web.xml了,在struts.xml中添加諸如
<include file=""/>就Ok了
4、關于struts各種參數(shù)的配置信息位于struts2-core.jar/org.apache.struts2/default.properties中,如果要修改里面的配置,有兩種方式,一是在struts.xml中配置,例如<constant name="struts.devMode" value="true" />,二是在classess中建一個struts.properties,在里面配置比如struts.i18n.encoding=GBK,在struts2-core.jar/org.apache.struts2/default.properties中有一下這句注釋,說明了struts.properties將覆蓋default.properties中的配置
### Struts default properties
###(can be overridden by a struts.properties file in the root of the classpath)
###
就總結這么些先。
前兩天實踐了關于攔截器的具體實現(xiàn),說實話關于底層實現(xiàn)還沒有看明白,看jdk的源碼中的
public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
方法,好長啊
迂回一下,今兒看struts2的具體攔截器Interceptor怎么配置
配置可比自己寫實現(xiàn)攔截器容易多了
1、首先寫一個攔截器類,攔截器類有兩只寫法(目前俺知道的)
一種是顯示com.opensymphony.xwork2.interceptor.Interceptor接口,com.opensymphony.xwork2.interceptor.Interceptor接口有三個方法destroy()、init()和String intercept(ActionInvocation actionInvocation),跟過濾器差不多
這里指出的是init初始化方法將在容器啟動是調用這個方法。
package com.test.interceptor;
/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-15
* Time: 16:34:17
* To change this template use File | Settings | File Templates.
*/
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class MyInterceptor implements Interceptor{
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation actionInvocation) throws Exception {
System.out.println("test intercept begin");
String result = actionInvocation.invoke();
System.out.println("test intercept finish");
return result;
}
}
另一種就是繼承com.opensymphony.xwork2.interceptor.AbstractInterceptor,這是個抽象類,并實現(xiàn)了com.opensymphony.xwork2.interceptor.Interceptor接口,分別實現(xiàn)了init和destroy方法,但什么都沒做,繼承AbstractInterceptor后,實現(xiàn)intercept方法就行了,
這里指出的是在intercept方法中執(zhí)行actionInvocation.invoke();執(zhí)行所攔截的action中的方法;
2、攔截器寫完了剩下就是配置了,這里要用到struts.xml的組織結構<struts>中有<package>包的的概念,包與包之間可以繼承extends,就像子類繼承父類一樣,子類將擁有父類的屬性和配置,我們一般都繼承extends="struts-default",而struts-default定義在struts2-core.jar 中的struts-default.xml中,struts-default包中定義了很多struts2提供的攔截器和攔截器棧(攔截器棧可以包含多個攔截器或攔截器棧),struts2的好多功能都是實現(xiàn)在這些攔截器中,其中有個<default-interceptor-ref name="defaultStack"/>標簽定義了默認的攔截器,如果<action>配置中沒有攔截器配置,那就調用默認攔截器,如果有攔截器配置,要么同時加上默認攔截器,要么在自己的package中加入設置默認攔截器的標簽。
<package name="capinfo" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="com.test.interceptor.MyInterceptor">
</interceptor>
</interceptors>
<action name="HelloWorld"
class="com.capinfo.struts2.action.HelloWordAction">
<result>/HelloWorld.jsp</result>
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- Add your actions here -->
</package>
struts2局部類型轉換
需求為:在頁面的文本框輸入一個x、y坐標,之間用","隔開,Action中有一個Point類型的屬性,Point類里面有兩個字段,分別是x,y,int型,要求當頁面提交時將文本框中的字符串轉換成Point對象,當Action返回到頁面時將Point轉換成字符串顯示
1、首先做一個jsp用于輸入和提交:point.jsp
<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:textfield name="point.x" label="Point.X"></s:textfield>
<s:textfield name="point.y" label="Point.Y"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
2、再建一個用于顯示的jsp-converter.jsp
<body>
<s:property value="point"/><br>
<s:property value="point.x"/><br>
<s:property value="point.y"/><br>
</body>
3、Action類 ConverterAction
public class ConverterAction extends ActionSupport{
private Point point;
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public String execute()throws Exception {
return "success";
}
}
4、struts.xml
<action name="Converter"
class="com.test.struts2.action.ConverterAction">
<result name="success">/converter.jsp</result>
<result name="input">/point.jsp</result>
</action>
5、轉換類 ConverterPoint
public class ConverterPoint extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if(Point.class == toType){
String[] params = (String[])value;
params = params[0].split(",");
Point point = new Point();
point.setX(Integer.parseInt(params[0]));
point.setY(Integer.parseInt(params[1]));
return point;
}else if(String.class == toType){
Point point = (Point)value;
return "x=" + point.getX() + ",y=" + point.getY();
}
return super.convertValue(context, value, toType);
}
}
6、配置轉換
在ConverterAction 類的同一目錄下定義屬性文件ConverterAction-conversion.properties,注意文件名,-conversion.properties為固定不變,ConverterAction為Action的名字,文件內容:
point=com.test.struts2.action.ConverterPoint
Ok了,這樣就完工了