国产美女性感在线观看懂色av,一本一道dvd在线观看免费视频,国产精品免费视频一区http://www.aygfsteel.com/liuspring/category/34385.htmljava .netzh-cnFri, 01 Jan 2010 00:59:47 GMTFri, 01 Jan 2010 00:59:47 GMT60java.lang.InstantiationExceptionhttp://www.aygfsteel.com/liuspring/archive/2009/12/29/307621.htmlTue, 29 Dec 2009 04:19:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/12/29/307621.htmlhttp://www.aygfsteel.com/liuspring/comments/307621.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/12/29/307621.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/307621.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/307621.html

java.lang.InstantiationException

在Struts creating form bean的時候遇到這個異常

在form bean 中加一個無參的構造函數就Ok了



2009-12-29 12:19 發表評論
]]>
java.lang.IllegalStateException STREAMEDhttp://www.aygfsteel.com/liuspring/archive/2009/10/19/298836.htmlMon, 19 Oct 2009 05:48:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/10/19/298836.htmlhttp://www.aygfsteel.com/liuspring/comments/298836.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/10/19/298836.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/298836.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/298836.htmlrequest.getInputStream() 和 request.getReader()不能同時調用,否則會引發java.lang.IllegalStateException異常。

API中有寫:

getInputStream

public ServletInputStream getInputStream()
throws java.io.IOException
Retrieves the body of the request as binary data using a ServletInputStream. Either this method or getReader() may be called to read the body, not both.
Returns:
a ServletInputStream object containing the body of the request
Throws:
java.lang.IllegalStateException - if the getReader() method has already been called for this request
java.io.IOException - if an input or output exception occurred


2009-10-19 13:48 發表評論
]]>
在eclipse中 高亮顯示相同的變量http://www.aygfsteel.com/liuspring/archive/2009/10/17/298706.htmlSat, 17 Oct 2009 12:41:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/10/17/298706.htmlhttp://www.aygfsteel.com/liuspring/comments/298706.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/10/17/298706.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/298706.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/298706.html

eclipse中如果選中一個變量,則在本源文件中高亮顯示相同的變量

Window->Preferences,在type filter text 中輸入Mark Occurrences

在Java-Editor-Mark Occurrences中將Mark occurrences of the selected element in the current file.選中OK即可



2009-10-17 20:41 發表評論
]]>
昨天試著弄了個SSH的demohttp://www.aygfsteel.com/liuspring/archive/2009/10/17/298704.htmlSat, 17 Oct 2009 12:39:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/10/17/298704.htmlhttp://www.aygfsteel.com/liuspring/comments/298704.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/10/17/298704.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/298704.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/298704.html

工作快三年了,一直沒有用到spring,做的幾個項目全部基于struts+hibernate,昨天忙完手頭的活兒,自己建了個struts+spring+hibernate的demo,能用MyEclipse自動生成的全部自動生成,表映射、pojo、SessionFactory、applicationContext.xml、struts-config.xml都自動生成了,弄了兩個jsp,一個add,一個view

運行發現,spring未被加載,原因找來找去找不到,最后還是看了以前寫的一篇blog,可能存在重復jar包,有沖突,確實發現Myeclipse自動鍵入的jar包好多好多,而且有的有重復,搗鼓出以前做的例子,復制lib里面的jar包,果然OK了,實現了增查。

spring確實是個好東西,強大、強大。

Google SSH整合的例子,發現都是Struts2SpringHibernate了,俺還struts1呢,out了



2009-10-17 20:39 發表評論
]]>
google app engine for java:org.datanucleus.exceptions.NucleusUserExceptionhttp://www.aygfsteel.com/liuspring/archive/2009/10/14/298268.htmlWed, 14 Oct 2009 10:01:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/10/14/298268.htmlhttp://www.aygfsteel.com/liuspring/comments/298268.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/10/14/298268.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/298268.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/298268.html開發中遇到這個異常:
NestedThrowablesStackTrace:
Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.
org.datanucleus.exceptions.NucleusUserException: Attempt was made to manually set the id component of a Key primary key. If you want to control the value of the primary key, set the name component instead.

原來的修改代碼是這樣些的:
public void attachDirty(UrlTarget instance) {
        PersistenceManager pm = null;
        try {
           
            pm = PMF.get().getPersistenceManager();
            UrlTarget ut = (UrlTarget) pm.getObjectById(UrlTarget.class, instance.getId());
            ut.setName(instance.getName());
            ut.setRemark(instance.getRemark());
            ut.setUrl(instance.getUrl());
           pm.makePersistent(ut);
        } catch(Exception ex){
            ex.printStackTrace();
        }finally {
            if(pm != null)pm.close();
        }
       
    }

public UrlTarget findById(Long id) {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        try{
            return (UrlTarget) pm.getObjectById(UrlTarget.class, id);
        }catch(Exception ex){
            ex.printStackTrace();
        }finally {
            pm.close();
        }
        return null;
    }
在利用findById方法得到對象后修改,但是findById中pm已經關閉,這就是錯誤的原因了

2009-10-14 18:01 發表評論
]]>
用DateFormat的parse方法驗證字符串是否是日期的問題http://www.aygfsteel.com/liuspring/archive/2009/07/13/286598.htmlMon, 13 Jul 2009 09:11:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/07/13/286598.htmlhttp://www.aygfsteel.com/liuspring/comments/286598.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/07/13/286598.html#Feedback1http://www.aygfsteel.com/liuspring/comments/commentRss/286598.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/286598.html 今天不錯,發現一個,恩,感覺不錯
做了一個上傳Excel并解析數據然后入庫的功能,里面涉及到是否是日期格式的判斷
之前是這么寫的(深諳這么寫是不好的,但以為它是可靠的)

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

現在發現問題了,對于“2008-06-23asdf”這種情況是返回true的,哈哈,看來是孤陋寡聞了,基礎不扎實了,看API上這樣講:

在默認情況下,進行的分析是不嚴格的:如果輸入的形式不是此對象的格式化方法使用的形式,但仍可作為日期進行分析,則分析將獲得成功。客戶機可能通過調用 setLenient(false) 來強調嚴格遵守該格式。


按照API說法,將代碼改成
private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            sdf. setLenient(false);
            sdf.parse(content);
            return true;
        } catch (Exception e){
            return false;
        }
    }

運行結果“2008-06-23asdf”這種情況還是返回true的,但“2008-13-23”這種情況是返回false的
最后改進程這種寫法,可以適應"yyyy-MM-dd""yyyy-M-d""yyyy-MM-d""yyyy-M-dd"

private boolean checkDate(String content) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
        try {
            sdf.setLenient(false);
            content = content.replaceAll("-0", "-");
            Date d = sdf.parse(content);
            String s = sdf.format(d);
            return content.equals(s);
        } catch (Exception e){
            return false;
        }
    }

參考資料http://www.99inf.net/SoftwareDev/Java/52734.htm
              http://blog.163.com/everlee@126/blog/static/263574220089822631229/

當然也可以用正則表達式做到。

