??xml version="1.0" encoding="utf-8" standalone="yes"?> 有一?/a>StringQ如何查询其中是否有y?/a>f字符Q最黑暗的办法就是: E序1Q我知道if?/a>for语句?/a>charAt()啊?/a> public static void main(String args[]) { String str="For my money, the important thing "+ "about the meeting was bridge-building"; char z=str.charAt(i); //System.out.println(z); 好像很直观,但这U方式难以应付复杂的工作。如查询一D|字中Q是否有isQ是否有thing?/a>ting{。这是一个讨厌的工作?/a> 按照面向对象的思\Q把希望查询的字W串?/a>is?/a>thing?/a>ting装成一个对象,以这个对象作为模板去匚w一D|字,更加自然了。作为模板的那个东西是下面要讨论的正则表达式。先不考虑那么复杂Q看一个例子: public static void main(String args[]) { String str="For my money, the important thing "+ "about the meeting was bridge-building"; String regEx="a|f"; //表示a?/a>f Pattern p=Pattern.compile(regEx); 如果str匚wregExQ那?/a>result?/a>trueQ否则ؓflase。如果想在查找时忽略大小写,则可以写成: Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE); 虽然暂时不知?/a>PatternQ模ѝ模式)?/a>MatcherQ匹配器Q的l节Q程序的感觉比较爽Q如果先查询is、后来又要查?/a>thing?/a>tingQ我们只需要修改一下模?/a>PatternQ而不是考虑if语句?/a>for语句Q或者通过charAt()?/a> 1?/a>写一个特D的字符东y—正则表辑ּ?/a>a|f?/a> 思\清楚了,现在?/a>Java是如何处理的Q?/a>JavaE序员直?/a>JDK1.4才能使用q些cR?/a> ?/a>public final class java.util.regex.Pattern?/a>正则表达式编译后的表达法。下面的语句创Z?/a>Pattern对象q赋值给句柄pQ?/span>Pattern p=Pattern.compile(regEx); 有趣的是Q?/a>PatterncLfinalc,而且它的构造器?/span>private。也许有人告诉你一些设计模式的东西Q或者你自己查有兌料。这里的l论是:PatterncM能被l承Q我们不能通过new创徏Patterncȝ对象?/span> 因此?/a>PatterncMQ提供了2个重载的静态方法,其返回值是Pattern对象Q的引用Q。如Q?/span> public static Pattern compile(String regex) { 当然Q我们可以声?/a>Patterncȝ句柄Q如Pattern p=nullQ?/span> ?/a>p.matcher(str)表示以用模板pȝ成一个字W串str的匹配器Q它的返回值是一?/a>Matchercȝ引用Qؓ什么要q个东西呢?按照自然的想法,q回一?/a>booleang行吗Q?/a> boolean result=Pattern.compile(regEx).matcher(str).find(); 呵呵Q其实是三个语句合ƈ的无句柄方式。无句柄常常不是好方式。后面再学习Matchercd。先看看regEx——这个怪咚咚?/a> 正则表达式(Regular ExpressionQ?/a>是一U?span style="background: yellow none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">生成字符串的字符?/span>。晕吧。比如说Q?/a>String regEx="me+";q里字符?/a>me+能够生成的字W串是:me?/a>mee?/a>meee?/a>meeeeeeeeee{等Q一个正则表辑ּ可能生成无穷的字W串Q所以我们不可能Q有必要吗?Q输出正则表辑ּ产生的所有东ѝ?/a> 反过来考虑Q对于字W串Q?/a>me?/a>mee?/a>meee?/a>meeeeeeeeee{等Q我们能否有一U?strong>语言Lq它们呢Q显Ӟ正则表达式语a是这U语aQ它是一些字W串的模式——简z而深ȝ描述?/a> 我们使用正则表达式,用于字符串查找、匹配、指定字W串替换、字W串分割{等目的?/a> 生成字符串的字符东y—正则表辑ּQ真有些复杂Q因为我们希?/a>由普通字W(例如字符 a ?/a> zQ以及特D字W(UCؓ元字W)描述L的字W串Q而且要准?/a> public static void main(String args[]) { String str="For my money, the important thing "Q?/a> boolean result=Pattern.compile(regEx).matcher(str).find(); ?/a>"ab*"——能匚wa?/a>ab?/a>abb?/a>abbb……。所以,*表示前面字符可以有零ơ或多次。如果仅仅考虑查找Q直接用"a"也一栗但x替换的情c?/a>问题regEx="abb*"l果如何Q?/a> ?/a>"ab+"——能匚wab?/a>abb?/a>abbb……。等价于"abb*"?/a>问题regEx="or+"l果如何Q?/a> ?/a>"or?"——能匚wo?/a>or?/a>? 表示前面字符可以有零ơ或一ơ?/a> q些限定W?/a>*?/a>+?/a>?方便地表CZ其前面字W?/a>(子串)出现的次敎ͼ我们?/a>{}来描qͼQ?/a> x* 零次或多?/span>≡{0,}
]]>
]]>§2 Java?/span>java.util.regex?/span>
§3 PatterncM查找
§4 正则表达式之限定W?/span>
]]>
1) list()函数以String数组的Ş式返回一个File对象所描述的文件信息。返回的是\径下的所有文件和目录的文件名和目录名?br />
2) list(FilenameFilter filter)函数则提供了查询功能Q通过它可能查询出满特定条g的文件名和目录名?br />
2.1.3 用FinenameFilter接口q行文g或目录的查询
2.1.3.1.
q个接口只包含一个函敎ͼboolean accept(File dir, String
name)Q第二个参数代表一个文件或目录的名UͼW一个参C表文件或目录所在的目录的名U。当q回trueQ表C文件满x询条Ӟ要被攑օl果中;
否则Q表C文件不满要求?br />
2.1.3.2. 工作原理
当调用某个File对象的list(FilenameFilter
filter)函数Ӟ
会对File对象中的每一个文件或目录调用参数filter中的accept()Ҏ。在对一个文件或目录调用accept()函数时把它的名称以及一?
描述它所在的目录的File对象作ؓ参数传给accept()函数?br />
2.1.4 一个简单的实例
import java.io.File;
import java.io.FilenameFilter;
class DirList{
public void printFile(String dir, String filter){
File path = new File(dir);
String[] fileList;
if(filter.length()==0){
System.out.println(""nAll file:");
fileList = path.list(); //取得所有文件信?br />
}
else{
System.out.println(""nAll file including " + filter);
//取得满查询条g的文件信?br />
fileList = path.list(new DirFilter(filter));
}
for(int i=0; i<fileList.length; i++)
System.out.println(fileList[i]);
}
public void printFile(String dir){
printFile(dir, "");
}
}
class DirFilter implements FilenameFilter{
String afn; //存放查询条g
DirFilter(String afn) { this.afn = afn; }
//满查询条gQ返回true
public boolean accept(File dir, String name){
return name.indexOf(afn)!=-1;
}
}
public class TestIO{
public static void main(String[] args){
DirList dirList = new DirList();
//昄F:"test下的文g信息
dirList.printFile("F:""test");
//昄F:"test下名U包?#8220;.rar”文g信息
dirList.printFile("F:""test", ".rar");
//昄F:"test下名U包?#8220;r”文g信息
dirList.printFile("F:""test", "r");
}
}
q个只是一个简单的例子Q只要完善accept()函数Q你也可以做Z个Java版的dir命o来?br />
2.2 当然Q我们还能通过File来文件或目录q行创徏、删除和改名的操作?br />
import java.io.File;
import java.io.FilenameFilter;
import java.util.Date;
import java.text.SimpleDateFormat;
class DirFilter implements FilenameFilter{
String afn;
DirFilter(String afn) { this.afn = afn; }
public boolean accept(File dir, String name){
return name.indexOf(afn)!=-1;
}
}
class OptFile{
public static String getAbsolutePath(File f){
return f.getAbsolutePath();
}
public static String getPath(File f){
return f.getParent();
}
public static String getName(File f){
return f.getName();
}
public static long getLength(File f){
return f.length();
}
public static String getParent(File f){
return f.getParent();
}
public static String getLastModified(File f, String format){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if(format.equals("ymdh"))
sdf = new SimpleDateFormat("yyyy-MM-dd hh");
else if(format.equals("ymdhm"))
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
return sdf.format((new Date(f.lastModified())));
}
public static String getLastModified(File f){
return getLastModified(f, "ymd");
}
public static boolean canRead(File f){
return f.canRead();
}
public static boolean canWrite(File f){
return f.canWrite();
}
public static boolean isFile(File f){
return f.isFile();
}
public static boolean isDir(File f){
return f.isDirectory();
}
public static boolean rename(File oldName, File newName){
return oldName.renameTo(newName);
}
public static boolean delete(File f){
return f.delete();
}
public static boolean mkdir(File f){
return f.mkdirs();
}
/**
* 从指定\径中查询文g
*/
public static File[] findFile(String filePath, String fileName){
File f = new File(filePath);
File[] result = f.listFiles(new DirFilter(fileName));
return result;
}
public static void printFileAtt(File f){
System.out.println(
" Absolute path: " + getAbsolutePath(f) +
""n Can read: " + canRead(f) +
""n Can write: " + canWrite(f) +
""n path: " + getPath(f) +
""n name: " + getName(f) +
""n parent: " + getParent(f) +
""n length: " + getLength(f) +
""n lastModified: " + getLastModified(f));
if(isFile(f))
System.out.println(" it's a file");
else if(isDir(f))
System.out.println(" it's a directory");
}
}
public class TestIO{
public static void main(String[] args){
File f1 = new File("F:""nepalon""thinkinginjava""test");
File f2 = new File("F:""nepalon""thinkinginjava""test""aa ");
OptFile.printFileAtt(f1);
OptFile.printFileAtt(f2);
//当对文g或目录进行改名,且更新到一个不同的下时Q?br />
//会先把文件或整个目录剪切到新目录下,再重新命?br />
File nf2 = new File("F:""nepalon""thinkinginjava""使用log4j.files");
if(OptFile.rename(f2, nf2)){
System.out.println("after rename f2:");
OptFile.printFileAtt(nf2);
}
else
System.out.println("rename nf2 failly");
//q行删除操作Ӟ只能删除文gQ如果删除的是目录,会返回false
File df = new File("F:""nepalon""thinkinginjava""test""1001.doc");
if(OptFile.delete(df))
System.out.println("Delete df successfully");
else
System.out.println("Delete df failly");
System.out.println("Find file with name ""1001""");
OptFile.findFile("F:""nepalon""thinkinginjava""test", "1001");
File mf = new File("F:""nepalon""thinkinginjava""test""1001");
if(OptFile.mkdir(mf))
System.out.println("create directory mf successfully");
else
System.out.println("create directory mf failly");
}
}
]]>
Q、构造函数?/span>
StringBuffer() Q构造一个没有Q何字W的StringBuffercR?
StringBuffer(int length) Q?Q构造一个没有Q何字W的StringBufferc,q且Q其长度为length?
StringBuffer(String str) Q以str为初始值构造一个StringBuffercR?/ul>
Q、方法?/span>
说明Q?
1. 所有方法均为publicQ?
2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;
如:
static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>
1. StringBuffer append(boolean b)
2. StringBuffer append(char c)
3. StringBuffer append(char[] str)
4. StringBuffer append(char[] str, int offset, int len)
5. StringBuffer append(double d)
6. StringBuffer append(float f)
7. StringBuffer append(int i)
8. StringBuffer append(long l)
9. StringBuffer append(Object obj)
10. StringBuffer append(String str)
11. StringBuffer append(StringBuffer sb)
以上的方法都是向字符串缓冲区“q加”元素Q但是,q个“元素”参数可以是布量、字W、字W数l、双_ֺ数、QҎ、整型数、长整型数对象类型的字符丌Ӏ字W串和StringBuffercȝ。如果添加的字符出了字W串~冲区的长度QJava自动进行扩充?/ul>
代码:
String question = new String("1+1=");
int answer = 3;
boolean result = (1+1==3);
StringBuffer sb = new StringBuffer();
sb.append(question);
sb.append(answer);
sb.append('"t');
sb.append(result);
System.out.println(sb);
l果为:
1+1=3 false
12. int capacity() Q返回当前StringBuffer对象Q字W串~冲区)的ȝ_而非字符号串的长度?
13. char charAt(int index) Q在当前StringBuffer对象中取索引号ؓindex的字W。第一个字W的索引?#8220;0”
14. StringBuffer delete(int start, int end) Q删除当前StringBuffer对象中以索引号start开始,到endl束的子丌Ӏ?
15. StringBuffer deleteCharAt(int index) Q删除当前StringBuffer对象中烦引号为index的字W?
16.
void ensureCapacity(int minimumCapacity)
Q重新设|字W号串缓冲区的ȝ间。如果minimumCapacity大于当前的ȝ_则新的空间被讄Q一U结果是
minimumCapacityQ另一U结果是{“老空?#8221;??}?/ul>
代码:
StringBuffer sb1 = new StringBuffer(5);
StringBuffer sb2 = new StringBuffer(5);
sb1.ensureCapacity(6);
sb2.ensureCapacity(100);
System.out.println( "sb1.Capacity: " + sb1.capacity() );
System.out.println( "sb2.Capacity: " + sb2.capacity() );
l果为:
sb1.Capacity: 12
sb2.Capacity: 100
17. void getChars(int srcBegin, int srcEnd, char[] dst, int
dstBegin)
Q从当前StringBuffer对象的烦引号srcBegin开始,到srcEndl束的子Ԍ赋值到字符数组dst中,q且从dst的烦引号
dstBegin开始?/ul>
代码:
StringBuffer sb = new StringBuffer("I love her!");
char[] i = {'I',' ','l','o','v','e',' ','y','o','u'};
sb.getChars(7,10,i,7);
System.out.println( "sb: " + sb );
l果为:sb: I love her!
18. int indexOf(String str) Q返回当前StringBuffer对象中,W一个满str子串的位|?
19. int indexOf(String str, int fromIndex) Q从当前StringBuffer对象的fromIndex开始查找,q回W一个满str子串的位|?
20. StringBuffer insert(int offset, boolean b)
21. StringBuffer insert(int offset, char c)
22. StringBuffer insert(int offset, char[] str)
23. StringBuffer insert(int index, char[] str, int offset, int len)
24. StringBuffer insert(int offset, double d)
25. StringBuffer insert(int offset, float f)
26. StringBuffer insert(int offset, int i)
27. StringBuffer insert(int offset, long l)
28. StringBuffer insert(int offset, Object obj)
29. StringBuffer insert(int offset, String str)
以上的方法都是在当前StringBuffer对象中插入一个元素,在烦引号offset处插入相应的倹{?
30. int lastIndexOf(String str) Q返回当前StringBuffer对象中,最后一个满str子串的位|?
31. int lastIndexOf(String str, int fromIndex) Q从当前StringBuffer对象的fromIndex开始查找,q回最后一个满str子串的位|?
32. int length() Q返回当前StringBuffer对象Q字W缓冲区Q中Q字W串的长度?span style="color: red;">注意Q此Ҏ与capacity() 不同?/span>
33. StringBuffer replace(int start, int end, String str) Q替换当前StringBuffer对象的字W串。从start开始,到endl束的位|替换成str?
34. StringBuffer reverse() Q将字符串翻转?/ul>
代码:
StringBuffer sb = new StringBuffer("0123456789");
System.out.println( "sb.reverse(): " + sb.reverse() );
l果为:sb.reverse(): 9876543210
35. void setCharAt(int index, char ch) Q设|烦引号index的字Wؓch?
36. void setLength(int newLength) Q重新设|字W串~冲Z字符串的长度Q如果newLength于当前的字W串长度Q将截去多余的字W?/ul>
代码:
StringBuffer sb = new StringBuffer("0123456789");
sb.setLength(5);
System.out.println( "sb: " + sb );
l果为:sb: 01234
37. String substring(int start) Q取当前StringBuffer对象中,从start开始到l尾的子丌Ӏ?
38. String substring(int start, int end) Q取当前StringBuffer对象中,从start开始到end的子丌Ӏ?
39. String toString() Q将当前StringBuffer对象转换成String对象?/ul>
]]>
Q、构造函数?/span>
1. StringTokenizer(String str) Q构造一个用来解析str的StringTokenizer对象。java默认的分隔符?#8220;I格”?#8220;制表W?‘"t’)”?#8220;换行W?‘"n’)”?#8220;回RW?‘"r’)”?
2. StringTokenizer(String str, String delim) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W?
3. StringTokenizer(String str, String delim, boolean returnDelims) Q构造一个用来解析str的StringTokenizer对象Qƈ提供一个指定的分隔W,同时Q指定是否返回分隔符?/ul>
Q、方法?/span>
说明Q?
1. 所有方法均为publicQ?
2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;
如:
static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>
1. int countTokens() Q返回nextTokenҎ被调用的ơ数。如果采用构造函??Q返回的是分隔W数??)?
2. boolean hasMoreTokens() Q返回是否还有分隔符?
3. boolean hasMoreElements() Q结果同2?
4. String nextToken() Q返回从当前位置C一个分隔符的字W串?
5. Object nextElement() Q结果同4?
6. String nextToken(String delim) Q与4cMQ以指定的分隔符q回l果?/ul>
例子Q?/span>
代码:
String s = new String("The Java platform is the ideal platform for network computing");
StringTokenizer st = new StringTokenizer(s);
System.out.println( "Token Total: " + st.countTokens() );
while( st.hasMoreElements() ){
System.out.println( st.nextToken() );
}
l果为:
Token Total: 10
The
Java
platform
is
the
ideal
platform
for
network
computing
?:
代码:
String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");
StringTokenizer st = new StringTokenizer(s,"=",true);
System.out.println( "Token Total: " + st.countTokens() );
while( st.hasMoreElements() ){
System.out.println( st.nextToken() );
}
l果为:
Token Total: 19
The
=
Java
=
platform
=
is
=
the
=
ideal
=
platform
=
for
=
network
=
computing
]]>
Q、属性?/span>
无?
Q、构造函数?/span>
Random() Q创Z个新的随机数发生器?
Random(long seed) Q用一个种子(长整型)创徏一个随机数发生器?
Q、方法?/span>
说明Q?
1. 所有方法均为publicQ?
2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;
如:
static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>
1. protected int next(int bits) Q生下一个伪随机数?
2. boolean nextBoolean() Q返回下一个从随机发生器的pd中得到的均匀分布的布倹{?
3. void nextBytes(byte[] bytes) Q生随机字节数l放到指定的数组中?
4. double nextDouble() Q返回下一个从随机发生器的pd中得到的均匀分布?.0?.0的双_ֺcd倹{?
5. float nextFloat() Q返回下一个从随机发生器的pd中得到的均匀分布?.0?.0的Q点类型倹{?
6. double nextGaussian() Q返回下一个从随机发生器的pd中得到的W合均匀分布?.0的^均数?.0方差的高斯分布双_ֺcd倹{?
7. int nextInt() Q返回下一个从随机发生器的pd中得到的均匀分布的整型倹{?
8. int nextInt(int n) Q返回下一个从随机发生器的pd中得到的均匀分布?到指定整型数QnQ之间的整型倹{?
9. long nextLong() Q返回下一个从随机发生器的pd中得到的均匀分布的长整型倹{?
10. void setSeed(long seed) Q设|随机数发生器的U子Z个长整型数?/ul>
关于U子的描qͼ
q个cȝ对象使用一?8位的U子Q?
如果q个cȝ两个实例是用同一个种子创建的Q?
q且Q各自对它们以同L序调用ҎQ?
则它们会产生相同的数字序列?
下面对上面的介l做一个实验,
其注意相同U子时的l果Q?
如果用默认的构造函数构造对象,
他们是属于同一个种子的?/span>
代码:
import java.util.Random;
public class TestRandom{
public static void main(String[] args){
Random r1 = new Random(50);
System.out.println("W一个种子ؓ50的Random对象");
System.out.println("r1.nextBoolean():"t" + r1.nextBoolean());
System.out.println("r1.nextInt():"t"t" + r1.nextInt());
System.out.println("r1.nextDouble():"t" + r1.nextDouble());
System.out.println("r1.nextGaussian():"t" + r1.nextGaussian());
System.out.println("---------------------------");
Random r2 = new Random(50);
System.out.println("W二个种子ؓ50的Random对象");
System.out.println("r2.nextBoolean():"t" + r2.nextBoolean());
System.out.println("r2.nextInt():"t"t" + r2.nextInt());
System.out.println("r2.nextDouble():"t" + r2.nextDouble());
System.out.println("r2.nextGaussian():"t" + r2.nextGaussian());
System.out.println("---------------------------");
Random r3 = new Random(100);
System.out.println("U子?00的Random对象");
System.out.println("r3.nextBoolean():"t" + r3.nextBoolean());
System.out.println("r3.nextInt():"t"t" + r3.nextInt());
System.out.println("r3.nextDouble():"t" + r3.nextDouble());
System.out.println("r3.nextGaussian():"t" + r3.nextGaussian());
System.out.println("l果一目了Ӟ");
}
}
l果Q?
代码:
W一个种子ؓ50的Random对象
r1.nextBoolean(): true
r1.nextInt(): -1727040520
r1.nextDouble(): 0.6141579720626675
r1.nextGaussian(): 2.377650302287946
---------------------------
W二个种子ؓ50的Random对象
r2.nextBoolean(): true
r2.nextInt(): -1727040520
r2.nextDouble(): 0.6141579720626675
r2.nextGaussian(): 2.377650302287946
---------------------------
U子?00的Random对象
r3.nextBoolean(): true
r3.nextInt(): -1139614796
r3.nextDouble(): 0.19497605734770518
r3.nextGaussian(): 0.6762208162903859
]]>
1. static Double MAX_VALUE Q?q回最大双_ֺ敎ͼ在不同硬件^C由Double.longBitsToDouble(0x7fefffffffffffffL)计算得出?
2. static Double MIN_VALUE Q?q回最双_ֺ敎ͼ在不同硬件^C由Double.longBitsToDouble(0x1L)计算得出?
3. static Double NaN Q?表示非数值类型的双精度数Q在不同gq_中由Double.longBitsToDouble(0x7ff8000000000000L)计算得出?
4. static Double NEGATIVE_INFINITYQ返回负无穷双精度数Q在不同gq_中由Double.longBitsToDouble(0xfff0000000000000L)计算得出?
5. static Double POSITIVE_INFINITY Q返回正无穷双精度数Q在不同gq_中由Double.longBitsToDouble(0x7ff0000000000000L)计算得出?
6. static Class TYPE Q返回当前类型?/ul>
Q、构造函数?/span>
Double(double value) Q以doublecd为参数创建Double对象?
Double(String s) Q以Stringcd为参数创建String对象?/ul>
Q、方法?/span>
说明Q?
1. 所有方法均为publicQ?
2. 书写格式QE修饰W] <q回cd> <Ҏ名(Qd数列表]Q?gt;
如:
static int parseInt(String s) 表示Q此ҎQparseIntQؓcL法(staticQ,q回cd为(intQ,Ҏ所需参数为Stringcd?/span>
1. byte byteValue() Q返回以字节表示的双_ֺ数?
2. static int compare(double d1, double d2) Q此为类ҎQ比较d1和d2。相当于new Double(d1).compareTo(new Double(d2))。如果d1与d2相等Q返回0Q小于关p,q回负数Q大于关p,q回正数?
3. int compareTo(Double anotherDouble) Q此为对象方法,当前对象与anotherDouble比较。与2的比较规则相同?
4. int compareTo(Object o) Q当前对象与oq行比较Q如果o属于Doublec,那么Q相当于3Q如果是其他c,则抛出ClassCastException异常?
5. static long doubleToLongBits(double value) Q把value按照IEEE 754转化成longq输出它的十q制数倹{?
6. double doubleValue() Q返回该双精度数对象的双_ֺ数倹{?
7. boolean equals(Object obj) Q比较当前Double对象与obj的内Ҏ否相同。大多数情况是比较两个Double对象的值是否相{,相当于d1.doubleValue() == d2.doubleValue()的倹{?
8. float floatValue() Q返回该点数对象的点数倹{?
9. int hashCode() Q返回该Double对象的哈希表码?
10. int intValue() Q返回该Double对象的整数|整数部分Q?
11. boolean isInfinite() Q判断该Double对象是否是无I?
12. static boolean isInfinite(double v) Q与11cMQ不同的是:此ؓcL法,判断的是v?
13. boolean isNaN() Q判断该Double对象是否为非数倹{?
14. static boolean isNaN(double v) Q功能与13一P只不q判断v?
15. long longValue() Q返回该Double对象的长整数倹{?
16. static float parseFloat(String s) Q将字符串{换成双精度数?
17. short shortValue() Q返回该Double对象的短整数倹{?
18. String toString() Q将该Double对象转换成字W串?
19. static String toString(Double f) Q功能与18一P只是转换f?
20. static Double valueOf(String s) Q将字符串{换成双精度数?/ul>
]]>
|
+-- build/ <-- WAR/EAR档的目录
+-- classes/ <-- ~译的输出目录,与JBuilder兼容
+-- src/ <-- Java源文件目?br />
+-- web/ <-- WEB Content 目录
| |
| +--pages/ <-- JSP 文g目录
| +--WEB-INF/ <-- web.xml {配|文?br />
+-- ejb <-- EJB Content 目录
| |
| +---INF/ <-- EJB 配置文g
+-- ear <-- EAR Content 目录
| |
| +---INF/ <-- EAR 配置文g
|-- lib <-- 目所要用到的library
接下来第一步,是要先定义好一些全局的参敎ͼ以便以后更改h方便Q风?br /> 大家自己选择好了Q我用的是如下的方式Q?/span>
(1) l出目的目录:
<!--// project directories //--><property name="dir.project"
="D:/Code/MyProject"/><property name="dir.project.lib"
="${dir.project}/lib"/><property name="dir.project.src"
="${dir.project}/src"/><property name="dir.project.web_module"
="${dir.project}/web"/><property name="dir.project.ejb_module"
="${dir.project}/ejb"/><property name="dir.project.ear_module"
="${dir.project}/ear"/><!--// compile, build and deploy
directories //--><property name="dir.project.compile"
="${dir.project}/classes"/><property
name="dir.project.compile.jspcache"
="${dir.project.compile}/jspcache"/><property
name="dir.project.build" ="${dir.project}/build"/><!--// J2EE
Container //--><property name="dir.appserver.tomcat.home"
="D:/J2EE_HOME/AppServer/Tomcat"/><property
name="dir.appserver.oc4j.j2ee.home"
="D:/J2EE_HOME/AppServer/OC4J/j2ee/home"/>
(2) 定义Java Source的编译选项
<!--//
Java compiler options //--> <property name="opt.compile.source"
="1.4"/><property name="opt.compile.target"
="1.4"/><property name="opt.compile.encoding"
="UTF-8"/><property name="opt.compile.deprecation"
="on"/><property name="opt.compile.debug" ="on"/><property
name="opt.compile.optimize" ="off"/>
(3) 如果需?import EJB library 的话Q给Z面的定义Q后面会用到
<!--// EJB imported resource //--><property name="import.ejb.report.server" ="${dir.project.lib}/Appwork.jar"/>
(4) l出部vWAR/EAR文g的名Uͼ
<!--// Deployment //--><property name="deploy.file.ejb_module"
="MyApp_EJB.jar" /><property name="deploy.file.web_module"
="MyApp_WEB.war" /><property name="deploy.file.ear_module"
="MyApp.ear" />
(5) l出CLASSPATH的定义,引入相关的Library和项目编译生成的Java Classes
<path id="CLASSPATH"><!--// Tomcat Libraries
//--><fileset dir="${dir.appserver.tomcat.home}/bin">
<include name="*.jar"/></fileset> <fileset
dir="${dir.appserver.tomcat.home}/server/lib"> <include
name="*.jar"/> </fileset> <fileset
dir="${dir.appserver.tomcat.home}/common/lib"> <include
name="*.jar"/> </fileset> <!--// Depended Libraries
//--><pathelement
location="${dir.project.lib}/abc.jar"/><pathelement
location="${dir.project.lib}/AppServer.jar"/><pathelement
location="${dir.project.lib}/AppServiceClient.jar"/><pathelement
location="${dir.project.lib}/AppUtil.jar"/><pathelement
location="${dir.project.lib}/xport.jar"/><pathelement
location="${dir.project.lib}/jaxen-full.jar"/><pathelement
location="${dir.project.lib}/jstl.jar"/><pathelement
location="${dir.project.lib}/log4j-1.2.13.jar"/><pathelement
location="${dir.project.lib}/ojdbc14.jar"/><pathelement
location="${dir.project.lib}/saxpath.jar"/><pathelement
location="${dir.project.lib}/standard.jar"/><pathelement
location="${dir.project.lib}/taglibs-log.jar"/><!--// Project
classes //--><pathelement
location="${dir.project.compile}"/></path>
(6) 基本的clean和init的task
<target name="clean"><delete
dir="${dir.project.build}"/><delete
dir="${dir.project.compile.jspcache}"/><delete
dir="${dir.project.compile}"/><delete
dir="${dir.project.web_module}/WEB-INF/classes"/><delete
dir="${dir.project.web_module}/WEB-INF/lib"/></target><target
name="init"><mkdir dir="${dir.project.compile}"/><mkdir
dir="${dir.project.compile.jspcache}"/><mkdir
dir="${dir.project.web_module}/WEB-INF/classes"/><mkdir
dir="${dir.project.web_module}/WEB-INF/lib"/><mkdir
dir="${dir.project.build}"/></target>
(7) ~译Java Source
<target
name="src_compile" depends="init"><!--// compile the Java source
//--><javac srcdir="${dir.project.src}"
destdir="${dir.project.compile}" encoding="${opt.compile.encoding}"
source="${opt.compile.source}" target="${opt.compile.source}"
deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}"
optimize="{opt.compile.optimize}" ><classpath
refid="CLASSPATH"/><include
name="**/*.java"/></javac><!--// copy the classpath
resources //--><copy
todir="${dir.project.compile}"><fileset
dir="${dir.project.src}"><exclude
name="**/*.java"/></fileset></copy> </target>
(8) 预编译JSP文gQ可选择ZTomcat或是Oracle Application Server
<!--// for Tomcat //--> <target name="jsp_src_generate"
depends="src_compile"><taskdef classname="org.apache.jasper.JspC"
name="jasper2"><classpath refid="CLASSPATH"/>
</taskdef><jasper2 validateXml="false"
verbose="9"uriroot="${dir.project.web_module}"
outputDir="${dir.project.compile.jspcache}"
webXmlFragment="${dir.project.compile.jspcache}/generated-web.xml"
/> </target><target name="jsp_src_compile"><javac
srcdir="${dir.project.compile.jspcache}"
destdir="${dir.project.compile.jspcache}"
encoding="${opt.compile.encoding}" source="${opt.compile.source}"
target="${opt.compile.source}"
deprecation="${opt.compile.deprecation}"debug="${opt.compile.debug}"
optimize="{opt.compile.optimize}" ><classpath
refid="CLASSPATH"/><include
name="**"/></javac></target><target
name="jsp_precompile" depends="src_compile, jsp_src_generate,
jsp_src_compile" />
<property name="app.name" ="demo"/>
<property name="app.dir" location="../WebRoot"/>
<property name="webserver.home" location="../../../platform/jakarta-tomcat-5.0.19"/>
<property name="webserver.deploy" location="${webserver.home}/webapps/"/>
<property name="src.dir" location="../src"/>
<property name="build.dir" location="${app.dir}/WEB-INF/classes"/>
<property name="lib.dir" location="${app.dir}/WEB-INF/lib"/>
<property name="dist.dir" location="../dist"/>
<property name="properties.dir" location="${src.dir}/com/easydone/struts/ApplicationResources.properties"/>
<property name="properties_zh.dir" location="${build.dir}/com/easydone/struts/ApplicationResources_zh.properties"/>
<property name="doc.dir" ="../api"/>
<property name="packages" ="com.easydone.*"/>
<echo>+--------------------------------------------------+</echo>
<echo>| |</echo>
<echo>| R U N N I N G A N T REPOSITORY |</echo>
<echo>| |</echo>
<echo>+--------------------------------------------------+</echo>
<!---Help Information-->
<target name="usage" >
<echo message=""/>
<echo message="-------------------------------------------------------------"/>
<echo message="操作说明Q?/>
<echo message="首先您~写的java文g拯?{src.dir}目录?按先后顺序执行以下命令既可?/>
<echo message="W一步:compile 命o~译*.java"/>
<echo message="W二步:deploy 命o生成${app.name}.jar文g"/>
<echo message="W三步:doc 命o生成详细javadoc文档"/>
<echo message="每一步操作都能看?BUILD SUCCESSFUL提示后,表示您操作成功!"/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
</target>
<!-- =================================================================== -->
<!-- 讄应用环境变量 -->
<!-- =================================================================== -->
<path id="compile.classpath">
<pathelement path ="${build.dir}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- =================================================================== -->
<!-- 格式化中文资源包Q解军_际化中文问题 -->
<!-- =================================================================== -->
<target name="checkToZh">
<uptodate property="toZh.notRequired"
srcfile="${properties.dir}"
targetfile="${properties_zh.dir}"/>
</target>
<target name="toZh" depends="checkToZh" unless="toZh.notRequired">
<delete file="${properties_zh.dir}"/>
<!-- native2ascii struts.properties -->
<exec executable="native2ascii">
<arg line=" ${properties.dir} ${properties_zh.dir}"/>
</exec>
<echo message="toZh performed!"/>
</target>
<!-- =================================================================== -->
<!-- 初始化创建相兛_用目?nbsp; -->
<!-- =================================================================== -->
<target name="prepare" deion="create build,dist files">
<mkdir dir="${build.dir}"/>
<mkdir dir="${dist.dir}"/>
</target>
<!-- =================================================================== -->
<!-- 初始化应用程序,删除相关目录 -->
<!-- =================================================================== -->
<target name="clean" deion="Delete build files">
<delete dir="${build.dir}"/>
<delete dir="${dist.dir}"/>
</target>
<!-- =================================================================== -->
<!-- compile 命oQ执行javac~译命o -->
<!-- =================================================================== -->
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}" destdir="${build.dir}" debug="on">
<classpath refid="compile.classpath"/>
</javac>
</target>
<!-- =================================================================== -->
<!-- update命oQ编译及处理国际化中文资源文? -->
<!-- =================================================================== -->
<target name="update" depends="compile,toZh">
<!--copy classes-->
<copy todir="${webserver.deploy}/${app.name}/WEB-INF/classes" includeEmptyDirs="no">
<fileset dir="${build.dir}"/>
</copy>
<!--copy pages-->
<copy todir="${webserver.deploy}/${app.name}" includeEmptyDirs="no">
<fileset dir="${app.dir}"/>
</copy>
<!-- copy libs-->
<copy todir="${webserver.deploy}/${app.name}/WEB-INF/lib" includeEmptyDirs="no">
<fileset dir="${lib.dir}"/>
</copy>
</target>
<!-- =================================================================== -->
<!-- 部v应用E序Q依赖于 compile命oclean,prepare,compile,dist -->
<!-- =================================================================== -->
使用SSIQServer Side IncludeQ的html文g扩展名,SSIQServer Side IncludeQ,通常UCؓ“服务器端嵌入”或者叫“服务器端包含”Q是一U类gASP的基于服务器的网制作技术?/p>
内容发送到览器之前,可以使用“服务器端包含 (SSI)”指o文本、图形或应用E序信息包含到网中。例如,可以使用 SSI 包含旉/日期戟뀁版权声明或供客户填写ƈq回的表单。对于在多个文g中重复出现的文本或图形,使用包含文g是一U简便的Ҏ。将内容存入一个包含文件中 卛_Q而不必将内容输入所有文件。通过一个非常简单的语句卛_调用包含文gQ此语句指示 Web 服务器将内容插入适当|页。而且Q用包含文件时Q对内容的所有更改只需在一个地方就能完成?/p>
因ؓ包含 SSI 指o的文件要求特D处理,所以必Mؓ所?SSI 文g赋予 SSI 文g扩展名。默认扩展名?.stm?shtm ?.shtml?/p>
Web 服务器在处理|页的同时处?SSI 指o。当 Web 服务器遇?SSI 指oӞ直接包含文件的内容插入 HTML |页。如?#8220;包含文g”中包?SSI 指oQ则同时插入此文件。除了用于包含文件的基本指o之外Q还可以使用 SSI 指o插入文g的相关信息(如文件的大小Q或者运行应用程序或 shell 命o?/p>
|站l护常常到的一个问题是Q网站的l构已经固定Q却Z更新一点内容而不得不重做一大批|页。SSI提供了一U简单、有效的Ҏ来解册一? 题,它将一个网站的基本l构攑֜几个单的HTML文g中(模板Q,以后我们要做的只是将文本传到服务器,让程序按照模板自动生成网,从而ɽ理大型|? 站变得容易?/p>
所以,利用SHTML格式的页面目的和 ASP 差不多,但是因ؓ?API 所以运转速度更快Q效率更高,比ASP快,比HTML慢,但由于可以用服务器端包含,因此佉K面更新容易(特别是批量更新bannerQ版权等Q,惌 一下吧Q你有一D?HTMLQ要在中间穿插一些特D的服务端脚本,比如插入其他 HTML D落Q你选择 ASP 来完成这个Q务,但是如果d更繁重,需要更多的旉Q比?5 sQ这个时候你不用 ASP 而用 SHTMLQ或许处理时间就只用 4s 了?/p>
之所以要扯到 SSIQ是因爲 Shtml - Server-Parsed HTML 的首字母~略词。包含有嵌入式服务器方包含命令的 HTML 文本。在被传送给览器之前,服务器会?SHTML 文档q行完全地读取、分析以及修攏Vshtml和asp 有一些相|以shtml命名的文仉Q用了ssi的一些指令,像asp中的指oQ你可以在SHTML文g中写入SSI指oQ当客户端访问这? shtml文gӞ服务器端会把q些SHTML文gq行d和解释,把SHTML文g中包含的SSI指o解释出来比如Q你可以在SHTML文g中用SSI 指o引用其他的html文gQ#i nclude Q,服务器传送给客户端的文gQ是已经解释的SHTML不会有SSI指o。它实现了HTML所没有的功能,是可以实现了动态的SHTMLQ可以说? HTML的一U进化吧。像新浪的新ȝl就是这LQ新dҎ固定的但它上面的q告和菜单等是用#i nclude引用q来的?/p>
目前Q主要有以下几种用用途:
高SSI<XSSI>可设|变量用if条g语句?/p>
SSI是ؓWEB服务器提供的一套命令,q些命o只要直接嵌入到HTML文档的注释内容之中即可。如Q?/p>
<!--Qi nclude file="info.htm"-->
是一条SSI指oQ其作用是将"info.htm"的内Ҏ贝到当前的页面中Q当讉K者来览Ӟ会看到其它HTML文档一hC? info.htm其中的内宏V其它的SSI指o使用形式基本同刚才的举例差不多,可见SSI使用只是插入一点代码而已Q用Ş式非常简单。当Ӟ如果 WEB服务器不支持SSIQ它׃只不q将它当作注释信息,直接跌其中的内容;览器也会忽略这些信息?/p>
在一些WEB服务器上Q如IIS 4.0/SAMBAR 4.2Q,包含 Qi nclude 指o的文件必M用已被映到 SSI 解释E序的扩展名Q否则,Web 服务器将不会处理该SSI指oQ默认情况下Q扩展名 .stm?shtm ?.shtml 被映到解释E序QSsinc.dllQ?br /> Apache则是Ҏ你的讄情况而定Q修改srm.conf如:
AddType text/x-server-parsed-html .shtml 只?shtml扩展名的文g解析SSI指o
AddType text/x-server-parsed-html .html 对所有HTML文档解析SSI指o
Netscape WEB服务器直接?Administration Server(理服务?可打开SSI功能?br />
Website 使用 Server Admin E序中的 Mapping 标签Q扩展名d内容cd为:wwwserver/html-ssi
Cern 服务器不支持SSIQ可用SSI诈骗法,?http://sw.cse.bris.ac.uk/WebTools/fakessi.html 上下载一个PERL脚本Q即可你的CERN服务器用一些SSI指o。(不支持exec指o。)
E序代码Q?/p>
<!-- 指o名称="指o参数">
CZQ?/p>
<!--Qi nclude file="info.htm"-->
说明Q?/p>
注意Q?/p>
Qe cho C
作用Q将环境变量插入到页面中?/p>
语法Q?/p>
<!--Qe cho var="变量名称"-->
CZQ?/p>
<!--Qe cho var="DOCUMENT_NAME"--> 本文档名U?br />
<!--Qe cho var="DATE_LOCAL"--> 现在旉
<!--Qe cho var="REMOTE_ADDR"--> 你的IP地址
Qi nclude C
作用Q将文本文g的内容直接插入到文档面中?/p>
语法Q?/p>
<!--Qi nclude file="文g名称"-->
<!--Qi nclude virtual="文g名称"-->
file 文g名是一个相对\径,该\径相对于使用 Qi nclude 指o的文档所在的目录。被包含文g可以在同一U目录或其子目录中,但不能在上一U目录中。如表示当前目录下的的nav_head.htm文档Q则为file="nav_head.htm"?br /> virtual 文g名是 Web 站点上的虚拟目录的完整\径。如表示相对于服务器文档根目录下hoyi目录下的nav_head.htm文gQ则为file="/hoyi/nav_head.htm"
参数Q?/p>
file 指定包含文g相对于本文档的位|?br /> virtual 指定相对于服务器文档根目录的位置
注意Q?/p>
CZQ?/p>
<!--Qi nclude file="nav_head.htm"--> 头文g插入到当前页?br /> <!--Qi nclude file="nav_foot.htm"--> 尾文g插入到当前页?/p>
Qf lastmod ?Qf size C
作用Q?/p>
Qf lastmod 文g最q更新日?br /> Qf size 文g的长?/p>
语法Q?/p>
<!--Qf lastmod file="文g名称"-->
<!--Qf size file="文g名称"-->
参数Q?/p>
file 指定包含文g相对于本文档的位|??info.txt 表示当前目录下的的info.txt文档
virtual 指定相对于服务器文档根目录的位置 ?/hoyi/info.txt 表示
注意Q文件名U必d有扩展名?/p>
CZQ?/p>
<!--Qf lastmod file="news.htm"--> 当前目录下news.htm文g的最q更新日期插插入到当前页?br /> <!--Qf size file="news.htm"--> 当前目录下news.htm的文件大入到当前页?/p>
Qe xec C
作用Q将某一外部E序的输出插入到面中。可插入CGIE序或者是常规应用E序的输入,q取决于使用的参数是cmdq是cgi?/p>
语法Q?/p>
<!--Qe xec cmd="文g名称"-->
<!--Qe xec cgi="文g名称"-->
参数Q?/p>
cmd 常规应用E序
cgi CGI脚本E序
CZQ?/p>
<!--Qe xec cmd="cat /etc/passwd"--> 会昄密码文g
<!--Qe xec cmd="dir /b"--> 会昄当前目录下文件列?br />
<!--Qe xec cgi="/cgi-bin/gb.cgi"--> 会执行CGIE序gb.cgi?br />
<!--Qe xec cgi="/cgi-bin/access_log.cgi"--> 会执行CGIE序access_log.cgi?/p>
注意Q从上面的示例可以看出,q个指o相当方便Q但是也存在安全问题?/p>
止ҎQ?/p>
Qc onfig
作用Q?指定q回l客L览器的错误信息、日期和文g大小的格式?/p>
语法Q?/p>
<!--Qc onfig errmsg="自定义错误信?-->
<!--Qc onfig sizefmt="昄单位"-->
<!--Qc onfig timefmt="昄格式"-->
参数Q?/p>
errmsg 自定义SSI执行错误信息Q可以ؓM你喜Ƣ的方式?br />
sizefmt 文g大小昄方式Q默认ؓ字节方式("bytes")可以改ؓ千字节方?"abbrev")
timefmt 旉昄方式Q最灉|的配|属性?/p>
CZQ显CZ个不存在文g的大?/p>
<!--Qc onfig errmsg="服务器执行错误,误pȝ理员 yiho@126.comQ谢谢!"-->
<!--Qf size file="不存在的文g.htm"-->
以千字节方式昄文g大小
语法Q?/p>
<!--Qc onfig sizefmt="abbrev"-->
<!--Qf sizefile="news.htm"-->
以特定的旉格式昄旉
<!--Qc onfig timefmt="%Yq?%m?d?星期%W 北京旉%H:%M:%sQ?Yq已q去?j?今天?Yq的W?U个星?-->
<!--Qe cho var="DATE_LOCAL"--> 昄今天是星期几Q几月,时区
<!--Qc onfig timefmt="今天%AQ?%B Q服务器时区?%zQ是"-->
<!--Qe cho var="DATE_LOCAL"-->
XSSIQExtended SSIQ是一l高USSI指oQ内|于Apache 1.2或更高版本的mod-include模块之中。其中可利用的的指o有:
#printenv
#set
#if
#printenv
作用Q?昄当前存在于WEB服务器环境中的所有环境变量?/p>
语法Q?/p>
<!--#printenv-->
#set
作用Q可l变量赋|以用于后面的if语句?/p>
语法Q?/p>
<!--#set var="变量? ="变量?-->
CZQ?/p>
<!--#set var="color" ="U色"-->
#if
作用Q创建可以改变数据的面Q这些数据根据用if语句时计的要求予以昄?/p>
语法Q?/p>
<!--#if expr="$变量?""变量值A"""-->
昄内容
<!--#elif expr="$变量?""变量值B"""-->
昄内容
<!--#else-->
昄内容
<!--#endif"-->
CZQ?/p>
<!--#if expr="$SERVER_NAME=""hoyi.zb169.net"""-->
Ƣ迎光好易CGI工厂在淄博热U的分站 http://hoyi.zb169.net?br />
<!--#elif expr="$SERVER_NAME=""linux.cqi.com.cn""" -->
Ƣ迎光好易CGI工厂在太阛_的分?http://linux.cqi.com.cn/~hoyi?br />
<!--#else-->
Ƣ迎光好易CGI工厂Q?br />
<!--#endif"-->
注意Q用于前面指令中的反斜杠Q是用来代换内部的引P以便它们不会被解释ؓl束表达式。不可省略?/p>
1、Config 命o
Config 命o主要用于修改SSI的默认设|。其中:
ErrmsgQ设|默认错误信息。ؓ了能够正常的q回用户讑֮的错误信息,在HTML文g中Errmsg参数必须被放|在其它SSI命o的前面,否则客户端只能显C默认的错误信息Q而不是由用户讑֮的自定义信息?/p>
<!--Qc onfig errmsg="Error! Please email webmaster@mydomain.com" -->
TimefmtQ定义日期和旉的用格式。Timefmt参数必须在echo命o之前使用?/p>
<!--Qc onfig timefmt="%AQ?%B %dQ?%Y"-->
<!--Qe cho var="LAST_MODIFIED" -->
昄l果为:
WednesdayQ?April 12Q?2000
也许用户对上例中所使用?A %B %d感到很陌生,下面我们׃表格的Ş式ȝ一下SSI中较为常用的一些日期和旉格式?/p>
SizefmtQ决定文件大是以字节、千字节q是兆字节ؓ单位表示。如果以字节为单位,参数gؓ"bytes"Q对于千字节和兆字节可以使用~写形式。同Psizefmt参数必须攑֜fsize命o的前面才能用?/p>
<!--Qc onfig sizefmt="bytes" -->
<!--Qf size file="index.html" -->
2、Include 命o
Include 命o可以把其它文档中的文字或囄插入到当前被解析的文档中Q这是整个SSI的关键所在。通过Include命o只需要改动一个文件就可以瞬间更新整个站点Q?/p>
Include 命oh两个不同的参敎ͼ
VirtualQ给出到服务器端某个文档的虚拟\径?br /> FileQ给出到当前目录的相对\径,其中不能使用"../"Q也不能使用l对路径?/p>
<!--Qi nclude virtual="/includes/header.html" -->
<!--Qi nclude file="header.html" --> q就要求每一个目录中都包含一个header.html文g?/p>
3、Echo 命o
Echo 命o可以昄以下各环境变量:
DOCUMENT_NAMEQ显C当前文档的名称?br /> DOCUMENT_URIQ显C当前文档的虚拟路径。例如:
<!--Qe cho var="DOCUMENT_NAME" -->
<!--Qe cho var="DOCUMENT_URI" -->
随着|站的不断发展,那些来长的URL地址肯定会让人头疹{如果用SSIQ一切就会迎刃而解。因为我们可以把|站的域名和SSI命ol合在一hC完整的URLQ即Q?/p>
http://YourDomain<!--Qe cho var="DOCUMENT_URI" -->
QUERY_STRING_UNESCAPEDQ显C未l{义处理的由客L发送的查询字串Q其中所有的Ҏ字符前面都有转义W?""。例如:
<!--Qe cho var="QUERY_STRING_UNESCAPED" -->
DATE_LOCALQ显C服务器讑֮时区的日期和旉。用户可以结合config命o的timefmt参数Q定制输Z息。例如:
<!--Qc onfig timefmt="%AQ?the %d of %BQ?in the year %Y" -->
<!--Qe cho var="DATE_LOCAL" -->
昄l果为:
SaturdayQ?the 15 of AprilQ?in the year 2000
DATE_GMTQ功能与DATE_LOCAL一P只不q返回的是以格林治标准旉为基准的日期。例如:
<!--Qe cho var="DATE_GMT" -->
LAST_MODIFIEDQ显C当前文档的最后更新时间。同Pq是SSI中非常实用的一个功能,只要在HTML文档中加入以下这行简单的文字Q就可以在页面上动态的昄更新旉?/p>
<!--Qe cho var="LAST_MODIFIED" -->
CGI环境变量
除了SSI环境变量之外Qecho命oq可以显CZ下CGI环境变量Q?/p>
SERVER_SOFTWAREQ显C服务器软g的名U和版本。例如:
<!--Qe cho var="SERVER_SOFTWARE" -->
SERVER_NAMEQ?昄服务器的L名称QDNS别名或IP地址。例如:
<!--Qe cho var="SERVER_NAME" -->
SERVER_PROTOCOLQ显C客Lh所使用的协议名U和版本Q如HTTP/1.0。例如:
<!--Qe cho var="SERVER_PROTOCOL" -->
SERVER_PORTQ显C服务器的响应端口。例如:
<!--Qe cho var="SERVER_PORT" -->
REQUEST_METHODQ显C客L的文档请求方法,包括GETQ?HEADQ?和POST。例如:
<!--Qe cho var="REQUEST_METHOD" -->
REMOTE_HOSTQ显C发求信息的客户端主机名U?br />
<!--Qe cho var="REMOTE_HOST" -->
REMOTE_ADDRQ显C发求信息的客户端IP地址?br />
<!--Qe cho var="REMOTE_ADDR" -->
AUTH_TYPEQ显C用戯n份的验证Ҏ?br />
<!--Qe cho var="AUTH_TYPE" -->
REMOTE_USERQ显C问受保护面的用h使用的帐号名U?br />
<!--Qe cho var="REMOTE_USER" -->
4、FsizeQ显C指定文件的大小Q可以结合config命o的sizefmt参数定制输出格式?/p>
<!--Qf size file="index_working.html" -->
5、FlastmodQ显C指定文件的最后修Ҏ期,可以l合config 命o的timefmt参数控制输出格式?/p>
<!--Qc onfig timefmt="%AQ?the %d of %BQ?in the year %Y" -->
<!--Qf lastmod file="file.html" -->
q里Q我们可以利用flastmod参数昄Z个页面上所有链接页面的更新日期。方法如下:
<!--Qc onfig timefmt=" %B %dQ?%Y" -->
<A HREF="/directory/file.html">File</A>
<!--Qf lastmod virtual="/directory/file.html" -->
<A HREF="/another_directory/another_file.html">Another File</A>
<!--Qf lastmod virtual="/another_directory/another_file.html" -->
昄l果为:
File April 19Q?2000
Another File January 08Q?2000
6、Exec
Exec命o可以执行CGI脚本或者shell命o。用方法如下:
CmdQ?bin/sh执行指定的字丌Ӏ如果SSI使用了IncludesNOEXEC选项Q则该命令将被屏蔽?br /> CgiQ可以用来执行CGI脚本。例如,下面q个例子中用服务端cgi-bin目录下的counter.pl脚本E序在每个页面放|一个计数器Q?/p>
<!--Qe xec cgi="/cgi-bin/counter.pl" -->
让我们先来看看SHTML和HTML的区别,如果用一句话来解释就?SHTML 不是HTML而是一U服务器 APIQshtml是服务器动态成的html.
虽然两者都是超文本格式Q但shtml是一U用于SSI技术的文g。也是Server Side Include--SSI 服务器端包含指o。如果Web Server有SSI功能的话Q大多数Q尤其是ZUnixq_Q的WEB服务器,如Netscape Enterprise Server{均支持SSI命o?/p>
试布局
?1 昄了用样?TestSuite ?JUnit TestSuite 布局。每个测试都pq单独的试案例构成。每个测试案例都是一个单独的c,它扩展了 TestClass cdƈ包含了我的测试代码,即那些曾?main()
中出现的代码。在该例中,我向 TestSuite d了两个测试:一个是 SkeletonTestQ我它用作所有新cd HelloWorld cȝL?
试c?HelloWorldTest.java
按照U定Q测试类的名UC包含我所试的类的名Uͼ但将 Test 附加到结。在本例中,我们的测试类?HelloWorldTest.java
。我复制?SkeletonTest 中的代码Qƈd?testSayHello()
来测?sayHello()
。请注意 HelloWorldTest 扩展?TestCase。JUnit 框架提供?assert
?assertEquals
ҎQ我们可以用这些方法来q行验证?HelloWorldTest.java
昄在清?2 中?
|
testSayHello()
看上d HelloWorld.java
中原来的 main ҎcMQ但有一个主要的不同之处。它不是执行 System.out.println
q显C结果,而是d了一?assertEquals()
Ҏ。如果两个g同, assertEquals
打印出两个输入的倹{您可能已经注意到这个方法不起作用!HelloWorld 中的 sayHello()
Ҏ不返回字W串。如果我先写q测试,׃捕捉到这一炏V我?"Hello World" 字符串与输出联lv来。这P按照清单 3 中显C的那样重写?HelloWorldQ去?main()
Qƈ更改?sayHello()
的返回类型?
|
如果我保留了 main()
q修改了联系Q代码看上去如下Q?
|
新的 main()
与我试E序中的 testSayHello()
非常怼。是的,它看上去不象是一个现实世界中的问题(q是ZؓCZ的问题)Q但它说明了问题。在单独的应用程序中~写 main()
可以改进您的设计Q同时帮助您设计试。现在我们已l创Z一个测试类Q让我们使用 Ant 来将它集成到构徏中?
![]() ![]() |
![]()
|
Jakarta Project ?Ant 工具说成“不带 make ~点?make”。Ant 正在成ؓ开放源代码世界中实际上的标准。原因很单:Ant 是?Java 语言~写的,q种语言可以让构E在多种q_上用。这U特性简化了在不?OS q_之间的程序员的合作,而合作是开放源代码C的一U需要。您可以在自己选择的^Cq行开??/em>构徏。Ant 的特性包括:
?2 要介l了一个配|文件。配|文件由目标树构成。每个目标都包含了要执行的Q务,其中d是可以执行的代码。在本例中, mkdir是目?compile的Q务?mkdir是徏立在 Ant 中的一个Q务,用于创徏目录?Ant 带有一套健全的内置d。您也可以通过扩展 Ant dcLd自己的功能?
每个目标都有唯一的名U和可选的相关性。目标相x需要在执行目标d列表之前执行。例如图 2 所C,在执?compile 目标中的d之前需要先q行 JUNIT 目标。这U类型的配置可以让您在一个配|中有多个树?/p>
?2. Ant XML 构徏?/strong>
与经?make 实用E序的相似性是非常显著的。这是理所当然的,因ؓ make 是 make。但也要C有一些差异:通过 Java 实现的跨q_和可扩展性,通过 XML 实现的可配置Q还有开放源代码?/p>
下蝲和安?Ant
首先下蝲 AntQ请参阅 参考资?/span> Q。将 Ant 解压~到 tools 目录Q再?Ant bin
目录d到\径中。(在我的机器上?e:"tools"ant"bin
。)讄 ANT_HOME 环境变量。在 NT 中,q意味着q入pȝ属性,然后以带有值的变量形式d ANT_HOME。ANT_HOME 应该讄?Ant 根目录,卛_?bin
?lib
目录的目录。(Ҏ来说Q是 e:"tools"ant
。)保 JAVA_HOME 环境变量讄为安装了 JDK 的目录。Ant 文档有关于安装的详细信息?
下蝲和安?JUnit
下蝲 JUnit 3.2Q请参阅 参考资?/span> Q。解开 junit.zip
Qƈ?junit.jar
d?CLASSPATH。如果将 junit.zip
解包到类路径中,可以通过q行以下命o来测试安装: java junit.textui.TestRunner junit.samples.AllTests
定义目录l构
在开始我们的构徏和测试过E之前,需要一个项目布局。图 3 昄了我的样本项目的布局。下面描qC布局的目录结构:
build
-- cL件的临时构徏位置。构E将创徏q个目录?
src
-- 源代码的位置?Src
被分?test
文g夹和 main
文g夹,前者用于所有的试代码Q而后者包含可交付的代码。将试代码与主要代码分L供了几点Ҏ。首先,使主要代码中的乱减。其ơ,它允许包?
齐。我q衷与类和与其相关的包放|在一赗测试就应该和测试在一赗它q有助于分发q程Q因Z不可能打将单元试分发l客戗?在实际中Q我们有多个目录Q例?distribution
?documentation
。我们还会在 main
下有多个用于包的目录Q例?com.company.util
?
因ؓ目录l构l常变动Q所以在 build.xml
中有q些变动的全局字符串常数是很重要的?
Ant 构徏配置文gCZ
下一步,我们要创建配|文件。清?4 昄了一?Ant 构徏文gCZ。构建文件中的关键就是名?runtests 的目标。这个目标进行分支判断ƈq行外部E序Q其中外部程序是前面已安装的 junit.textui.TestRunner
。我们指定要使用语句 test.com.company.AllJUnitTests
来运行哪个测试套件?
|
q行 Ant 构徏CZ
开发过E中的下一步是q行创建和试 HelloWorld cȝ构徏。清?5 昄了构建的l果Q其中包括了各个目标部分。最L那部分是 runtests 输出语句Q它告诉我们整个试套g都正运行了?
我在?4 和图 5 中显CZ JUnit GUIQ其中所要做的就是将 runtest 目标?junit.textui.TestRunner
改ؓ junit.ui.TestRunner
。当您?JUnit ?GUI 部分Ӟ您必选择退出按钮来l箋构徏q程。如果?Junit GUI
构徏包,那么它将更难与大型的构徏q程盔R成。另外,文本输出也与构徏q程更一_q可以定向输出到一个用于主构徏记录的文本文件。这对于每天晚上都要q?
行的构徏非常合适?
|
![]() ![]() |
![]()
|
让我们搞点破坏,然后看看会发生什么事。夜׃Q我们决定把 "Hello World" 变成一个静态字W串。在更改期间Q我?不小?/em>打错了字母,?"o" 变成?"0"Q如清单 6 所C?
清单 6. Hello world cL?/strong>
package com.company;public class HelloWorld { private final static String HELLO_WORLD = "Hell0 World"; public String sayHello() { return HELLO_WORLD; }}
在徏包时Q我们看C错误。清?7 昄?runtest 中的错误。它昄了失败的试cd试ҎQƈ说明了ؓ什么会p|。我们返回到代码中,Ҏ错误后离开?/p>
清单 7. 构徏错误CZ
|
// 初始化可以拖拽的Element的函敎ͼ与拖拽无关的我去掉了
draggable(el) {
// 公用的开始拖拽的函数
this ._dragStart = start_Drag;
// 公用的正在拖拽的函数
this ._drag = when_Drag;
// 公用的拖拽结束的函数
this ._dragEnd = end_Drag;
// q个函数主要用来q行拖拽l束后的dom处理
this ._afterDrag = after_Drag;
// 是否正在被拖动,一开始当然没有被拖动
this .isDragging = false ;
// 这个Element的this指针注册在elmq个变量里面Q方便在自己的上下文以外调用自己的函数等Q很常用的方?
this .elm = el;
// 触发拖拽的ElementQ在q里是q个div上显C标题的那个div
this .header = getElementById(el.id + " _h " );
// 对于有i的element拖拽不同Q这里检一下ƈ记录
this .hasI = this .elm.getElementsByTagName( " I " ).length > 0 ;
// 如果扑ֈ了headerq定drag相关的event
if ( this .header) {
// 拖拽时的叉子鼠标指针
this .header.style.cursor = " move " ;
// 函数绑定到header和element的this上,参照那个函数的说?
Drag.init( this .header, this .elm);
// 下面三个语句写好的三个函数l定l这个elemnt的三个函数钩子上Q也实Celement从draggablel承可拖拽的函数
this .elm.onDragStart = Util.bind( this , " _dragStart " );
this .elm.onDrag = Util.bind( this , " _drag " );
this .elm.onDragEnd = Util.bind( this , " _dragEnd " );
}
};
// 可拖拽Element的原形,用来eventl定到各个钩子,q部分市比较通用的,netvibes也是基本完全相同的实?
// q部分推荐看dindin的这个,也会帮助理解Q?a >http://www.jroller.com/page/dindin/?anchor=pro_java_12
var Drag = {
// 对这个element的引用,一ơ只能拖拽一个Element
obj: null ,
// element是被拖拽的对象的引用QelementHeader是鼠标可以拖拽的区?
init: (elementHeader, element) {
// startl定到down事gQ按下鼠标触发start
elementHeader.down = Drag.start;
// element存到header的obj里面Q方便header拖拽的时候引?
elementHeader.obj = element;
// 初始化绝对的坐标Q因Z是position=absolute所以不会v什么作用,但是防止后面onDrag的时候parse出错?
if (isNaN(parseInt(element.style.left))) {
element.style.left = " 0px " ;
}
if (isNaN(parseInt(element.style.top))) {
element.style.top = " 0px " ;
}
// 挂上I,初始化这几个成员Q在Drag.init被调用后才帮定到实际的函敎ͼ可以参照draggable里面的内?
element.onDragStart = new ();
element.onDragEnd = new ();
element.onDrag = new ();
},
// 开始拖拽的l定Q绑定到鼠标的移动的event?
start: (event) {
var element = Drag.obj = this .obj;
// 解决不同览器的event模型不同的问?
event = Drag.fixE(event);
// 看看是不是左键点?
if (event.which != 1 ) {
// 除了左键都不起作?
return true ;
}
// 参照q个函数的解释,挂上开始拖拽的钩子
element.onDragStart();
// 记录鼠标坐标
element.lastMouseX = event.clientX;
element.lastMouseY = event.clientY;
// Global的eventl定到被拖动的element上面?
up = Drag.end;
move = Drag.drag;
return false ;
},
// Element正在被拖动的函数
drag: (event) {
// 解决不同览器的event模型不同的问?
event = Drag.fixE(event);
// 看看是不是左键点?
if (event.which == 0 ) {
// 除了左键都不起作?
return Drag.end();
}
// 正在被拖动的Element
var element = Drag.obj;
// 鼠标坐标
var _clientX = event.clientY;
var _clientY = event.clientX;
// 如果鼠标没动׃么都不作
if (element.lastMouseX == _clientY && element.lastMouseY == _clientX) {
return false ;
}
// 刚才Element的坐?
var _lastX = parseInt(element.style.top);
var _lastY = parseInt(element.style.left);
// 新的坐标
var newX, newY;
// 计算新的坐标Q原先的坐标+鼠标Ud的值差
newX = _lastY + _clientY - element.lastMouseX;
newY = _lastX + _clientX - element.lastMouseY;
// 修改element的显C坐?
element.style.left = newX + " px " ;
element.style.top = newY + " px " ;
// 记录element现在的坐标供下一ơ移动?
element.lastMouseX = _clientY;
element.lastMouseY = _clientX;
// 参照q个函数的解释,挂接上Drag时的钩子
element.onDrag(newX, newY);
return false ;
},
// Element正在被释攄函数Q停止拖?
end: (event) {
// 解决不同览器的event模型不同的问?
event = Drag.fixE(event);
// 解除对Global的event的绑?
move = null ;
up = null ;
// 先记录下onDragEnd的钩子,好移除obj
var _onDragEndFuc = Drag.obj.onDragEnd();
// 拖拽完毕Qobj清空
Drag.obj = null ;
return _onDragEndFuc;
},
// 解决不同览器的event模型不同的问?
fixE: (ig_) {
if ( typeof ig_ == " undefined " ) {
ig_ = event;
}
if ( typeof ig_.layerX == " undefined " ) {
ig_.layerX = ig_.offsetX;
}
if ( typeof ig_.layerY == " undefined " ) {
ig_.layerY = ig_.offsetY;
}
if ( typeof ig_.which == " undefined " ) {
ig_.which = ig_.button;
}
return ig_;
}
};
// 下面是初始化的函CQ看看上面这些东西怎么被调?
var _IG_initDrag = (el) {
// column那个容器Q在google里面是那个table布局的tbodyQnetvibes用的<div>
Util.rootElement = el;
// q个tbody的行
Util._rows = Util.rootElement.tBodies[ 0 ].rows[ 0 ];
// 列,google?列,其实也可以更?
Util.column = Util._rows.cells;
// 用来存取可拖拽的对象
Util.dragArray = new Array();
var counter = 0 ;
for ( var i = 0 ; i < Util.column.length; i ++ ) {
// 搜烦所有的column
var ele = Util.column[i];
for ( var j = 0 ; j < ele.childNodes.length; j ++ ) {
// 搜烦每一column里面的所有element
var ele1 = ele.childNodes[j];
// 如果是div把它初始化Z个draggable对象
if (ele1.tagName == " DIV " ) {
Util.dragArray[counter] = new draggable(ele1);
counter ++ ;
}
}
}
};
// google的页面里可以拖动的部分的id?t_1"
// 挂蝲刎ͼ载入完毕执行。不q实际上google没有用?
// 而是写在面最下面Q异曲同工吧Q也许直接写在页面是U怪癖Q或者也有可能是兼容性考虑?
// 请将下面两条被注释掉的代码加Q到你自׃载的一个google ig面里面Q把里面的所有其余删除,挂上q个js也可以拖拽了Q哈?
// _table=getElementById("t_1");
// = _IG_initDrag(_table);