离弦之Ray

  语源科技BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

#

 

基础概念——Class Modeling

OO的概念——这就不多说了


三种模型

class model——描述object的结构

state model——描述单个object的行为

interaction model——描述object之间的互动行为


Class Model

单个的class图很简单


首先是类名、然后是属性,最后是方法。

前面的+表示public,-表示private,#表示protected


Association


形式上Association就是一根线,表示两个类之间的关系,线上可以标明Association的名字,两端可以标上multiplicity:1表示one,"1..*"表示one or more,"3..5"表示three to five,

"*"表示many

两个类之间可以有多于一个Association,但一般不常用


Association End Names


Association
的两端可以标上两个类在这个关系中的角色

这在两个类的关系中作用可能不是特别明显,但如果相关的双方属于同一个类


Association两端可以加很多限制



等等,还有Bags对应于sequence,没有先后次序。


Qualified Association


首先是没有Qualified的


然后是Qualified



N-ary Association


Generalization

具体在编程语言中,就是继承关系


很简单不多说


Association->Aggregation->Composition


Aggregation表现的是一种part-whole的关系


Composition


Composition
与Aggregation的区别是part只能属于一个Assembly

可以说Association->Aggregation->Composition关系一层强过一层


Abstract Class 类名用斜体字


属性有一种叫做Derived Data,它的意思是这个属性是被其它属性或类导出来的,被其它elements所决定,符号是在这个属性前面加上斜杠


如上图中,age由birthdate 和 currentDate所决定。

最后一种图示,就是package


posted @ 2007-10-15 11:30 离弦之ray的技术天空 阅读(755) | 评论 (0) | 编辑 收藏

 

servlet 基本结构

public class ServletClass extends HttpServlet {

public void doGet(HttpServletRequest request, HttpSevletResponse response)

throws ServletException,IOException{

//Use “request” to read incoming HTTP headers


//Use “response” to specify the HTTP response status


//use “out” to send content to browser

PrintWriter out = response.getWriter();

}

}

如果希望servlet对GET和POST请求采用同样的行动,只需要让doGet调用doPost,反之亦然。
值得注意的是doGet和doPost都要接收以上两种类型的参数。


servlet 处理表单数据

表单数据

(1)使用FORM来创建HTML表单

<FORM ACTION="..."> 其中 "..."指的就是处理表单的servlet 或者JSP

(2)使用输入元素收集用户数据

<INPUT TYPE="TEXT" NAME="...">

(3)在接近表单的尾部放置提交按钮

<INPUT TYPE="SUBMIT">

读取表单数据

有三种情况:①request.getParameter②request.getParameterValues

③request.getParameterNames

getParameter对应于单个值的读取,如果有这个参数但没值,那就返回空的String;如果没有这个参数,则返回null

getParameterValues对应于同一个参数的多个值,返回的是一个数组,是这个参数值的集合。如果不存在这个参数名,那就返回一个null;如果这个参数只有一个值,那就返回一个只有一个元素的数组。

getParameterValues返回的是所有参数的一个Enumeration,如果没有参数,那返回的就是一个空的Enumeration而不是null。同时这个Enumeration中的次序是乱序的。

要对参数为null或者为空String的情况作出相应的处理

if((param==null)||(param.trim().equals(""))){...}


RequestDispatcher

下面的代码:

RequestDispatcher dispatcher = request.getRequestDispathcer s(address);

dispatcher.forward (request,response);



JSP

JSP直接插入表达式

<%= Java Expression%> 比如:<%= new java.util.Date() %>

其实,JSP在后台都被转化成servlet,所以servlet 和 JSP没有本质的区别。


scriptlet

说白了,就是直接在JSP页面中插入java代码,我不是很喜欢,太乱了。举个例子:

<% if(Math.random()<0.5) {%>

<H1>Have a <I>nice</I> day!</H1>

<% } else {%>

<H1>Have a <I>lousy</I>day!</H1>

<% } %>

JSP page指令

import 属性

<%@ import = "package.class"%>

<%@ import = "package.class1,package.class2...package.classN"%>

contentType和pageEncoding属性

<%@ page contentType = "someMimeType; charset = someCharacterSet"%>

比如<%@ page contentType = "application/vnd.ms-excel"%>

pageEncoding指的是字符集

比如设置成日语:<%@ page pageEncoding="Shift_JIS"%>


session属性

控制页面是否参加HTTP会话

<%@ page session = "true"%>


isELIgnored属性

是否忽略JSP2.0表达式语言

<%@ page isELIgnored = "ture"%>


此外还有buffer、autoFlush、errorPage、isErrorPage、isThreadSafe、extends、language属性


在JSP中使用JavaBean

基本要掌握三个语句

<jsp: useBean id="beanName" class="package.class"/>