2009-07-13 17:11 發表評論
]]>
部署我的Google App Enginehttp://www.aygfsteel.com/liuspring/archive/2009/04/19/266351.htmlSat, 18 Apr 2009 16:32:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/04/19/266351.htmlhttp://www.aygfsteel.com/liuspring/comments/266351.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/04/19/266351.html#Feedback5http://www.aygfsteel.com/liuspring/comments/commentRss/266351.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/266351.html     好長時間了,聽說Google出了個Google App Engine - Google Code,說是可以讓用戶上傳自己的應用,但是只支持python,當時就想什么

時候支持java啦啊,上個月看新聞就聽說Google app engine 要開始支持java啦,哈哈,喜,到時候把我的寫的blog傳上去,哈哈
    上周,終于知道了Google app engine終于開始宣布支持java了,哈哈呼呼,動手,到官網一看,沒有支持java的動靜啊,

對,英文頁面,哈哈,看來中文的還是慢一拍啊
    首先到注冊一個,竟然還要手機號發注冊碼,Google了一下 說在手機號前加 86就OK了,填上手機號點按鈕,呦,短信馬

上就來啦,搞定,注冊成功。
    這下下載SDK,還有eclipse插件,幫助文檔只有英文的,配合Google工具欄的翻譯功能,基本能看懂,哈哈,感覺一路下

來,英語水平有所上升啊,哈哈
    打開eclipse,裝上插件,很輕松的建了第一個應用,插件自動生成了一個小實例,部署上去,驚嘆于Google的GWT
    開始一直我原來寫的blog程序,原來到處找免費的空間,jsp的空間不好找,先是找了http://www.eatj.com/,但是沒24小

時(好像是)就會自動停止,必須手動重啟服務,原來還堅持去上去看看,后來終于因為有一次很忙時間太長被注銷了,接下來就聽

說了http://www.stax.net/,跟Google的路子差不多,好像還更自定義些,繼續使用著,搞java朋友可以去看看
    因為google app engine使用Google Account,原來的用戶管理模塊需要剔除,原來數據庫使用的是mysql hibernate,現在

Google 使用JDO,數據庫被封裝了,還好,當初設計是采用了工廠模式,實現了數據庫訪問模塊與業務處理模塊的松耦合,很容易

配置數據庫訪問模塊的更改,感受到好的設計真是為以后修改省很多事啊。
    接著說部署我的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、決定轉戰Linux..
    手上有四個版本的Linux,Ubuntu,Redhat,Fedora,openSUSE,都裝過,后來感覺還是Fedora比較好用,我裝的是

Fedora9,Fedora10正在下載中

以下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?

在命令行執行: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節中。如果需要,創建這個節:

Section "ServerFlags"
        Option      "NoAutoAddDevices"
EndSection


3、第一,安裝JDK
第一,到http://java.sun.com下載最新JDK,當前本人下載的是jdk1.6.0_02!下載文件:jdk-6u2-linux-i586-rpm.bin.注意是

rpm.bin的!

第二,給下載回來的文件增加執行權限:chmod 755 jdk-6u2-linux-i586-rpm.bin.

第三,執行文件:./jdk-6u2-linux-i586-rpm.bin.

第四,執行文件產生一個rpm文件,可直接雙擊執行也可以在shell下執行:rpm -ivh jdk-6u2-linux-i586-rpm.

第五:配置環境變量,環境變量配置可在全局文件/etc/profile下修改,這樣所有linux系統的用戶都可以用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

第五,當環境變量修改完后,重起系統,在shell下輸入java,看是否輸入相關JAVA幫助信息,如果有,說明已經安裝成功!如果沒有,

檢查一下變量環境設置是否有誤!

2,安裝Eclipse,Eclipse不需要安裝,只要解壓縮就行了

運行Google app Engine不需要Tomcat
3,安裝tomcat的方法跟安裝eclipse的一樣,也是下一個tar.gz的文件按安裝eclipse方法和步驟就行了!進入tomcat/bin

下./startup.sh,如果在shell出現jdk的相關信息說明已經安裝成功啟動了,在firefox下打http://localhost:8080/出現tomcat頁就

大成功了!

在以上的安裝過程之中,出現了小插曲,就是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文件加個參數
-vmargs
-Dorg.eclipse.swt.browser.XULRunnerPath=

在Fedora9中安裝拼音輸入法
保證Fedora 9聯網的狀態下
在application->system tools->terminal 應用程序->系統工具->終端
輸入
su 回車
提示輸入root密碼
yum install scim 回車
系統會自動從一個鏡uy像站點檢索scim,并詢問是否下載,選擇y
下載完成后輸入
yum install scim-pinyin 回車
提示和操作如上
然后輸入
scim 回車
(筆者的電腦運行到starting SCIM后就沒有反應了,不過沒關系這時候可以按ctrl+c中斷)
選擇Fedora 9
System->Preference->Personal->Input Method
系統->首選項->個人->輸入法
選擇啟用新特性,然后選擇里面的SCIM,然后選擇配置SCIM,
在進入后的界面中選擇Global Set 全局設置,在這里設置激活熱鍵即可,然后重新啟動電腦,就可以在Fedora 9下面使用中文輸入

法了 雖然有點麻煩 但畢竟fedora等眾多linux桌面系統還很年輕,有很多不足之處。

參考資料:
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


2009-04-19 00:32 發表評論
]]>
hibernate異常http://www.aygfsteel.com/liuspring/archive/2009/03/31/263103.htmlTue, 31 Mar 2009 05:27:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/03/31/263103.htmlhttp://www.aygfsteel.com/liuspring/comments/263103.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/03/31/263103.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/263103.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/263103.html備案:
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode


hibernate查詢時報上面的異常,仔細檢查hql寫的有不對的地方,我就是把逗號,寫成點.

2009-03-31 13:27 發表評論
]]>
獲取這個月的最后一天http://www.aygfsteel.com/liuspring/archive/2009/03/31/263101.htmlTue, 31 Mar 2009 05:23:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/03/31/263101.htmlhttp://www.aygfsteel.com/liuspring/comments/263101.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/03/31/263101.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/263101.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/263101.html給你一個日期2009-01-01 00:00:00 獲取這個月的最后一天。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=null;
try {
    date = sdf.parse("2009-12-01 00:00:00");
} catch (ParseException e) {
    e.printStackTrace();
}
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DATE, calendar
        .getActualMaximum(Calendar.DATE));
Date d = calendar.getTime();
System.out.println(sdf.format(d));


2009-03-31 13:23 發表評論
]]>
開始學習struts2(六)http://www.aygfsteel.com/liuspring/archive/2009/01/16/251588.htmlFri, 16 Jan 2009 08:08:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/01/16/251588.htmlhttp://www.aygfsteel.com/liuspring/comments/251588.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/01/16/251588.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/251588.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/251588.html public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
方法,好長啊
迂回一下,今兒看struts2的具體攔截器Interceptor怎么配置
配置可比自己寫實現攔截器容易多了
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,這是個抽象類,并實現了com.opensymphony.xwork2.interceptor.Interceptor接口,分別實現了init和destroy方法,但什么都沒做,繼承AbstractInterceptor后,實現intercept方法就行了,
這里指出的是在intercept方法中執行actionInvocation.invoke();執行所攔截的action中的方法;
2、攔截器寫完了剩下就是配置了,這里要用到struts.xml的組織結構<struts>中有<package>包的的概念,包與包之間可以繼承extends,就像子類繼承父類一樣,子類將擁有父類的屬性和配置,我們一般都繼承extends="struts-default",而struts-default定義在struts2-core.jar 中的struts-default.xml中,struts-default包中定義了很多struts2提供的攔截器和攔截器棧(攔截器棧可以包含多個攔截器或攔截器棧),struts2的好多功能都是實現在這些攔截器中,其中有個<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>



