
2010年3月17日
MVC模式,學了快半年了,終于領悟到它的內涵了。
M-model 模型,V-view 視圖,C-controler控制器
用戶訪問到的是視圖層,也就是頁面,jsp;把請求給servlet也就是控制層,控制層調用業務層來做出相應的處理,將信息返回給視圖層顯示出來。那么業務層怎么做呢,首先需要一個DAO也就是對數據庫進行操作,然后需要相應的Bean。這樣思路就清晰了多了,數據層DAO封裝對數據庫的操作,業務層做處理來訪問數據層,servlet層用來響應視圖層請求。
在數據層和業務層中,每個類都配一個接口,這樣的話,有便于以后程序的擴展。
最近在做一個web項目,老師只把我們領進了門,自己修行可真難啊
posted @
2010-04-25 17:23 張貝貝 閱讀(1556) |
評論 (3) |
編輯 收藏
例如 String a=new String("a");
String b="a";
boolean c=(a==b);
為什么c是false?
String 類不是采用共享設計模式嗎。同樣的字符串應該引用的是同樣的地址。可為什么是false呢?
如果是
String a="a";
String b="a";
boolean c=(a==b);
這個時候b就是true了
java.lang.String類對大家來說最熟悉不過了,我們寫java程序很少能不用String的。本文講述如何正確的使用String,內容主要涉及初始化、串聯和比較等操作。
首先我們必須清楚的一點是String類是final類型的,因此你不可以繼承這個類、不能修改這個類。我們使用String的時候非常簡單,通常都是 String s = "hello",但是Java API中同時提供了一個構造函數為String(String s),因此你也可以這樣使用String s = new String("hello"),對于后面這樣初始化一個String的方式是不推薦的,因為new操作符意味著將會在heap上生成一個新的對象,如果這樣的操作發生在一個循環中,那么代價是慘重的。比如
for(int i = 0;i<1000;i++)
{
String s = new String("hello");
}
這將會創建1000個String類型的對象,由于String類是final的,因此這樣的操作事實上是每次都生成了一個新的String對象的。如果你使用String s = "hello";那么就可以實現復用了,為什么可以復用呢,下面會有解釋。
當我們使用"+"實現串聯操作的時候,比如String s = "hello"+"world";其實是通過StringBuffer類的append()方法實現的,最后返回String給s。如果有興趣的話,你可以寫一個簡單的例子,然后用javap看看虛擬機是如何工作的。在使用串聯的時候我們同樣應該注意String是final類,如果你需要多次串聯比如:
String sql = "xxx";
sql = "xxxx";
sql = "ssssss";
那么為了提高效率節省空間,我們應該自己用StringBuffer來替代"+";
通常對String的比較有兩種情況,一個是使用==,另一個是使用equals()方法,注意==是對對象的地址進行比較的,而String中的 equals()方法是覆蓋了Object類的方法,并且實現為對String對象的內容的比較。所以String s1 = new String("hello");String s2 = new String("hello"),我們對s1和s2進行上述比較的時候,前者應該返回false,因為使用new生成的是兩個不同的對象。后者應該返回 true因為他們的內容是一樣的,都是"hello"。那么如果我們還有一個String s3 = "hello";他和s1的比較應該是什么樣子的呢,答案是s1==s3為false,equals的比較位true。事實上String類是維持著一個 String池的,這個池初始化為空的,當我們String x = "hello"的時候,hello就會被放入這個池中,當我們再次String y = "hello"的時候,他首先去檢查池中是否存在一個和hello內容一樣的對象,如果存在的話就會把這個引用返回給y,如果不存在的話,就會創建一個并放入到池中。這樣就實現了復用。在String有一個方法intern()他可以把String的對象放入到池沖并返回池中的對象。如果我們對 s1(String s1 = new String("hello"))調用intern,s1 = s1.intern()這時候,我們再把s1和s3進行“==”的判斷,你會發現結果返回true!
看下面的例子
public class StringTest
{
public static void main(String[] args)
{
String s1 = "hello";
String s2 = new String("hello");
String s3 = new String("hello");
testString(s1,s2,s3);
s2 = s2.intern();
System.out.println("after s2.intern");
testString(s1,s2,s3);
}
private static void testString(String s1,String s2,String s3)
{
System.out.println("s1 = s2 is "+(s1==s2));
System.out.println("s2 = s3 is "+(s2==s3));
System.out.println("s1.equals(s2) is "+s1.equals(s2));
System.out.println("s2.equals(s3) is "+s2.equals(s3));
}
}
輸出結果為
s1 = s2 is false
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
after s2.intern
s1 = s2 is true
s2 = s3 is false
s1.equals(s2) is true
s2.equals(s3) is true
posted @
2010-04-07 22:34 張貝貝 閱讀(1025) |
評論 (1) |
編輯 收藏
環境變量配置
JAVA_HOME=C:\soft\jdk1.6.0
classpath=;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
path=%JAVA_HOME%\bin;
java 特點
1.面向對象;2可移植性,跨平臺;3.支持分布式的網絡應用,多線程;4.安全性和健壯性;
一處編譯,處處運行;
名詞解析 JDK java development kit
JavaEE-- java Enterprise Edition 企業版
JavaSE-- java Stand Edition 標準版
JavaME-- java Micro Edition 微型版
OCP--open(對擴展開發),close(對修改關閉)
SUN公司官方網站http://java.sun.com
JDK的安裝及目錄結構
-bin目錄:存放可執行文件
-lib目錄:存放JAVA的類庫文件;
-include目錄:存放用于本地方法的文件;
-demo目錄:存放演示程序;
-jre目錄:存放Java運行環境文件;
2. "System.out.println();"
System為一個類(class),類字段和類方法前必須有static 修飾,并且該類不能被實例化,即不能被創建新對象;
out為字段 靜態方法里不能用非靜態變量-----解決方案:將變量改為靜態變量或者聲明一個新對象再次調用變量
3. Eclipse 簡單應用
建工作空間 → 建一個包 → 建類
4.核心能力培養
①自學能力 主動性、自我控制(EQ)
②獨立能力 事情==》獨立思考分析--》出現問題,解決問題,查資料--》
③團隊合作能力 技術密集,溝通==》敢于,有效溝通
④英文閱讀能力 官方文檔(API 開發文檔,規范)
⑤高質量編程能力 邏輯性 健壯性 可讀性 設計原則(輸入兩個數字A和B,“+”) 性能
5.學習方法
①筆記
②記憶:大學的理解+中學的記憶
③學習時間:8點到十一點
④英文記憶
6.語言的演變
①需求的變化
②編程藝術
7.設計新語言
①易用性
②安全性
③效率性高
④穩定性
⑤可擴展性
8.數據運算
被除數除以除數 6/5=1;(取整) 5%6=5;(取余)
a+=b;相當于a=a+b; 依次類推,乘法,除法,減法
閑著沒事干,把以前的東西寫寫
posted @
2010-03-20 16:17 張貝貝 閱讀(175) |
評論 (0) |
編輯 收藏
對象流(對象序列化與反序列化)
ObjectOutputStream和ObjectInputStream 序列化:把對象寫到一個輸入流中;反序列化:從一個輸入流中讀取一個對象。Serializable序列化接口沒有方法或字段,僅用于標識可序列化的語義。
序列化步驟:
1.創建一個對象輸出流,,該輸出流可以包裝其他類型輸出流
2.通過這個類的writeObject()來寫對象
反序列化:
1.創建一個對象輸入流,它可以包裝其它類型的輸入流
2.通過該對象輸入流的readObject()方法來讀取對象
要序列化的對象要實現Serializable這個接口 要注意讀取的順序
每個對象的hashcode是唯一的,也就是說內存地址是唯一,直到被銷毀。
在String“= =”比較的是地址,equals()比較的是內容,在Object中,“==”比較的是地址,equals()比較的是地址(如果不重寫此方法),重寫后可比較內容
下面是部分可用代碼:
1
//存儲數據,序列化對象數組
2
public void ser(Object obj[]) throws Exception
{
3
OutputStream ops=new FileOutputStream("D:\\test\\objcetFile.txt");
4
ObjectOutputStream out=new ObjectOutputStream(ops);
5
6
out.writeObject(obj);
7
out.close();
8
}
9
10
//讀取數據,反序列化對象數組
11
public Object[] dser() throws Exception
{
12
13
14
InputStream ins=new FileInputStream("D:\\test\\objcetFile.txt");
15
ObjectInputStream ois=new ObjectInputStream(ins);
16
17
Object[] obj=(Object[])ois.readObject();
18
ois.close();
19
20
return obj;
21
22
}
該代碼中存儲的是對象數組
posted @
2010-03-18 20:47 張貝貝 閱讀(1306) |
評論 (1) |
編輯 收藏
流是程序和外界進行數據交換的通道。分為輸入流InputStream和輸出流OutputStream。程序通過輸入流從數據源讀取數據,通過輸出流向目的地寫數據。
在計算機世界里,信息就是數據,信息的交換就是數據流。就好比我們日常生活中的可以看到的水流及看不到的電流都是一種流。
流是指一連串流動的字符(應該是字節),以先進先出的方式發送信息的通道。從傳輸上分為字節流和字符流,字節占8位,字符占16位。從使用上分為節點流和過濾流,其中過濾流包含處理流、包裝流。
下面我們來說一下流的創建,創建一個流,那么內存怎么分配呢?首先是對象分配內存,然后是OS分配資源內存。當這個流用完后,我們要進行的操作的是關閉這個流,Close通知OS釋放資源(其中OS為操作系統)。
輸入流:
InputStream類是所有輸入流的父類,它是一個抽象類,不能被實例化。它提供了一系列和讀取數據有關的方法。
int read(),int read(byte[] b)從數據源讀取數據
void close() 當完成讀操作后,應該關閉輸入流。
常用到的子類,ByteArrayInputStream字節數組輸入流, FileInputStream文件輸入流, StringBufferStream字符串緩沖輸入流, ObjectInputStream對象輸入流, FilterInputStream過濾輸入流,其中過濾輸入流中主要用到的是BufferedInputStream和DataInputStream(實現了DataInput接口,用于讀取基本數據類型,如int 、long、float、double、boolean等)
有輸入流,就有相應的輸出流,也就是說將intput改為output。但是在這里要著重提到的是隨機讀取文件類RandomAccessFile和對象流Object。本人對前者沒有多少嘗試,但對后者我就可以分享我的一點知識。對象流用到了對象的序列化和反序列化,序列化的意思就是把對象寫到一個輸入流中;反序列化是從一個輸入流中讀取一個對象。如果要采用對象輸入輸出流,那么這個對象的類必須實現可序列化接口。將對象也就是對象的成員變量作為整體,寫到流中存儲到文件里邊。或者就是把對象放到數組里邊,將這個對象數組存入到同一個文件中,對其進行操作,在沒有數據庫的情況下,我個人認為這是最好的保存對象信息方法。
該睡覺了,先寫到這里,明天將我所做的對象流代碼寫到上邊,供大家參考交流
posted @
2010-03-17 22:59 張貝貝 閱讀(1616) |
評論 (1) |
編輯 收藏