一、首先Java的基础、面向对象的基础和设计模式的基础知识是必不可少的。

关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的:factory模式(包括简单工厂和抽象工厂), Strategy模式,Template method模式。如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事。

我这里强烈建议的书可能让人有点意外,那就是Expert one on one J2EE design and development的第四章,这一章不仅仅是Spring初学者,而是任何搞Java开发的人必读的一章。经典!

二、接下可以看一些Spring的入门书籍

其实我自己没怎么看过这方面的书,我当时只看过Spring的reference,不过现在这方面的书好象多的是,而Spring reference看起来还是有些吃力的。JavaEye上很多人建议夏昕的Spring开发指南,据说入门很容易。另外的入门书应该是Spring live或Spring in action。我大概扫了一下,Spring live是一本只讲怎么做而不讲为什么的书,我不太喜欢(偶尔参考一下倒不错),不过有些人特别喜欢这样的书,看自己的个人爱好吧。

三、研究几个用Spring做的开源项目

理论还是要与实际结合,所以看完书后是要看实际的项目的。很多人喜欢appfuse,我觉得appfuse花的东西太多,真正实质性的内容又太少。我更 喜欢Spring自带的jpetstore,这是一个非常完整的例子,看完后Spring的基本用法应该都能掌握。

四、开始做实际的项目

在上述这些都完备以后,我觉得应该要去实际项目中锻炼了。当然并不是每人都有这样的机会的,这时只能自己做个玩具项目啦。项目的锻炼是非常关键的,其实每个人都清楚,我就不重复了。

五、继续深入学习

经过项目的锤炼,对Spring的用法和原理有了一定的了解的时候,才有可能真正掌握Spring的精髓。这时要读的书才是Rod Johnson的三本经典名著,分别是:

Expert one on one J2ee design and development

Expert one on one J2ee without EJB

Professional Java Development with SpringFramework

前两本书的经典程度我就不说了,只有读了它们,才能真正了解Spring的设计意图,掌握Spring的精髓。

第三本书是我强烈不建议初学者读的书。里面的东西深入而全,但是原理讲解得又不够深,很容易让初学者犯迷糊。但是却是Spring的高级用户必读的一本书(还有一本pro Spring据说也不错,不过我没读过)。我过几天会写一下这本书的书评。

当然这个阶段与第四阶段是交错的,边读书边做项目学到的东西才会更多的。

六、分析源代码,扩展Spring

有人认为没有必要分析Spring的源代码,因为这是很累人又不计好的事。但是要想成为Spring的高级用户,这是必经的阶段。在学习的过 程中,我们学到的不仅是Spring,更重要的是他的设计思想。不管怎样,看牛人的源代码是绝对有好处的。不过这是一个很累人的过程,要有思考准备哦

posted @ 2008-11-03 18:09 caihaibo 阅读(179) | 评论 (0)编辑 收藏
Cookie的目的就是为用户带来方便,为网站带来增值。虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁。Cookie永远不会以任何方 式执行,因此也不会带来病毒或攻击你的系统。另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个 Cookie的大小限制为4   KB,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段。
posted @ 2008-10-31 16:03 caihaibo 阅读(256) | 评论 (0)编辑 收藏

注:本文转载自 IBM developerworks,作者廖雪峰。版权归原作者所有。

JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。

尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋,无论是服务器端生成或处理 XML,还是客户端用 JavaScript 解析 XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web 应用来说,他们根本不需要复杂的 XML 来传输数据,XML 的扩展性很少具有优势,许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。

现在, JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么,同 XML 或 HTML 片段相比,JSON 提供了更好的简单性和灵活性。

和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。

String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为:

"abc"