2009-01-16 16:08 發表評論
]]>
開始學習struts2(五)http://www.aygfsteel.com/liuspring/archive/2009/01/13/251091.htmlTue, 13 Jan 2009 03:26:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/01/13/251091.htmlhttp://www.aygfsteel.com/liuspring/comments/251091.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/01/13/251091.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/251091.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/251091.html 先看看攔截器的實現
實現攔截器有這么幾個東西構成
1、目標對象-將被攔截的對象,這個對象中的方法被調用是將被攔截
要求目標對象面向接口編程,首先要定義接口
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:37:23
* 面向接口編程
* 目標對象的接口
*/
public interface TargetInterface {
    public void doSomething();
}
目標對象實現
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:36:26
* 目標對象
*/
public class Target implements TargetInterface{
    public void doSomething(){
        System.out.println("do something");
    }
}

2、攔截器對象-里面包含在調用目標對象前或后要調用的方法
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:39:32
* 攔截器
*/
public class Interceptor {
    public void before(){
        System.out.println("before");
    }

    public void after(){
        System.out.println("after");
    }
}

3、處理器-處理器決定攔截器如何攔截目標對象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:41:08
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* 處理器
* 在這里將目標對象Target和攔截器Interceptor聯系在了一起
*/
public class MyHandler implements InvocationHandler{

    /**
     * 目標對象
     * 將來目標對象的方法將被注入interceptor
     */
    private Object object;

    /**
     * 攔截器
     * MyHandler負責將Interceptor這個攔截器注入到傳入的目標對象object
     */
    private Interceptor interceptor = new Interceptor();

    public void setObject(Object object){
        this.object = object;
    }

    /**
     * 實現InvocationHandler接口的方法
     * @param o 在其上調用方法的代理實例
     * @param method 對應于在代理實例上調用的接口方法的 Method 實例
     * @param objects 包含傳入代理實例上方法調用的參數值的對象數組
     * @return  從代理實例的方法調用返回的值
     * @throws Throwable
     */
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        Object result = null;
        interceptor.before();
        result = method.invoke(object,objects);
        interceptor.after();
        return result;
    }
}

4、代理對象-用于得到目標對象的代理對象
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:50:52
* 代理類
*/
import java.lang.reflect.Proxy;
public class MyProxy {
    /**
     * 返回obj的,處理器為MyHandler的代理對象
     * @param obj 目標對象
     * @return  目標對象的代理對象
     */
    public Object getProxy(Object obj){
        MyHandler myHandler = new MyHandler();
        myHandler.setObject(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(),myHandler);
    }
}

5、最后客戶調用代碼
package com.test.interceptor;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-9
* Time: 17:55:45
* 客戶調用
*/
public class Client {
    public static void main(String[] args){
        //目標對象
        TargetInterface target = new Target();
        //代理對象
        MyProxy myProxy = new MyProxy();
        //通過代理對象得到目標對象的代理
        TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
        //通過目標對象的代理調用目標對象的方法
        proxy.doSomething();
    }
}

//輸出:
//before 
//do something
//after

將自己的理解寫了注釋,現在只理解到這個程度,像
Proxy.newProxyInstance
里面是怎么實現的,還沒深入考究
繼續努力



2009-01-13 11:26 發表評論
]]>
開始學習struts2(四)http://www.aygfsteel.com/liuspring/archive/2009/01/08/250480.htmlThu, 08 Jan 2009 05:30:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/01/08/250480.htmlhttp://www.aygfsteel.com/liuspring/comments/250480.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/01/08/250480.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/250480.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/250480.html
public class ConverterPoint extends StrutsTypeConverter {

//    @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);
//    }

    @Override
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
        String[] params = arg1;//(String[])value;
        params = params[0].split(",");
        Point point = new Point();
        point.setX(Integer.parseInt(params[0]));
        point.setY(Integer.parseInt(params[1]));
        return point;
    }

    @Override
    public String convertToString(Map arg0, Object arg1) {
        Point point = (Point)arg1;
        return "x=" + point.getX() + ",y=" + point.getY();
    }

   
}

原來是繼承ognl.DefaultTypeConverter類,現在改成繼承org.apache.struts2.util.StrutsTypeConverter類了,看org.apache.struts2.util.StrutsTypeConverter的源碼可知道org.apache.struts2.util.StrutsTypeConverter是個抽象類,并實現了ognl.TypeConverter,org.apache.struts2.util.StrutsTypeConverter中有兩個要實現的方法一個convertFromString,一個convertToString,看方法名字就知道一個從字符串轉換成Object,一個是將Object轉換成String,這樣好像更加清晰

另外還有一種全局轉換的配置,就是建立一個統一的屬性文件,文件名為xwork-conversion.properties,與struts.xml位于統一目錄下,里面的配置改成了
com.test.struts2.data.Point=com.test.struts2.action.ConverterPoint
意思是所有com.test.struts2.data.Point類型的對象都要通過com.test.struts2.action.ConverterPoint來轉換



2009-01-08 13:30 發表評論
]]>
開始學習struts2(三)http://www.aygfsteel.com/liuspring/archive/2009/01/05/249898.htmlMon, 05 Jan 2009 05:12:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/01/05/249898.htmlhttp://www.aygfsteel.com/liuspring/comments/249898.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/01/05/249898.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/249898.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/249898.htmlstruts2局部類型轉換

需求為:在頁面的文本框輸入一個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了,這樣就完工了



2009-01-05 13:12 發表評論
]]>
開始學習struts2(二)http://www.aygfsteel.com/liuspring/archive/2009/01/05/249859.htmlMon, 05 Jan 2009 02:47:00 GMThttp://www.aygfsteel.com/liuspring/archive/2009/01/05/249859.htmlhttp://www.aygfsteel.com/liuspring/comments/249859.htmlhttp://www.aygfsteel.com/liuspring/archive/2009/01/05/249859.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/249859.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/249859.html前兩天初步認識了一下struts2
今兒看來教程的第二三講,搞清了一些前面的一些猜測或是疑問
1、struts2是不用<html:...>標簽了,統一成了<s:...>
如下這樣:
<s:form action="Converter">
<s:textfield name="point" label="Point"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
顯示效果:

注意到<s:textfield name="point" label="Point"></s:textfield>
中的label屬性,它指定了文本框前面顯示的內容,還自動加了冒號,哈哈,挺聰明的嘛,但是擔心這樣在復雜的頁面設計中是不是好使。

哦對了,要想這么寫,要在頁面上方加上這個:<%@ taglib prefix="s" uri="/struts-tags" %>