<jsp:getProperty name = "beanName" property="propertyName"/>

<jsp:setProperty name ="beanName" property="propertyName" value="propertyValue"/>






posted @ 2007-10-14 22:57 离弦之ray的技术天空 阅读(652) | 评论 (0) | 编辑 收藏

 

Java类型相关

类型名

大小

取值范围

byte

8 bits

-128~127

short

16 bits

-32768~32767

int

32 bits

long

64 bits

float

32 bits

double

64 bits

Java常量

①十进制不能以0打头(数字0除外)

②十六进制必须以0x或者0X打头

③八进制必须以0打头

④长整型必须以L结尾

⑤小数常量默认为double型,如果要将小数赋值给float变量,数字后面要加f

final关键字

final 标记的类不能被继承

final 变量是常量,不能改变

final 方法不能被子类重写

Java变量

(1)当发生隐式类型转换时,目标类型取值范围要大于源类型取值范围

(2)字符串可以使用加号同其它的数据类型相连而形成一个新的字符串

Example:

System.out.println(‘a’+1);    输出的是98

System.out.println(“”+’a’+1); 输出的是”a1”

(3)局部变量一定要进行初始化

        编译的时候可能只是警告,但在使用时就会报错

Java运算

(1)       整数之间做除法时,只保留整数部分而舍弃小数部分。

(2)       养成这样的习惯:把x==3 写成 3==x

(3)       &和&&的区别

&&称为短路表达式,意思就是&不管两边是true或者false都会算一下,而&&如果算到前面的是false,它后面就不算了,反正综合起来表达式肯定是false。

(4)       位运算

<< 左移

>> 右移

   如果最高位是0,左边移空的高位就填0,如果最高位是1,左边移空的高位就填入1

>>> 无符号右移

   不管最高位是什么,移空的高位一律填入0

右移n位就是除以2的n次方

左移n位就是乘以2的n次方

Java内存

(1)Java内存分为两种:

①栈内存:用于存放基本类型变量和对象的引用变量

②堆内存:new创建的对象和数组

(2)当堆内存中的对象没有引用指向它时,它就变成了垃圾,会被垃圾回收器回收。

Java面向对象

(1)= =常用来比较引用是否指向同一个地址

     equals()用来比较对象的内容是否一样

     对于数组有Array.equals方法

(2)finalize()方法,它相当于C++中的析构函数,但又和析构函数不一样。因为Java里面已经有垃圾回收器了,所以finalize方法不是特别重要。另外,finalize是在对象被当成垃圾从内存中释放前调用,而不是在对象变成垃圾前调用,垃圾回收器什么时候清理垃圾是不定时的,所以不要指望用finalize做什么必要的收尾工作,因为你根本无法确定它会赶在垃圾回收器之前执行。

(3)System.gc()这个语句可以显式地调用垃圾回收器回收垃圾。

Java参数传递

(1)       基本类型的变量作为实参传递,并不能改变这个变量的值

举个例子,就是main函数里面定义的一个变量,传给一个方法,改下值,其实并没有改变main函数里面那个变量而是改了那个方法自己内部的那个副本。

(2)       那如果传递的是某个对象的引用呢?

道理一样,传递的是值,这个“值”就是引用的“值”,也就是对象的内存地址,方法通过这个地址对变量进行的修改,当然就是对main函数中定义的这个变量本身的修改了。

Java内部类

A类里面定义了B类,那么B就叫做内部类,A就叫做外部类。

B可以直接访问A类的所有变量和方法,反之不成立。

B类保存了A类的this引用。

内部类可以是static的

如果内部类被声明为static,那么它可以包含static的变量,但不再能访问外部类的非static变量。

方法内定义的内部类,只能访问方法中的final变量,而不能访问临时变量,但可以访问外部类的变量。

Java异常

(1)       一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类

(2)       如果父类抛出多个异常,那么覆盖方法必须抛出那些异常的一个子集,也就是说,不能抛出新的异常。

Java线程

两种实现多线程方式

(1)       直接继承Thread

MyThread extends Thread

然后

MyThread t = new MyTread();

t.start();

t.start();

值得注意的是,无论调用start多少遍只能启动一个线程。

要实现多个线程,只能生成多个对象,分别启动线程,一个对象只能启动一个线程

(2)       实现Runnable接口

MyThread implements Runnalbe

然后

new Thread(t).start();

new Thread(t).start();

这种方法就能实现多个线程。

但这两种方法启动的多个线程又有不一样的地方:

第一种因为是生成了多个对象,所以类中声明的一些资源,比如变量等等都是各不相关的。

第二种对类中声明的资源是多个线程共享的。

所以要按需选择。

Java String和StringBuffer