除了字符 ""/ 和一些控制符("b"f"n"r"t)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构:

 图 1. String 的完整表示结构  
一个 Number 可以根据整型或浮点数表示如下:

 图 2. Number 的表示结构  
这与绝大多数编程语言的表示方法一致,例如:

12345(整数)
-3.9e10(浮点数)

Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,truefalse 和 null 都没有双引号,否则将被视为一个 String 。

JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:

["abc",12345,false,null]

Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表示。

例如,一个 Address 对象包含如下 Key-Value:

city:Beijing
street:Chaoyang Road
postcode:100025(整数)

用 JSON 表示如下:

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个 Person 对象包含 name 和 address 对象,可以表示如下:

{"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}

上面介绍了如何用 JSON 表示数据,接下来,我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端,以及客户端如何使用 JavaScript 处理 JSON 格式的数据。

我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户:

function handleJson() {
var j={"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
};
document.write(j.name);
document.write(j.address.city);
}

假定服务器返回的 JSON 数据是上文的:

{"name":"Michael","address":
{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}
}

只需将其赋值给一个 JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON()方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量:

new Ajax.Request("http://url", {
method: "get",
onSuccess: function(transport) {
var json = transport.responseText.evalJSON();
// TODO: document.write(json.xxx);
}
});

下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本。

将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 (") 而非 (') 表示字符串:

 static String string2Json(String s) {
StringBuilder sb = new StringBuilder(s.length()+20);
sb.append('""');
for (int i=0; i<s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '""':
sb.append("""""");
break;
case '""':
sb.append("""""");
break;
case '/':
sb.append("""/");
break;
case '"b':
sb.append("""b");
break;
case '"f':
sb.append("""f");
break;
case '"n':
sb.append("""n");
break;
case '"r':
sb.append("""r");
break;
case '"t':
sb.append("""t");
break;
default:
sb.append(c);
}
}
sb.append('""');
return sb.toString();
}

将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:

 static String number2Json(Number number) {
return number.toString();
}

Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示:

 static String boolean2Json(Boolean bool) {
return bool.toString();
}

要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:

 static String array2Json(Object[] array) {
if (array.length==0)
return "[]";
StringBuilder sb = new StringBuilder(array.length << 4);
sb.append('[');
for (Object o : array) {
sb.append(toJson(o));
sb.append(',');
}
// 将最后添加的 ',' 变为 ']':
sb.setCharAt(sb.length()-1, ']');
return sb.toString();
}

最后,我们需要将 Map<String, Object> 编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map<String, Object> 。该方法如下:

 static String map2Json(Map<String, Object> map) {
if (map.isEmpty())
return "{}";
StringBuilder sb = new StringBuilder(map.size() << 4);
sb.append('{');
Set<String> keys = map.keySet();
for (String key : keys) {
Object value = map.get(key);
sb.append('""');
sb.append(key);
sb.append('""');
sb.append(':');
sb.append(toJson(value));
sb.append(',');
}
// 将最后的 ',' 变为 '}':
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
}

为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object),能够将任意的 Java 对象编码为 JSON 格式:

 public static String toJson(Object o) {
if (o==null)
return "null";
if (o instanceof String)
return string2Json((String)o);
if (o instanceof Boolean)
return boolean2Json((Boolean)o);
if (o instanceof Number)
return number2Json((Number)o);
if (o instanceof Map)
return map2Json((Map<String, Object>)o);
if (o instanceof Object[])
return array2Json((Object[])o);
throw new RuntimeException("Unsupported type: " + o.getClass().getName());
}

我们并未对 Java 对象作严格的检查。不被支持的对象(例如 List)将直接抛出 RuntimeException 。此外,为了保证输出的 JSON 是有效的,Map<String, Object> 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的 Map,就可以检测到 StackOverflowException

 @Test(expected=StackOverflowError.class)
public void testRecurrsiveMap2Json() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", map);
JsonUtil.map2Json(map);
}

好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象,因此,递归引用的可能性很小。

最后,通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:

 response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(JsonUtil.toJson(obj));

注:本文转载自 IBM developerworks,作者廖雪峰。版权归原作者所有。

JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理。

尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋,无论是服务器端生成或处理 XML,还是客户端用 JavaScript 解析 XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web 应用来说,他们根本不需要复杂的 XML 来传输数据,XML 的扩展性很少具有优势,许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。

现在, JSON 为 Web 应用开发者提供了另一种数据交换格式。让我们来看看 JSON 到底是什么,同 XML 或 HTML 片段相比,JSON 提供了更好的简单性和灵活性。

和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象。

String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为:

"abc"

除了字符 ""/ 和一些控制符("b"f"n"r"t)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构:

 图 1. String 的完整表示结构  
一个 Number 可以根据整型或浮点数表示如下:

 图 2. Number 的表示结构  
这与绝大多数编程语言的表示方法一致,例如:

12345(整数) -3.9e10(浮点数)

Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,truefalse 和 null 都没有双引号,否则将被视为一个 String 。

JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null:

["abc",12345,false,null]

Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map<String, Object>,而不是 Java 的 Class 。注意 Key 只能用 String 表示。

例如,一个 Address 对象包含如下 Key-Value:

city:Beijing street:Chaoyang Road postcode:100025(整数)

用 JSON 表示如下:

{"city":"Beijing","street":" Chaoyang Road ","postcode":100025}

其中 Value 也可以是另一个 Object 或者数组,因此,复杂的 Object 可以嵌套表示,例如,一个 Person 对象包含 name 和 address 对象,可以表示如下:

{"name":"Michael","address": {"city":"Beijing","street":" Chaoyang Road ","postcode":100025} }

上面介绍了如何用 JSON 表示数据,接下来,我们还要解决如何在服务器端生成 JSON 格式的数据以便发送到客户端,以及客户端如何使用 JavaScript 处理 JSON 格式的数据。

我们先讨论如何在 Web 页面中用 JavaScript 处理 JSON 数据。我们通过一个简单的 JavaScript 方法就能看到客户端如何将 JSON 数据表示给用户:

function handleJson() { var j={"name":"Michael","address": {"city":"Beijing","street":" Chaoyang Road ","postcode":100025} }; document.write(j.name); document.write(j.address.city); }

假定服务器返回的 JSON 数据是上文的:

{"name":"Michael","address": {"city":"Beijing","street":" Chaoyang Road ","postcode":100025} }

只需将其赋值给一个 JavaScript 变量,就可以立刻使用该变量并更新页面中的信息了,相比 XML 需要从 DOM 中读取各种节点而言,JSON 的使用非常容易。我们需要做的仅仅是发送一个 Ajax 请求,然后将服务器返回的 JSON 数据赋值给一个变量即可。有许多 Ajax 框架早已包含了处理 JSON 数据的能力,例如 Prototype(一个流行的 JavaScript 库:http://prototypejs.org)提供了 evalJSON()方法,能直接将服务器返回的 JSON 文本变成一个 JavaScript 变量:

new Ajax.Request("http://url", { method: "get", onSuccess: function(transport) { var json = transport.responseText.evalJSON(); // TODO: document.write(json.xxx); } });

下面我们讨论如何在服务器端输出 JSON 格式的数据。以 Java 为例,我们将演示将一个 Java 对象编码为 JSON 格式的文本。

将 String 对象编码为 JSON 格式时,只需处理好特殊字符即可。另外,必须用 (") 而非 (') 表示字符串:

static String string2Json(String s) { StringBuilder sb = new StringBuilder(s.length()+20); sb.append('""'); for (int i=0; i<s.length(); i++) { char c = s.charAt(i); switch (c) { case '""': sb.append(""""""); break; case '""': sb.append(""""""); break; case '/': sb.append("""/"); break; case '"b': sb.append("""b"); break; case '"f': sb.append("""f"); break; case '"n': sb.append("""n"); break; case '"r': sb.append("""r"); break; case '"t': sb.append("""t"); break; default: sb.append(c); } } sb.append('""'); return sb.toString(); }

将 Number 表示为 JSON 就容易得多,利用 Java 的多态,我们可以处理 Integer,Long,Float 等多种 Number 格式:

static String number2Json(Number number) { return number.toString(); }

Boolean 类型也可以直接通过 toString() 方法得到 JSON 的表示:

static String boolean2Json(Boolean bool) { return bool.toString(); }

要将数组编码为 JSON 格式,可以通过循环将每一个元素编码出来:

static String array2Json(Object[] array) { if (array.length==0) return "[]"; StringBuilder sb = new StringBuilder(array.length << 4); sb.append('['); for (Object o : array) { sb.append(toJson(o)); sb.append(','); } // 将最后添加的 ',' 变为 ']': sb.setCharAt(sb.length()-1, ']'); return sb.toString(); }

最后,我们需要将 Map<String, Object> 编码为 JSON 格式,因为 JavaScript 的 Object 实际上对应的是 Java 的 Map<String, Object> 。该方法如下:

static String map2Json(Map<String, Object> map) { if (map.isEmpty()) return "{}"; StringBuilder sb = new StringBuilder(map.size() << 4); sb.append('{'); Set<String> keys = map.keySet(); for (String key : keys) { Object value = map.get(key); sb.append('""'); sb.append(key); sb.append('""'); sb.append(':'); sb.append(toJson(value)); sb.append(','); } // 将最后的 ',' 变为 '}': sb.setCharAt(sb.length()-1, '}'); return sb.toString(); }

为了统一处理任意的 Java 对象,我们编写一个入口方法 toJson(Object),能够将任意的 Java 对象编码为 JSON 格式:

public static String toJson(Object o) { if (o==null) return "null"; if (o instanceof String) return string2Json((String)o); if (o instanceof Boolean) return boolean2Json((Boolean)o); if (o instanceof Number) return number2Json((Number)o); if (o instanceof Map) return map2Json((Map<String, Object>)o); if (o instanceof Object[]) return array2Json((Object[])o); throw new RuntimeException("Unsupported type: " + o.getClass().getName()); }

我们并未对 Java 对象作严格的检查。不被支持的对象(例如 List)将直接抛出 RuntimeException 。此外,为了保证输出的 JSON 是有效的,Map<String, Object> 对象的 Key 也不能包含特殊字符。细心的读者可能还会发现循环引用的对象会引发无限递归,例如,精心构造一个循环引用的 Map,就可以检测到 StackOverflowException

@Test(expected=StackOverflowError.class) public void testRecurrsiveMap2Json() { Map<String, Object> map = new HashMap<String, Object>(); map.put("key", map); JsonUtil.map2Json(map); }

好在服务器处理的 JSON 数据最终都应该转化为简单的 JavaScript 对象,因此,递归引用的可能性很小。

最后,通过 Servlet 或 MVC 框架输出 JSON 时,需要设置正确的 MIME 类型(application/json)和字符编码。假定服务器使用 UTF-8 编码,则可以使用以下代码输出编码后的 JSON 文本:

response.setContentType("application/json;charset=UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter pw = response.getWriter(); pw.write(JsonUtil.toJson(obj)); pw.flush();

JSON 已经是 JavaScript 标准的一部分。目前,主流的浏览器对 JSON 支持都非常完善。应用 JSON,我们可以从 XML 的解析中摆脱出来,对那些应用 Ajax 的 Web 2.0 网站来说,JSON 确实是目前最灵活的轻量级方案。

 pw.flush();

JSON 已经是 JavaScript 标准的一部分。目前,主流的浏览器对 JSON 支持都非常完善。应用 JSON,我们可以从 XML 的解析中摆脱出来,对那些应用 Ajax 的 Web 2.0 网站来说,JSON 确实是目前最灵活的轻量级方案。

posted @ 2008-10-31 12:10 caihaibo 阅读(202) | 评论 (0)编辑 收藏
相关的bean如下
TVO.java代码如下
Java代码 复制代码
  1. package demo;  
  2.   
  3. import java.util.*;  
  4.   
  5. import com.easylotto.lottobar.bean.BaseEntity;  
  6. import com.easylotto.lottobar.bean.ReqCommandVO;  
  7.   
  8. public class TVO extends BaseEntity{  
  9.     private String tname;  
  10.     private List<Person> rcvoList;  
  11.     private Map map;  
  12.       
  13.     public List<Person> getRcvoList() {  
  14.         return rcvoList;  
  15.     }  
  16.   
  17.     public void setRcvoList(List<Person> rcvoList) {  
  18.         this.rcvoList = rcvoList;  
  19.     }  
  20.   
  21.     public String getTname() {  
  22.         return tname;  
  23.     }  
  24.   
  25.     public void setTname(String tname) {  
  26.         this.tname = tname;  
  27.     }  
  28.       
  29.   
  30.     public Map getMap() {  
  31.         return map;  
  32.     }  
  33.   
  34.     public void setMap(Map map) {  
  35.         this.map = map;  
  36.     }  
  37.   
  38.     /** 
  39.      * @param args 
  40.      */  
  41.     public static void main(String[] args) {  
  42.         // TODO Auto-generated method stub  
  43.   
  44.     }  
  45.   
  46. }  

Person.java如下
Java代码 复制代码
  1. package demo;  
  2.   
  3. public class Person {  
  4.     private String name;  
  5.     private String age;  
  6.       
  7.     public Person(String name,String age){  
  8.         this.name=name;  
  9.         this.age=age;  
  10.     }  
  11.     public String getAge() {  
  12.         return age;  
  13.     }  
  14.     public void setAge(String age) {  
  15.         this.age = age;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setName(String name) {  
  21.         this.name = name;  
  22.     }  
  23.       
  24. }  


测试类如下:
Java代码 复制代码
  1. package demo;  
  2.   
  3. import net.sf.json.*;  
  4. import java.util.*;  
  5.   
  6. import com.easylotto.lottobar.bean.ReqCommandVO;  
  7. import com.easylotto.lottobar.bean.SocketCommandEntity;  
  8.   
  9. /** 
  10.  * Json使用测试类 
  11.  * @author peidw  
  12.  * 
  13.  */  
  14. public class JsonDemo {  
  15.       
  16.     public String JsonStr2Object(){  
  17.         String str="{'map':{'a2':'A2','a1':'A1'},'rcvoList':[{'age':'20','name':'小裴'},{'age':'58','name':'小庞'}],'tname':'xxname'}";  
  18.         JSONObject jo=JSONObject.fromObject(str);  
  19.         TVO sce=null;  
  20.         if(jo!=null){  
  21.             sce=(TVO)jo.toBean(jo, TVO.class);  
  22.             List alist=sce.getRcvoList();  
  23.             System.out.println(alist.size());  
  24.             Person rcvo=null;  
  25.             for(int i=0;i<alist.size();i++){  
  26.                 rcvo=(Person)alist.get(i);  
  27.                 System.out.print(rcvo.getName()+"-"+rcvo.getAge());  
  28.             }  
  29.         }  
  30.   
  31.   
  32.         return "测试";  
  33.     }  
  34.       
  35.     public void Object2JsonStr(){  
  36.   
  37.         TVO tvo=new TVO();  
  38.         tvo.setTname("xxname");  
  39.         List <Person>a=new ArrayList();  
  40.         a.add(new Person("小裴","20"));  
  41.         a.add(new Person("小庞","58"));  
  42.         tvo.setRcvoList(a);  
  43.         Map map=new HashMap();  
  44.         map.put("a1", "A1");  
  45.         map.put("a2", "A2");  
  46.         tvo.setMap(map);  
  47.         JSONObject jo=JSONObject.fromObject(tvo);  
  48.         System.out.println(jo);  
  49.     }  
  50.       
  51.     public static void main(String[] args){  
  52.         JsonDemo jd=new JsonDemo();  
  53.         jd.JsonStr2Object();  
  54.         //jd.Object2JsonStr();  
  55.     }  
  56. }  


出现的异常如下
2
Exception in thread "main" java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean
at demo.JsonDemo.JsonStr2Object(JsonDemo.java:26)
at demo.JsonDemo.main(JsonDemo.java:53)
使用的是json-lib-2.2.1-jdk15.jar包,请问这是怎么回事,怎么解决?


这个问题有两个地方值得考虑:
1、一个就是json-lib好像是使用反射实现的,那你的Person类如果没有无参数的构造方法的话,很危险;
2、在你的转化的代码上并没有告诉程序把rcvoList里的数据为何种类型

为此正确的做法是,为Person添加无参数的构造方法,同时修改代码为:

if(jo!=null){ 
             Map<String, Class> m = new HashMap<String, Class>();
             m.put("rcvoList", Person.class);
             sce=(TVO)JSONObject.toBean(jo, TVO.class, m);

这样应该就OK了…………
posted @ 2008-10-31 11:36 caihaibo 阅读(1629) | 评论 (2)编辑 收藏

有人说,创业是孤独的,是寂寞的,你只能独自前行;而我说:朋友,一切都不象你说的那样!有许多与你同路的朋友,何不一起搭个手,做个伴.让我们一起分享创业路上的喜悦和艰难!

    这是我的创业失败总结,我想告戒自己,同时也告诉世人:做多错多,成功只是你看得见的那冰山一角。多少亿万富翁的过去都成为了传奇,我却想留给人们他真实的一面,失败的一面。如果有后来人创业,我有些经验可以共享:

    1、以你现有的经验、能力、资源、资金等,考虑你是要做名商人还是法人,小商人只须自己有能力,法人则要依靠运营系统。如有可能,最好做到在外是商人,在内是法人。

    2、无论你是做商人还是法人,首先要进入相对朝阳的产业。须记住:90%的企业死在了行业选择的决策性失误里,剩余90%的企业,则死在了她一直建不起来的企业系统里。

    3、应考虑你所长,进入你熟悉的领域,不要全力投入你不熟悉的领域。如果实在要做,应做好充足的资金准备,充分的勤奋准备,以及相应的得力人手。否则,及早退出。

    4、进入一个市场,最重要的是要考虑你想解决什么问题,有多大空间,对手怎样,你应在何时用何种方式来解决;如果资金不多,赶紧找盈利的现金点和小模式,不可恋战。

    5、用较长的时间来寻找适合的股东,不可侥幸;所谓成也萧何败也萧何,一个人做的风险远小于与不适合的股东合伙;且做为创业的掌盘者,应宽容、积极、善待你的股东。

    6、公司开始运营,你当身先士卒;有20人时,根据2/8定律,应有4名骨干,你居中协调;有10来名骨干时,帅、将、兵应培养上,同时你自己退后,继续扶持、严管。

    7、管理就是奖和惩,再加企业文化的润滑。管理没有捷径,你投入得越多,你的根基就越深,同时系统枝繁叶茂。领导者要建机制,管理者则首要的是管目标,其次是管人。

    8、领导者是开局者,管理者是服从者。领导者要能听懂人言,善于纳谏,但要一个人拿主意,因为风险都是你的。决策既定,则要说服沟通后贯彻执行,不可朝令夕止。

    9、领导者最重要的四个素质——洞察力:否则难以判断对人和事;全局能力:否则难以平衡人和事;用人能力:否则你累死也做不完;影响力:经常被别人影响就不是领导。

    10、企业家的四要素——梦想:有梦想才有方向和目标;激情——激情是行动力是影响力;冒险——凡事走在前,成功概率越大竞争越激烈;责任——责任使你自律和坚韧。

    11、对于小企业融资,压上游和下游资金是上上策;降价成交、用预期换现、出租房屋是上策;找银行和机构贷款是中策;私人借款、内部集资是下策;信用卡透支、典当是下下策。

posted @ 2008-10-30 17:19 caihaibo| 编辑 收藏

/*
 * 写cookie
*/
Cookie namecookie = new Cookie("name",name);
Cookie passwordcookie = new Cookie("password",password);
Cookie optioncookie = new Cookie("option","1");

//生命周期    
namecookie.setMaxAge(60*60*24*365);
passwordcookie.setMaxAge(60*60*24*365);
optioncookie.setMaxAge(60*60*24*365);
    
response.addCookie(namecookie);
response.addCookie(passwordcookie); 
response.addCookie(optioncookie); 

/*
 * 读cookie
*/
Cookie[] cookies = request.getCookies();
if(cookies!=null)
{
    String name = "";
    String password = "";
    String option = "";
    for (int i = 0; i < cookies.length; i++)
    {
       Cookie c = cookies[i];     
       if(c.getName().equalsIgnoreCase("name"))
       {
          name = c.getValue();
        }
        else if(c.getName().equalsIgnoreCase("password"))
        {
           password = c.getValue();
        }
        else if(c.getName().equalsIgnoreCase("option"))
        {
           option = c.getValue();
        }     
    } 
  }

posted @ 2008-10-30 14:13 caihaibo 阅读(263) | 评论 (0)编辑 收藏
Firefox 中文浏览字体设置(附图)
上传时间:2007-9-21 10:15
相信此问题有不少 FF 中国用户会遇到,包括“软件界面”及“浏览页面”的字体。许多中国网民不接受 FF,和这一因素有莫大关系。很多时候,并非软件的问题,而是使用者自身的操作问题。微软操作系统集成了 IE,在这种情况下,FF 如果没有强大的优势,不可能在短短数年内与 IE 势均力敌,不可能成就目前的佳绩。Netscape 就是最好的反面说明。

以下是我作的字体设置附图。

posted @ 2008-10-29 16:12 caihaibo 阅读(454) | 评论 (0)编辑 收藏

Tutorial:Playing With Ext The Easy Way (玩EXT简单方法)--firebug下调试ext

周五, 12/21/2007 - 02:45 — ppkosd
67
vote

蹒跚学步

第一步 - 入门

想必您已经听说过 Ext、浏览了在线演示,并且尝试阅读API文档。不过,面对复杂的API文档,您却不如何下手?!

第二步 - 起步

通览过API文档,并且找到了所要立刻尝试的功能,面对混杂的网页源代码,如何开始一个简单的测试页面?那么……

不论您的目标是什么,您都可以依照本文快速的开始使用Ext。不,不用搭建服务器,您所需要的仅仅是Firefox浏览器和Firebug调试插件。如果还没有安装,那么现在就是一个好机会。

firebug使用教程

牛刀小试

  • 打开Ext API文档,您已经上路!
  • 单击 F12 打开 Firebug 控制台。
  • 如果您的 firebug 控制台处于单行模式(以 '>>>' 开头),那么请单击右下角的红色上箭头以开启多行编辑模式。
  • 输入以下代码,并敲击 Ctrl-Enter 来运行:
Ext.get(document.body).update('<div id="test"></div>');

上边这行代码的作用是将当前DOM body元素用一个ID为test的div元素替换。刚才那些API文档已经被删除,但 Ext 代码依旧生效,并且随时为您效劳。

现在,我们假设您希望简单的添加一个面板元素(Panel),但对Ext.Panel的API冗繁的说明无能为力。那么试着将这些代码添加到 firebug 的控制台中:

Ext.get(document.body).update('<div id="test"></div>');
new Ext.Panel({ renderTo: 'test',
width: '200px',
title: 'My Title',
html: 'My HTML content' });

再次敲击 Ctrl-Enter 。嗨!您的面板元素已经诞生。

很好,不过如果修改一些选项呢?用下边的代码替换刚才的那些代码:

Ext.get(document.body).update('<div id="test"></div>');
new Ext.Panel({ renderTo: 'test',
width: '200px',
title: 'My Title',
html: 'My HTML content',
collapsible: true });

敲击 Ctrl-Enter 。怎么样,一个可以伸缩的面板就配置好了。(注意面板右上角的小图标)

每次敲击 Ctrl-Enter ,第一行代码都会移除现有的内容,这样您就可以有一个干净的调试环境。这是一个简单的小技巧,十分方便您尝试各种配置选项。

您可以为update()函数添加所需要的 HTML 代码,无论多少。然后编写或多或少的 Javascript 来探索 Ext API。

还等什么?现在就去亲自实践 Ext Api 吧。

posted @ 2008-07-17 15:18 caihaibo 阅读(101) | 评论 (0)编辑 收藏
要使用Oracle还需要做一些前期工作.

使用Oracle用户
# su - oracle

创建表空间 -> 创建新用户 -> 用户授权

一 创建表空间
SQL> CREATE TABLESPACE test01
DATAFILE '/data/oracle/oradata/db/test01.dbf' SIZE 1024M UNIFORM SIZE 128k;

1) DATAFILE: 表空间数据文件存放路径
2) SIZE: 起初设置为1G就可以
3) UNIFORM: 指定区尺寸为128k,如不指定,区尺寸默认为64k
4) 空间名称 test01 与 数据文件名称 test01.dbf 不要求相同,可随意命名.

二 创建新用户
SQL> CREATE USER test IDENTIFIED BY 123456 DEFAULT TABLESPACE test01;

1) 创建用户同时分配表空间

三 用户授权
1)用户角色授权
SQL> CRANT DBA TO test;

a) 我这里将DBA角色赋给新用户test,test将拥有DBA的所有操作权限.

2)直接授权
多用户
SQL> CRANT SELECT,INSERT,UPDATE,DELETE,ON USERS TO test,test1;

下面我们可以使用两种方式登录Oracle db
一 SQLPLUS
1)本地登录
SQL> sqlplus test/123456

2)远程登录
假设db在另一台服务器
SQL> sqlplus test/123456@db

二 PLSQL Developer
上篇中也有讲述,输入账号口令就可以了.


下面说些和上面相关,且工作中会需要用到的.
一 删除用户
SQL> DROP USER test CASCADE;

二 删除表空间
SQL> DROP TABLESPACE test01 INCLUDING CONTENTS AND DATAFILES;

1) 删除表空间内容和数据文件.
2) 一般无效表空间占用磁盘空间,所以这个应该很常用.
posted @ 2008-06-14 15:49 caihaibo 阅读(170) | 评论 (0)编辑 收藏

一、单节点元素操作

  对节点元素的操作是ExtJS的核心内容,大部分的Java操作都需要获取页面上某个节点元素,传统的Java方法,是通过ID来获得DOM节点的,例如我们的页面上有一个id值为content的DIV节点,我们想获得这个节点元素,用以下代码来获得:

var content = getElementById('content');

  而在ExtJS中,类似prototype中的$()方法,ExtJS拥有Ext.get()方法,可以使用

var content = Ext.get('content')

  看起来这并没有太大的优势,但是通过Ext.get返回的节点元素,将自动拥有快捷的、统一的、跨浏览器的接口,直接支持Cache,使多次访问同一节点元素的时候更加高效,并且直接使元素支持一些常用特效,例如:高亮,拖拽等。

  例如以下的HTML代码与js代码:

<body id="content">
hi
</body>
Ext.onReady(() {
Ext.get('content').highlight();
});

  当页面加载完毕之后,他将使整个页面刷下变黄,然后又褪掉了。

二、多节点元素操作

  ExtJS还支持一种使用Ext.select方法的多节点元素的操作,他将返回多个节点元素,与Ext.get方法一样,Ext.select方法返回的节点元素同样拥有那些Ext.get返回的节点元素所拥有的那些特性。

  例如这样的HTML与js代码:

<body id="content">
<p>
段落1
</p>
<div>
字符2
</div>
<p>
段落3
</p>
</body>
Ext.onReady(() {
Ext.select('p').highlight();
});

  当页面加载完毕之后,只有段落1和段落3变黄,然后又褪掉了。

posted @ 2008-06-12 17:55 caihaibo 阅读(709) | 评论 (0)编辑 收藏
仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8 下一页