2、Action
前面說的Action不再需要繼承任何struts類,現在看來要失望了,為了方便起見還是建議集成ActionSupport類,目前覺得有用的是ActionSupport中定義了幾個static的result name,比如SUCCESS、ERROR,原來的return "success";現在可以寫成return super.SUCCESS;,將標識用的字符串常量定義成static的是一直提倡的,還有就是validate()方法,驗證有錯誤可以調用addFieldError()方法,好像就是struts1 ActionForm里的東西,有所改進的是super.addFieldError("username", "username is null");將在頁面中顯示的效果為:錯誤信息"username is null"將在名字為"username"文本框的上面顯示,這些如果能用ajax實現就好了。
對于Action解耦,可能在于它不再需要HttpServletRequest 、HttpServletResponse這樣的容器運行時參數吧

Powered by Zoundry Raven



2009-01-05 10:47 發表評論
]]>
開始學習struts2http://www.aygfsteel.com/liuspring/archive/2008/12/29/249013.htmlMon, 29 Dec 2008 15:06:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/12/29/249013.htmlhttp://www.aygfsteel.com/liuspring/comments/249013.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/12/29/249013.html#Feedback6http://www.aygfsteel.com/liuspring/comments/commentRss/249013.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/249013.html 經濟危機中,趕緊為自己充充電,好到時候柳暗花明又一村,哈哈
學struts2
據說struts2基于webwork,基本上跟struts1沒啥關系,如果有webwork的經驗上手會很迅速
我沒接觸過webwork,就知道有這么個東西
今兒開始第一個struts
見過好多blog寫有struts2的入門步驟,俺也寫一個,為自己造個輪子,加深印象。
首先下載struts2的jar包,到http://struts.apache.org/,右上角有個struts2的鏈接,今天下到的是
struts2的2.0.14,昨天在javaeye上看到發布Struts2.1.3 發布了,只是主頁還沒看到,不止一次聽大拿們說過不要追求新版本,哈哈
下載后的目錄:app--struts的例子
              docs-doc文檔
              lib-struts的jar包或依賴包
              src-源碼
HelloWorld:

1、index.jsp
  耳目一新的是,不需要用到struts html標簽,這只是猜測,或許例子過于簡單?今天工作中還感覺struts1的html標簽真是不好用,想加個class、maxlength、size都不好使,讓我很是郁悶。希望在繼續學習中真的能耳目一新。
struts的action慣例后綴名改成了.action,不再像struts1的.do了,說是延續到webwork的慣例。
下面的頁面代碼submit的時候將提交到login.action
index.jsp
<body>
  <form action="login.action" method="post">
      username:<input type="text" name="username"/>
      password:<input type="password" name="password"/>
      <input type="submit" value="submit"/>
  </form>
</body>
2、Action類
struts2的Action可是大進步,不用再繼承任何類,實現了松耦合,它好像將struts1的ActionForm融合了進來,據說struts2不再用ActionForm,頁面上對應的字段寫在了Action中,struts2框架會自動調用get/set方法,在我印象里struts1中的Action對象不是線程安全的,會在不同線程間重用,所以謹慎在里面定義字段,在這看來struts2的Action不是這樣的,只是猜測
package com.mystart.action;

public class LoginAction {

    private String username;
    private String password;
  
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
  
    public String execute() throws Exception{
        return "success";
    }
}

3、jsp、java類都定義了,現在要它們聯系起來-struts配置文件
新的struts配置文件有個package包的概念,還沒鬧明白這個package的詳細用法,有待繼續深入
<action>標簽有變化,type變成了class,path變成了name,struts1中name屬性是制定ActionForm的,現在ActionForm沒有了
forward變成了result,result的默認name=success

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
    <package name="struts" extends="struts-default">
        <action name="login" class="com.mystart.action.LoginAction">
            <result name="success">/result.jsp</result>
        </action>
    </package>

</struts>

