2010年3月17日
MVC模式,学了快半年了,终于领悟到它的内涵了。
M-model 模型,V-view 视图,C-controler控制器
用户访问到的是视图层,也就是页面,jsp;把请求给servlet也就是控制层,控制层调用业务层来做出相应的处理,将信息返回给视图层显示出来。那么业务层怎么做呢,首先需要一个DAO也就是对数据库进行操作,然后需要相应的Bean。这样思路就清晰了多了,数据层DAO封装对数据库的操作,业务层做处理来访问数据层,servlet层用来响应视图层请求。
在数据层和业务层中,每个类都配一个接口,这样的话,有便于以后程序的扩展。
最近在做一个web项目,老师只把我们领进了门,自己修行可真难啊
posted @
2010-04-25 17:23 张贝贝 阅读(1545) |
评论 (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 张贝贝 阅读(1016) |
评论 (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 张贝贝 阅读(167) |
评论 (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 张贝贝 阅读(1297) |
评论 (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 张贝贝 阅读(1607) |
评论 (1) |
编辑 收藏