String 对象不能轻易被改变,经常用的“+”其实是新生成了一个String对象,平常感觉不大,但是真的在大型应用中,对效率影响非常严重。

StringBuffer对象可以改动,一旦生成了不再变化的内容,就可以调用它的toString方法,把它转化为String对象。

posted @ 2007-10-10 10:51 离弦之ray的技术天空 阅读(641) | 评论 (1) | 编辑 收藏

 

Template method pattern

从这个模式的名字就可以知道个大概,Template说明这个模式有一个模版,子类都要按照父类列出的大纲来干活。在这个模式中,父类通常是abstract的。为什么不用接口?因为对某些所有子类都要用到的方法,父类中就给出了代码,而接口中是不能有具体实现代码的。

父类中有一个总的方法就是所谓的template method,这个方法通常被声明为final,这样子类就无法override它,保证了它的权威性。这个template method调用其它方法,这些“其它方法”包括了三个类型:

第一种,是abstract类型,子类需要根据自己的情况实现这部分代码;

第二种,是final型的,这种方法父类把它写死了,子类必须遵守;

第三种,就是普通方法,是optional的,子类可以延用父类的方法,也可以override掉它,写自己的代码,这种optional的方法给它一个名字叫做hook。

这个父类通常是这种形势。

abstract class AbstractClass{

  final void templateMethod(){

      a();

      b();

      c();

      …

}

    abstract void a();

    final void b(){}

    void c(){}

}

应该说这个模式既蕴含着权威性和自由性。

Iterator and Composite Patterns

       这个模式的研究对象是Collection,包括ArrayList、Array甚至还有Hashmap等等一切java里面的集合对象。Iterator的理念是把集合对象中的遍历等功能独立抽取出来,实现一个Iterator的接口,主要实现next()和hasNext()两个方法,这些东西和数据结构里面的东西基本一样。

而以此为基础的Composite Pattern其实就是数据结构里面树的概念,所以这里的东西还是找本数据结构书看看更好。

The State Pattern

       初看这个模式,发现里面有一个类似UML中状态图的东西,如其名字,这个模式主要描述如何处理应用中出现的“状态”。

       解决方式是这样的:

.      第一步,创建一个叫做State的接口,里面包含什么东西呢?记得UML状态图中发生状态转换时箭头上面那些改变的条件?把这些条件全部转化为方法,表示当这个条件发生时,状态该怎么变。

       第二步,每个具体的concreteState都要实现都要实现State这个接口。怎么实现?当然,state不是独立出现的,总有一个把它作为参数的类,里面有个私有变量保存当前的状态,暂且就把它称作currentState吧。接口中定义的方法,在concreteState中这样实现:每个方法根据条件定义,将currentState改成相应的状态。

       以上其实就是State Pattern的精髓。

posted @ 2007-09-22 13:51 离弦之ray的技术天空 阅读(266) | 评论 (0) | 编辑 收藏

 

Singleton Pattern

针对一些在应用中只会有一个对象存在的类而总结的模式。

令人意想不到的是,它是通过声明该类的构造函数为私有这种方法来实现的。

疑问就是,既然构造函数都成私有了,那怎么来创建这个类的对象呢?

解答就是通过在类中声明一个静态方法,返回这个对象。

典型的写法是

public static Singleton getInstance(){

 if(uniqueInstance==null){uniqueInstance = new Singleton();}

return uniqueInstance;

}

这个模式的精髓就这么简单,剩下的就是线程对对象的操作安全,要把这个方法加上synchronized关键字。

Command Pattern

书中是以餐馆点菜作比来讲述这个模式的。

其中的对比概念如下

Customer-------Client

Order------------Command

Waitress--------Invoker

Cook------------Receiver

Take order--------setCommand

orderUp-----------excute

怎么来解释呢?说白了,就是把调用类要达成的操作封装成一个Command对象,就像点菜那张单子一样,当然这个Command要符合一定的规则实现Command接口,里面非常重要的一个方法就是execute。

setCommand方法相当于waitress把菜单递给了厨师,在接收者方面他只管运行execute,具体做什么传过来的command对象都已经设定好了。

Adapter & Façade

适配器模式其实没什么多说的,就是要把传过去的对象要实现接收者支持的格式,那个格式实际上就是一个接口。

而Façade模式是一种衍生物,它的目的是让操作简单化。将一系列不同对象中的操作整合,提供给其它类调用接口书上的例子是家庭影院,要看部电影,要开这个电器,开那个电器,通过Façade模式,将要看电影所必须的动作整合起来,一键搞定。明白了这点,也就理解了这个模式。

posted @ 2007-09-18 15:48 离弦之ray的技术天空 阅读(216) | 评论 (0) | 编辑 收藏

仅列出标题
共11页: First 上一页 3 4 5 6 7 8 9 10 11 下一页