4、最后啟動struts2,配置web.xml
struts1的web.xml配置是放在<servlet>中,也就是是一個servlet
struts2變成了一個過濾器Filter
struts1中<url-pattern>被配置成攔截.do的鏈接
struts2變成了攔截所有鏈接 /*

<?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>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

以上是驢了個struts的視頻教程,今兒看了第一節課,看完后做了一下總結,里面有一些自己的理解,有不對的地方請兄弟們指正,別光光說我是豬,豬也要進步啊,嘿嘿,每一步都有疑問,明天帶著問題接著看下一節,睡覺去。


2008-12-29 23:06 發表評論
]]>
自定義Annotationhttp://www.aygfsteel.com/liuspring/archive/2008/12/28/248762.htmlSun, 28 Dec 2008 08:47:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/12/28/248762.htmlhttp://www.aygfsteel.com/liuspring/comments/248762.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/12/28/248762.html#Feedback6http://www.aygfsteel.com/liuspring/comments/commentRss/248762.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/248762.html 早就知道jdk5加了新特性Annotation,但是沒研究過,前幾天公司培訓,有一部分是介紹jdk5新特性的,一個是注解一個泛型
今兒復習一下注解
    //用@Deprecated聲明該方法不建議使用
    @Deprecated public void doSomething1(){
        Map map = new HashMap();
        map.put("some", "thing");
        System.out.println(map);
    }
   
    //用@SuppressWarnings聲明不再進行類型檢查
    @SuppressWarnings(value={"unchecked"})
    public void doSomething2(){
        Map map = new HashMap();
        map.put("some", "thing");
    }


寫一個自定義注解先
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//要在運行時使用這個注解,必須聲明成RUNTIME
Annotation分為三種級別:RUNTIME、CLASS、SOURCE
@Retention(RetentionPolicy.RUNTIME)
public @interface SomeAnnotation{
    String value();
    String name();
}

下面來使用這個自定義注解:
import java.lang.reflect.Method;
public class AnnotationTest {
   
    @SomeAnnotation(value="value1",name="name1")
    public void doSomething3(){
       
    }
   
    public static void main(String[] args){
   
        Class<AnnotationTest> c = AnnotationTest.class;
        try {
            //利用反射得到方法doSomething3
            Method method = c.getMethod("doSomething3");
            //查找doSomething3方法是否有SomeAnnotation的Annotation
            if(method.isAnnotationPresent(SomeAnnotation.class)){
                System.out.println("找到SomeAnnotation");
                //得到SomeAnnotation
                SomeAnnotation annotation = method.getAnnotation(SomeAnnotation.class);
                System.out.println("annotation.value="+annotation.value());
                System.out.println("annotation.name="+annotation.name());
            }else{
                System.out.println("沒有找到omeAnnotation");
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

輸出結果:
找到SomeAnnotation
annotation.value=value1
annotation.name=name1


2008-12-28 16:47 發表評論
]]>
Eclipse設置項目jdk的問題http://www.aygfsteel.com/liuspring/archive/2008/12/04/244376.htmlThu, 04 Dec 2008 07:02:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/12/04/244376.htmlhttp://www.aygfsteel.com/liuspring/comments/244376.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/12/04/244376.html#Feedback1http://www.aygfsteel.com/liuspring/comments/commentRss/244376.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/244376.html因為要修改一個以前的老項目,老項目用的jdk是1.4版本,遂在項目右鍵Properties-Java Compiler中將Compiler compliance level 設成了1.4

以為萬事大吉了呢,昨晚上因為Integer的一個方法發現了問題

Integer中有個方法valueOf

static Integer valueOf(int i)
返回一個表示指定的 int 值的 Integer 實例。
static Integer valueOf(String s)
返回保持指定的 String 的值的 Integer 對象。
static Integer valueOf(String s, int radix)
返回一個 Integer 對象,該對象中保持了用第二個參數提供的基數進行分析時從指定的 String 中提取的值。

其中valueOf(int i)

從以下版本開始:
1.5

也就是在1.5之前沒有這個方法,但是在eclipse中卻有這個方法的提示

找了半天,原來問題出在這,在Java Build Path 中Libraries 中jdk是1.5的,把它remove掉,添加一個1.4的就OK了

還是功力不夠啊 充電 充電ing



2008-12-04 15:02 發表評論
]]>
重溫Hibernate基礎--get/load的區別http://www.aygfsteel.com/liuspring/archive/2008/11/07/239169.htmlFri, 07 Nov 2008 02:15:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/11/07/239169.htmlhttp://www.aygfsteel.com/liuspring/comments/239169.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/11/07/239169.html#Feedback2http://www.aygfsteel.com/liuspring/comments/commentRss/239169.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/239169.html下了個Hibernate視頻教程聽,雖然一年多以前跟老師學過Hibernate,但現在聽聽還是有很多收獲的,發現自己的知識知道的都是些皮毛,用了很久的東西,知道怎么操作怎么用,但要說說它的所以然,搖搖頭,呵呵

根據主鍵Id得到一個持久對象,Hibernate中有兩個方法,一個get,一個load,他們兩個參數相同,都返回一個Object

它們的區別:
執行get方法即時生成查詢sql去查詢數據庫得到相應的pojo,如果數據庫中沒有相應記錄,則返回null
執行load方法不會即時產生sql語句,而是在用到返回的對象時采取查詢數據庫,也就是load方法有默認的延遲加載,在執行load方法后返回的不是一個pojo對象,是pojo對象的一個代理(據說Hibernate是用代理的方式實現延遲加載的,這塊還迷糊),如果數據庫中沒有相應記錄,load方法會拋出異常ObjectNotFoundException
看了一下我們用MyEclipse hibernate工具通過數據庫生成的DAO類,它的findById方法是用的session.get()方法,這是即時獲得pojo對象,如果是load方法,在執行完load后如果關閉了session,那在接下來用到這個pojo對象時恐怕會報session已關閉的錯誤。
還有就是這兩個方法的第二個參數id,它必須是實現了java.io.Serializable接口,也就是可序列化的。

今天好像是立冬,冬天到了,抓緊時間充充電,明天接著學...



2008-11-07 10:15 發表評論
]]>
javascript 將給定日期增加n個月http://www.aygfsteel.com/liuspring/archive/2008/10/26/236737.htmlSun, 26 Oct 2008 10:37:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/10/26/236737.htmlhttp://www.aygfsteel.com/liuspring/comments/236737.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/10/26/236737.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/236737.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/236737.html     function addDate(dtDate,NumDay){
        var date = new Date(dtDate);
        var lIntval = parseInt(NumDay);
        date.setMonth(date.getMonth() + lIntval);
        return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate();
    }

addDate("2008-01-01".replace(/-/g, "\/"),2);


=======================================
// addDate("5",5,"2004/12/1 00:00:00")
function addDate(type,NumDay,dtDate){
   var date = new Date(dtDate)
type = parseInt(type) //類型
lIntval = parseInt(NumDay)//間隔
switch(type){
   case 6 ://年
date.setYear(date.getYear() + lIntval)
break;
case 7 ://季度
date.setMonth(date.getMonth() + (lIntval * 3) )
break;
case 5 ://月
date.setMonth(date.getMonth() + lIntval)
break;
case 4 ://天
date.setDate(date.getDate() + lIntval)
break
case 3 ://時
date.setHours(date.getHours() + lIntval)
break
case 2 ://分
date.setMinutes(date.getMinutes() + lIntval)
break
case 1 ://秒
date.setSeconds(date.getSeconds() + lIntval)
break;
default:
   
}
return date.getYear() +'-' + (date.getMonth()+1) + '-' +date.getDate()+ ' '+ date.getHours()+':'+date.getMinutes()+':'+date.getSeconds()
}

2008-10-26 18:37 發表評論
]]>
DWR Converthttp://www.aygfsteel.com/liuspring/archive/2008/10/23/236219.htmlThu, 23 Oct 2008 09:34:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/10/23/236219.htmlhttp://www.aygfsteel.com/liuspring/comments/236219.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/10/23/236219.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/236219.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/236219.html Class c = Class.forName(ClassName);
方式產生的對象,
它被是別為java.lang.Class

2008-10-23 17:34 發表評論
]]>
隨機快速排序算法http://www.aygfsteel.com/liuspring/archive/2008/10/23/236213.htmlThu, 23 Oct 2008 09:24:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/10/23/236213.htmlhttp://www.aygfsteel.com/liuspring/comments/236213.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/10/23/236213.html#Feedback3http://www.aygfsteel.com/liuspring/comments/commentRss/236213.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/236213.html 還沒怎么整明白,有點暈
Java語言:
import java.util.*;
public class Test {


    int[] x = {3,7,5,6,4,9,8,1};
    int comps = 0;
    void quicksort(int l, int u)
    {
        int i, m;
        if (l >= u) return;
        swap(l, getRandom(l, u));
        m = l;
       
        comps += u - 1;
        for (i = l+1; i <= u; i++){
            //comps++;
            if (x[i] < x[l])
                swap(++m, i);
        }
        swap(l, m);
        quicksort(l, m-1);
        quicksort(m+1, u);
    }
   
    void swap(int a,int b){
        int temp = x[a];
        x[a] = x[b];
        x[b] = temp;
    }
   
    int getRandom(int min,int max){ 
          return (int)(Math.random()*(max-min+1)) + min;
          //Math.round(Math.random()*(Max-Min)+Min);
    }
   
    public static void main(String[] args) {
        Test t = new Test();
        System.out.println(Arrays.toString(t.x));
        t.quicksort(0,t.x.length - 1);
        System.out.println(t.comps);
        System.out.println(Arrays.toString(t.x));
    }
   

}




2008-10-23 17:24 發表評論
]]>
用javascript獲取和設置stylehttp://www.aygfsteel.com/liuspring/archive/2008/10/10/233589.htmlFri, 10 Oct 2008 06:49:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/10/10/233589.htmlhttp://www.aygfsteel.com/liuspring/comments/233589.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/10/10/233589.html#Feedback1http://www.aygfsteel.com/liuspring/comments/commentRss/233589.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/233589.html好久沒寫了
中間過了個十一,在家混沌過了好幾天

回來轉眼上了一星期班了,忙的屁滾尿流
一年前的系統要增加兩個大功能,200多個報表要挨個修改,報表校驗的頁面效果客戶又提出了新建議,一個字 改

從昨天晚上開始搗鼓到現在終于解決了一個問題,心情好了些,上來寫寫,哈哈

這兩天用了baidu 百度空間中的彈出窗口js,感覺不錯,很強大,很好很簡單的解決了好幾個問題,界面友好度以及美化也好多了,以前都是硬邦邦window.open();

有興趣的朋友搜索"百度 popup"就好了,已經有人給出了注釋,強大。

最有意思的是用javascript獲取和設置style

DOM標準引入了覆蓋樣式表的概念,當我們用document.getElementById("id").style.backgroundColor 獲取樣式時 獲取的只是id中style屬性中設置的背景色,如果id中的style屬性中沒有設置background-color那么就會返回空,也就是說如果id用class屬性引用了一個外部樣式表,在這個外部樣式表中設置的背景色,那么不好意思document.getElementById("id").style.backgroundColor 這種寫法不好使,如果要獲取外部樣式表中的設置,需要用到window對象的getComputedStyle()方法,代碼這樣寫window.getComputedStyle(id,null).backgroundColor
但是兼容問題又來了,這么寫在firefox中好使,但在IE中不好使
兩者兼容的方式寫成
window.getComputedStyle?window.getComputedStyle(id,null).backgroundColor:id.currentStyle["backgroundColor"];
如果是獲取背景色,這種方法在firefox和IE中的返回值還是不一樣的,IE中是返回"#ffff99"樣子的,而firefox中返回"rgb(238, 44, 34) "
值得注意的是:window.getComputedStyle(id,null)這種方式不能設置樣式,只能獲取,要設置還得寫成類似這樣id.style.background="#EE2C21";

參考:
JavaScript權威指南
http://bokee.shinylife.net/blog/article.asp?id=817
http://book.csdn.net/bookfiles/679/10067921329.shtml



2008-10-10 14:49 發表評論
]]>
用Url Rewrite Filter重寫urlhttp://www.aygfsteel.com/liuspring/archive/2008/09/24/230953.htmlWed, 24 Sep 2008 10:04:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/24/230953.htmlhttp://www.aygfsteel.com/liuspring/comments/230953.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/24/230953.html#Feedback4http://www.aygfsteel.com/liuspring/comments/commentRss/230953.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/230953.html今天發現一個好東西

Url Rewrite Filter

它可以實現url重寫,從而隱藏實際的url,同時使url看起來更美觀,簡單

最令人興奮的是它一下解決了一值在尋找的blog用戶訪問自己的空間的問題

比如http://hi.baidu.com/liuspring 就顯示我的空間

1、下載Url Rewrite Filter

2、在項目的web.xml配置過濾器

XML語言:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>debug</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


3、將urlrewrite-2.6.0.jar放入lib文件夾
4、新建urlrewrite.xml文件置于WEB-INF目錄
5、配置urlrewrite.xml

XML語言: 臨時自用代碼@代碼發芽網
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
"http://tuckey.org/res/dtds/urlrewrite2.6.dtd">

<!--

Configuration file for UrlRewriteFilter
http://tuckey.org/urlrewrite/

-->
<urlrewrite>
<rule>
<from>^/([a-z]+)/?$</from>
<to type= "forward" >/blogView.do?go=$1</to>
</rule>

<rule>
<note> 這是一個通用請求url rewrite</note>
<from>^/([a-z0-9A-Z_]+)/([a-z0-9A-Z_]+)/?$</from>
<to type= "forward" >/$2.do?go=$1</to>
</rule>


<outbound-rule>
<note>
The outbound-rule specifies that when response.encodeURL is called (if you are using JSTL c:url)
the url /rewrite-status will be rewritten to /test/status/.

The above rule and this outbound-rule means that end users should never see the
url /rewrite-status only /test/status/ both in thier location bar and in hyperlinks
in your pages.
</note>
<from>/rewrite-status</from>
<to>/test/status/</to>
</outbound-rule>

</urlrewrite>




url匹配使用正則表達式的規則,
實驗中發現一個問題,就是必須把里面的正則表達式用小括號括起來,在正則表達式中叫分組
不然會報異常:
java.lang.IndexOutOfBoundsException: No group 2
哈哈,前幾日還費勁的自己寫Servlet重寫url呢,原來這有現成的,更加覺得自己現在的水平遇到的問題網上的前輩們早都遇到過了,一定要站在巨人的肩膀上,少走彎路啊。


把我的servlet貼在這,呵呵,參考自blojsom

Java語言: 臨時自用代碼@代碼發芽網
package com.capinfo.servlet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.capinfo.util.PageConstraint;
import com.capinfo.util.PigBlogUtil;


import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
*
* @author Administrator
*
*/
public class PigBlogServlet extends HttpServlet {

protected Log _logger = LogFactory.getLog(PigBlogServlet.class);



/**
* Initialize
*
* @param servletConfig {@link ServletConfig}
* @throws ServletException If there is an error initializing
*/
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
}

/**
* Handle requests made to
*
* @param httpServletRequest {@link HttpServletRequest} request
* @param httpServletResponse {@link HttpServletResponse} response
* @throws ServletException If there is an error serving the request
* @throws IOException If there is an error serving the request
*/
protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {


// Make sure that we have a request URI ending with a / otherwise we need to
// redirect so that the browser can handle relative link generation
// if (!httpServletRequest.getRequestURI().endsWith("/")) {
// StringBuffer redirectURL = new StringBuffer();
// redirectURL.append(httpServletRequest.getRequestURI());
// redirectURL.append("/");
// if (httpServletRequest.getParameterMap().size() > 0) {
// redirectURL.append("?");
// redirectURL.append(PigBlogUtil.convertRequestParams(httpServletRequest));
// }
//
// if (_logger.isDebugEnabled()) {
// _logger.debug("Redirecting the user to: " + redirectURL.toString());
// }
//
// httpServletResponse.sendRedirect(redirectURL.toString());
//
// return;
// }



// Check for an overriding id
String blogId = httpServletRequest.getParameter(PageConstraint.GO);
if (PigBlogUtil.checkNullOrBlank(blogId)) {
String blogIdFromPath = PigBlogUtil.getBlogFromPath(httpServletRequest.getPathInfo());
if (blogIdFromPath == null) {
blogId = PageConstraint.GO1;
} else {
blogId = blogIdFromPath;
}
}

if (PigBlogUtil.checkNullOrBlank(blogId)) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND, "Blog ID not specified");

return;
}
StringBuffer redirectURL = new StringBuffer();

//redirectURL.append(httpServletRequest.getContextPath());
System.out.println(httpServletRequest.getRequestURI());
if(httpServletRequest.getRequestURI().indexOf("/blog/") > -1 && httpServletRequest.getRequestURI().indexOf(".jsp") == -1 ){
if(!httpServletRequest.getRequestURI().endsWith("/") && httpServletRequest.getRequestURI().indexOf(".do") > -1){
redirectURL.append(httpServletRequest.getRequestURI().substring(httpServletRequest.getRequestURI().lastIndexOf("/"), httpServletRequest.getRequestURI().length()));

}else if(httpServletRequest.getRequestURI().indexOf("/blog/") == -1){

}else{
redirectURL.append("/blogView.do");

}
redirectURL.append("?go=");
redirectURL.append(blogId);

httpServletRequest.getRequestDispatcher(redirectURL.toString())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(redirectURL.toString());
}else{
httpServletRequest.getRequestDispatcher(httpServletRequest.getRequestURI())
.forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
//httpServletResponse.sendRedirect(httpServletRequest.getRequestURI());
}
System.out.println(redirectURL.toString());
return;


}

/**
* Take out of service
*/
public void destroy() {
super.destroy();

if (_logger.isDebugEnabled()) {
_logger.debug(" destroyed");
}
}
}






 



2008-09-24 18:04 發表評論
]]>
普元培訓第五天http://www.aygfsteel.com/liuspring/archive/2008/09/18/229796.htmlThu, 18 Sep 2008 13:01:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/18/229796.htmlhttp://www.aygfsteel.com/liuspring/comments/229796.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/18/229796.html#Feedback6http://www.aygfsteel.com/liuspring/comments/commentRss/229796.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/229796.html培訓最后一天,報表~

感覺普元的報表有點水晶的味道,弄了個分組報表,又建數據源又建數據集有設行分組,列分組的,趕緊挺麻煩,沒有用潤乾好使,雖然潤乾工作量也挺大

看來老板要貼了心上普元了,接下來可能要實戰了,不知道啥樣,現在有兩點困難;

1\、普元報的錯誤,無從下手,不知道哪出的毛病,比如有時在展現層的毛病,而在邏輯處理層報錯,摸不著頭腦啊。

2、普元的構件不熟悉,據說有1000多個構件,不像java api一樣按照功能分的包,它是按層分的包,業務邏輯層構件、運算層構件、展現層構件。要實現一個功能怎么能知道構件包里有沒有現成的,恐怕這只能慢慢熟悉那些構件庫了

3、覺得普元的報表系統不怎么樣,至少沒有什么讓人耳目一新的,工作流系統還挺強,對工作流不熟悉,不敢說什么,然后就是可維護性,可擴展性,可能一直是自己寫代碼的,看不見代碼總覺得不踏實最然功能實現了并以更迅速的

4、聽頭兒說這是未來軟件開發的趨勢,聽得我直郁悶,未來開發就是這么托構件然后用連線一拉基本完事兒了嗎?!得,要不我還是轉行做小買賣去吧,嗚嗚,總的來說,覺得這種模式對程序員個人的發展沒多大好處,核心代碼都被封裝好了,不知道什么是類,對象,方法,面向對象,也能輕而易舉做軟件工程師了,呵呵,工程師以后不值錢嘍。

自己的一點感覺,胡侃一通,不知道合不合乎邏輯,在前面的blog里有朋友留言說"千萬別被普元忽悠了",哈哈,不知道那位兄弟的理由是什么,想多聽聽大家的意見,望廣留言,多謝多謝多謝!!!



2008-09-18 21:01 發表評論
]]>
通過Xpath來訪問數據http://www.aygfsteel.com/liuspring/archive/2008/09/18/229672.htmlThu, 18 Sep 2008 05:48:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/18/229672.htmlhttp://www.aygfsteel.com/liuspring/comments/229672.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/18/229672.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/229672.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/229672.html例子1:Entity的格式

<root>

<data>

<myEntity>

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

</data>

</root>

例子2:EntityList的格式為

<root>

<data>

<list length=2>

<myEntity name="test1">

<myField1>1234</myField1>

<myField2>This is demo</myField2>

</myEntity>

<myEntity name="test2">

<myField1>2345</myField1>

<myField2>This is demo</myField2>

</myEntity>

<list>

</data>

</root>

通過Xpath來訪問數據,比如

/root/data /myEntity將訪問到例子1中的<myEntity>實體

/root/data/myEntity/ myField1 將訪問到例子1中的myField1,結果為1234

/root/data/list/myEntity[@name="test1"]將訪問例子2中的<myEntity name="test1"> 實體

/root/data/list/myEntity[@name="test1"]/myField1將訪問例子2中的myField1,值為1234



2008-09-18 13:48 發表評論
]]>
普元培訓第三天http://www.aygfsteel.com/liuspring/archive/2008/09/16/229228.htmlTue, 16 Sep 2008 10:22:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/16/229228.htmlhttp://www.aygfsteel.com/liuspring/comments/229228.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/16/229228.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/229228.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/229228.html閱讀全文

2008-09-16 18:22 發表評論
]]>
普元EOS培訓第二天http://www.aygfsteel.com/liuspring/archive/2008/09/11/228446.htmlThu, 11 Sep 2008 13:16:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/11/228446.htmlhttp://www.aygfsteel.com/liuspring/comments/228446.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/11/228446.html#Feedback6http://www.aygfsteel.com/liuspring/comments/commentRss/228446.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/228446.html今天剖析了昨天三下兩下生成的增刪改查的代碼(能看到的代碼也僅僅限于jsp頁面中的一些標簽),其他的要看的話都是xml,要用EOS的設計器看才是類似于流程圖的東西

感覺看不到親切的java代碼很不爽,呵呵

然后練習自定義運算邏輯,這下自己寫類了呵呵,eos能夠由向導自動生成類和方法體,就像Myeclipse中新建struts的action一樣,發現eos的方法都是靜態的,都是返回一個int整型值,參數列表也都是Document doc, BizContext param,看起來只有方法名可以自定義了,呵呵!

之前說過普元這套東西都是用xml格式傳遞參數的,這里就是從param中獲取xml,然后拆解每個要用到的節點,來獲取傳入的參數,然后經過處理后把返回值再放到xml節點中,好費勁。

然后是handler,為了靈活的加入新的處理,可以在一個業務邏輯的前后加入多個handler,跟一般的過濾器寫法沒什么差別。

然后是jsp Tag自定義,也是繼承了javax.servlet.jsp.tagext.TagSupport,沒有普元的東西

再然后是復雜查詢,多表查詢,他是創建一個查詢實體,就是視圖啦

一天下來對普元EOS了解的多了些,它以方法為單位作為構成構件,以達到重用的目的,各個層之間以xml格式作為聯系,開發人員基本上已圖形化開發,不接觸底層技術,給程序員的門檻降低了(大學生就業更難了呵呵),開發系統開始工業化,把零件裝起來,螺絲擰上就OK了

可能經歷實際開發了,會有多一些不一樣的感觸吧

還是沒鬧明白難道這就是所謂SOA嗎???



2008-09-11 21:16 發表評論
]]>
普元EOS培訓第一天http://www.aygfsteel.com/liuspring/archive/2008/09/10/228197.htmlWed, 10 Sep 2008 09:47:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/10/228197.htmlhttp://www.aygfsteel.com/liuspring/comments/228197.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/10/228197.html#Feedback7http://www.aygfsteel.com/liuspring/comments/commentRss/228197.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/228197.html普元EOS,面向構件的開發

公司要購進普元的EOS開發工具,組織為期5天的培訓

為了今天的培訓我把我的筆記本系統都重裝了,折騰了半天裝數據庫,裝EOS,裝EOS補丁,不知道干嘛不做一個集成了補丁的安裝包

安裝過程中要配置數據庫,要初始化數據庫,會向數據庫中自動建好多表,然后安裝成功后可以在服務控制臺管理。

首先做了個HelloWorld

界面就是這樣的


首先新建一個構件包(面向構件的開發嘛),每個構建包下有頁面構件page,展現邏輯構件pr,業務邏輯構件biz,數據邏輯構件data等等。

我的理解就是每個構件就相當于分層架構中的一層,page就是jsp頁面,prStrutsactionbizspringbean,datahibernate的映射,普元在這之上又進行了封裝,以前我們在各個層之間傳遞數據通常由一個DTO數據傳遞對象,而普元在各個層用xml來傳遞,普元把普遍通用的實現邏輯處理都封裝成了構件,我們只要調用構件就行了。

       之后又來了復雜點有刺激的,通過向導實現對一個單表的增刪改查,向導跟vs.net中的那個數據連接,數據適配器拖到頁面上選擇表,選擇字段,就自動生成了增刪改查,只是vs.net中可以看到生成的C#的代碼,而普元生成的只是一堆xml


原來一天未必能完成的事,現在十分鐘做完,能傻瓜的都傻瓜了,真的也要下崗了。

哦,對了,這些和SOA怎么聯系上呢?



2008-09-10 17:47 發表評論
]]>
jsp下載文件的問題http://www.aygfsteel.com/liuspring/archive/2008/09/05/227186.htmlFri, 05 Sep 2008 04:49:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/05/227186.htmlhttp://www.aygfsteel.com/liuspring/comments/227186.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/05/227186.html#Feedback0http://www.aygfsteel.com/liuspring/comments/commentRss/227186.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/227186.html 思路確定了
生成xml
在服務器指定目錄創建文件
取得文件路徑,彈出下載框

Java語言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   設置響應頭和下載保存的文件名 
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8"); 
13           response.setHeader("Content-Disposition"
14           "attachment;   filename=\""   +   pathurl   +   "\""); 
15           
16           //   打開指定文件的流信息 
17           java.io.FileInputStream   fileInputStream   = 
18           new   java.io.FileInputStream(addressReport); 
19           
20           寫出流信息 
21           int   i; 
22           while   ((i=fileInputStream.read())   !=   -1)   { 
23               out.write(i); 
24           }
25    
26           fileInputStream.close(); 
27           out.close();
28           
29     }
30   %>

這么寫在jsp文件中的代碼,開始試驗沒有問題,但是如果xml中有中文,就會是亂碼,xml文件是使用utf8生成的,猜想可能是在流讀取的時候編碼不對,于是在網上搜得了下面這樣的寫法,通過InputStreamReader設置了編碼UTF-8
測試成功

Java語言:
01 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
02 <%@ page import="java.io.*" %>
03 <%
04      String pathurl = (String)request.getAttribute("pathurl");
05      if(pathurl !=null && !pathurl.equals("")){
06    
07             String addressReport = application.getRealPath("/")+"saveFiles"+File.separator+pathurl;
08             //String addressReport = PageConstraint.XML_PATH_SEND+pathurl;
09            addressReport = addressReport.replace(File.separator,File.separator+File.separator);
10           
11           //   設置響應頭和下載保存的文件名 
12           response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8"); 
13           response.setHeader("Content-Disposition"
14           "attachment;   filename=\""   +   pathurl   +   "\""); 
15           
16           //   打開指定文件的流信息 
17           java.io.FileInputStream   fileInputStream   = 
18           new   java.io.FileInputStream(addressReport); 
19           
20           //   寫出流信息 
21           //int   i; 
22           //while   ((i=fileInputStream.read())   !=   -1)   { 
23           //out.write(i); 
24           //}
25    
26           //fileInputStream.close(); 
27           //out.close();
28          
29           InputStreamReader   reader=new   InputStreamReader(fileInputStream,"UTF-8"); 
30           int   i=0
31           while((i=reader.read())!=-1){ 
32               out.write(i);
33
34           }
35           reader.close(); 
36           fileInputStream.close();
37           out.close(); 
38     }
39   %>


總結:還是對java的流相關只是掌握不清啊,不能熟練運用

2008-09-05 12:49 發表評論
]]>
一點心得http://www.aygfsteel.com/liuspring/archive/2008/09/01/226201.htmlMon, 01 Sep 2008 13:38:00 GMThttp://www.aygfsteel.com/liuspring/archive/2008/09/01/226201.htmlhttp://www.aygfsteel.com/liuspring/comments/226201.htmlhttp://www.aygfsteel.com/liuspring/archive/2008/09/01/226201.html#Feedback2http://www.aygfsteel.com/liuspring/comments/commentRss/226201.htmlhttp://www.aygfsteel.com/liuspring/services/trackbacks/226201.html忙里偷閑
一直想寫一個blog程序
架子打起來了,用struts1.2+hibernate

如何為用戶的url做轉向,比如http://www.aygfsteel.com/liuspring,怎樣轉向屬于liuspring的文章、留言、評論啊等等,簡單的說就是liuspring的頁面,
這個問題可把我難住了(功力太淺),于是google上搜開源的blog系統,看他們的源碼,首先下的roller,費了好大勁把系統配起來了,運行起來那個高興,接下來暈了,新版本是struts2,還沒研究過,看了一下好像struts2能很容易實現我要的,可是我用的是1.x啊,接著搜,Pebble,blojsom DLOG4Jmyblog,都試用了,其中blojsom使用了一個servlet,在里面解析URI,比如請求的地址是/blog/spring/,那么就被解析成/blogView.do?go=spring,以這個地址轉向,從而被struts的控制器接收。
這里得用(并且redirectURL必須是相對路徑,用完整路徑好像還不行,在我這報404錯誤)
1httpServletRequest.getRequestDispatcher(redirectURL.toString())
2            .forward((ServletRequest)httpServletRequest, (ServletResponse)httpServletResponse);
不能用
1httpServletResponse.sendRedirect(redirectURL.toString());
因為這樣是使IE重定向,請求的URL也隨之改變,這個圈兒就轉不下去了。

又建立了一個過濾器,用以判斷session中的用戶是否是當前訪問的博客的管理員,比如訪問/blog/spring/,判斷session中保存的用戶是否是spring,然后往request,setAttribute中放一個標示,標示是否具有管理員權限,在jsp頁面中獲取這個參數以決定是否顯示后臺管理連接。
到這里,最基本,最撓頭的問題暫時解決了,感覺肯定有更加方便、更加精妙、更加簡單的方法,只是功力還沒涉到那么深,哪位博友看到了不勝賜教,接下來還要攻克的,如何產生靜態html頁面,如何rss......

2008-09-01 21:38 發表評論
]]>
主站蜘蛛池模板: 广饶县| 大港区| 黔西县| 盐津县| 随州市| 萨迦县| 乌拉特前旗| 旬阳县| 阿荣旗| 海盐县| 大邑县| 莱阳市| 烟台市| 张家口市| 鄯善县| 屏山县| 南城县| 莒南县| 郴州市| 东宁县| 凤山县| 潜山县| 中宁县| 靖宇县| 仁怀市| 文水县| 南阳市| 龙陵县| 札达县| 梨树县| 天镇县| 闽清县| 明溪县| 鹰潭市| 灵台县| 汉川市| 长春市| 舒城县| 青龙| 渑池县| 什邡市|