Servlet学习总结_warren_新浪博客

Posted on

Servlet学习总结warren新浪博客

新浪博客

发博文

博文

warren的技术博客

http://blog.sina.com.cn/warren0915 [订阅][手机订阅]

首页 博文目录 图片 关于我

个人资料

warren

warren

Qing 微博 加好友 发纸条

写留言 加关注

  • 博客等级:
  • 博客积分:95

  • 博客访问:1,896

  • 关注人气:1

相关博文

lvywayp迁

壹间studio

徐小明

封起De日子

思考者

雨中竹

健康达人

养生堂

黎文东

情感威客

  • [《一路向西》远超《肉蒲团》

张学伟 更多>> 精彩图文

公告:新版博客新功能介绍

  • 公告:新版博客新功能介绍
  • 林宜萱:“想脱正是时候”
  • 电击蓝斑核如何复活外星人

查看更多>>

推荐博文

方刚

乔良

方舟子

躲猫猫调查团边民

闾丘露薇

许戈辉

石述思

单士兵

熊丙奇

杨恒均 查看更多>> 谁看过这篇博文

加载中…

正文 字体大小:

Servlet学习总结

(2010-08-31 01:45:58)

转载

标签:

杂谈

一.Servlet简介

1,Serlet是在服务器端运行的小应用程序,用来完成B/S架构下客户端的请求的响应处理。

2,Servlet API为Servlet提供统一的编程接口。

3,Servlet一般在容器如tomcat,jetty等容器中运行。

4,同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

二.Servlet的执行过程

1,Tomcat启动时,首先读取web.xml中的配置信息,如果配置信息中有设置属性,实例化一份Servlet.如果没配置

,Tomcat将会在第一个用户的第一次请求时实例化一个Servlet.

2、在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建

它,然后根据客户的请求创建HttpRequest,HttpResponse对象,从而调用Servlet对象的service方法。

三.具体执行过程如图

Servlet学习总结

1,Web Client 向Servlet容器(Tomcat)发出Http请求

2,Servlet容器接收Web Client的请求

3,Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4,Servlet容器创建一个HttpResponse对象

5,Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数

 传给 HttpServlet对象

6,HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7,HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8,Servlet容器把HttpServlet的响应结果传给Web Client

分享: 分享到新浪Qing

喜欢 阅读 评论 收藏 转载 喜欢 打印举报

已投稿到: 排行榜 圈子

加载中,请稍候...... 前一篇:2010年08月14日(我的第一个项目)

后一篇:子查询转换为连接查询

评论 重要提示:警惕虚假中奖信息 ♥ 2011吃货们的幸福生活 关注每日最热门博客

[发评论]

  • 评论加载中,请稍候...

发评论 Qing带来全新读图时代 关注每日最热门博客

登录名: 密码: 找回密码 注册 记住登录状态

昵 称:

分享到微博 评论并转载此博文

验证码: 请点击后输入验证码 收听验证码

匿名评论 发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 < 前一篇2010年08月14日(我的第一个项目)

后一篇 >子查询转换为连接查询

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2012 SINA Corporation, All Rights Reserved

新浪公司 版权所有

Java调用windows下某些程序

Posted on

Java调用windows下某些程序

首页 新闻 论坛 问答 博客 招聘 更多 ▼

专栏 文摘 圈子 搜索

您还未登录 ! 我的应用 登录 注册

Lyon & Carol

永久域名 http://nee.javaeye.com/

JavaScript FSO属性大全 | 在Eclipse状态栏上增加JVM内存用量指示器

2007-12-05

Java调用windows下某些程序

Java是种跨平台的语言,我们经常碰到需要通过Java调用windows下某些程序。有些第三方厂商如(ANT),也提供了调用windows下可执行程序的方法,但我们往往需要调用一些批处理命令。而Java却不提供。这里,我采用一种变相的调用方法,使得Java能调用批处理命令。 前期准备 Quick Batch File (De)Compiler 将任何BAT、CMD批处理脚本编译为EXE文件。 1、运行exe 文件 Java JDK里已经提供了调用的方法,不在累赘,代码如下。 try {   String command = "notepad";   Process child =   Runtime.getRuntime().exec(command);   } catch (IOException e)   {   } 2、运行 bat(批处理) 文件 Java对批处理文件还不支持。刚开始一直在研究Java如何调用批处理文件,始终找不到解决方法。后来只好绕过批处理,考虑如何将批处理转换为exe可执行文件。然后再通过Java调用可执行文件。 在Google上搜索一下,找到Quick Batch File (De)Compiler,可以将任何BAT、CMD批处理脚本编译为EXE文件。使用了一下,果然可以。 Quick Batch File (De)Compiler使用非常简单: Quickbfc 文件名.bat 文件名.exe(将批处理命令编译为可执行文件) quickbfd 文件名.exe 文件名.bat(将可执行文件反编译为批处理命令) 然后,我们再按第一种方法通过Java 调用,即可。 本文来自:http://www.linuxpk.com/46886.html

JavaScript FSO属性大全 | 在Eclipse状态栏上增加JVM内存用量指示器

评论

发表评论

您还没有登录,请登录后发表评论(快捷键 Alt+S / Ctrl+Enter)

kyonee的博客

kyonee

搜索本博客

最近访客 >>更多访客

txws.zx的博客

txws.zx

a3x60的博客

a3x60 zhang_yingjie的博客

zhang_yingjie

shgavin的博客

shgavin

博客分类

1 共 5 张

其他分类

存档

评论排行榜

  • Rss
  • Rss_google
  • Rss_xianguo
  • [什么是RSS?] 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。 © 2003-2010 JavaEye.com. All rights reserved. 上海炯耐计算机软件有限公司 [ 沪ICP备05023328号 ]

Java知识点总结1

Posted on

Java知识点总结1

Java**知识点总结**1

前言:现就java学习中的部分知识点做一下总结,以供同学们参考 1 String,StringBuffer和StringBuilder的用法 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); 我们会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + “ simple” + “test”; 其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如: String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4; 这时候 JVM 会规规矩矩的按照原来的方式去做

在大部分情况下 StringBuffer > String StringBuffer Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。 StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append(le) 会使字符串缓冲区包含“startle”,而 z.insert(4, le) 将更改字符串缓冲区,使之包含“starlet”。 在大部分情况下 StringBuilder > StringBuffer java.lang.StringBuilde java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。 2 Vector 还是ArrayList――哪一个更好,为什么? 要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑的因素: l API l 同步处理 l 数据增长性 l 使用模式 下面针对这4个方面进行一一探讨 API 在由Ken&nbspArnold等编著的《Java&nbspProgramming&nbspLanguage》 (Addison-Wesley,&nbspJune&nbsp2000)一书中有这样的描述,Vector类似于 ArrayList.。所有从API的角度来看这两个类非常相[b]似。但他们之间也还是有一些主要的区别的。

同步性 Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。 数据增长 从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 使用模式 在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用 O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢? 这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O (i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。 最后,在《Practical&nbspJava》一书中Peter&nbspHaggar建议使用一个简单的数组(Array)来代替 Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。

3 throw 和throws的区别 这两者虽然看起来只有一个s的区别,但是作用完全不一样 /////java处理异常方式/////////////////////////////// 在java代码中如果发生异常的话,jvm会抛出异常对象,导致程序代码中断,这个时候jvm在做的操作就是:创建异常对象,然后抛出,比如:

int i= 1; int j = 0; int res = 0; res = i/j;//除0错误 System.out.println(res);

这5句代码运行到第四句会中断,因为jvm抛出了异常

////throw的作用///////////////////////////////////////// 手动抛出异常

但是有时候有些错误在jvm看来不是错误,比如说 int age = 0; age = -100; System.out.println(age); 很正常的整形变量赋值,但是在我们眼中看来就不正常,谁的年龄会是负的呢。 所以我们需要自己手动引发异常,这就是throw的作用 int age = 0; age = -100; if(age<0) { Exception e = new Exception();//创建异常对象 throw e;//抛出异常 } System.out.println(age);

////throws的作用/////////////////////////////////// 声明方法可能回避的异常

有异常被抛出了,就要做处理,所以java中有try-catch 可是有时候一个方法中产生了异常,但是不知道该怎么处理它,那么就放着不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样,这种情况称为回避异常 但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常 void fun()throws IOException,SQLException { ... } 这表示 fun方法可能会丢两个异常出来,那么在调用fun的时候就会做好准备,比如可以这样 try { fun(); }catch(IOException e) { }catch(SQLException e) { } ////////完毕////////////////////

Java**知识点总结**2

前言:现就java学习中的部分知识点做一下总结,以供同学们参考 1 Java中Class类工作原理详解

Class对象 Class对象包含了与类相关的信息。事实上,Class对象就是用来创建类的所有的“普通”对象的。 类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的 Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。 一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。看下面示例。

SweetShop.java package com.zj.sample; class Candy { static { System.out.println(Loading Candy); } } class Gum { static { System.out.println(Loading Gum); } } class Cookie { static { System.out.println(Loading Cookie); } } public class SweetShop { public static void main(String[] args) { System.out.println(inside main); new Candy(); System.out.println(After creating Candy); try { Class.forName(com.zj.sample.Gum); } catch (ClassNotFoundException e) { System.out.println(Couldn't find Gum); } System.out.println(After Class.forName(Gum)); new Cookie(); System.out.println(After creating Cookie); } } 结果: inside main Loading Candy After creating Candy Loading Gum After Class.forName(Gum) Loading Cookie After creating Cookie 2.获取Class实例的三种方式 1)利用对象调用getClass()方法获取该对象的Class实例。 2)使用Class类的静态方法forName(),用类的名字获取一个Class实例。 3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。 3.Class.forName 上面的示例中: Class.forName(com.zj.sample.Gum); 这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象就和其它对象一样,我们可以获取并操作它的引用。forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用。 4.类字面常量 Java还提供了另一种方法来生成对Class对象的引用,即使用“类字面常量”。对上述程序来说,可以是: com.zj.sample.Gum.class; 5.关键字instanceof 关键字instanceof返回一个布尔值,判断是不是某个特定类型的实例。 if(x instanceof Dog) ((Dog)x).bark(); 6.获取Class实例 package com.zj.sample; class Point { int x, y; } class ClassTest { public static void main(String[] args) { Point pt = new Point(); Class c1 = pt.getClass(); System.out.println(c1.getName()); try { Class c2 = Class.forName(com.zj.sample.Point); System.out.println(c2.getName()); } catch (Exception e) { e.printStackTrace(); } Class c3 = Point.class; System.out.println(c3.getName()); Class c4 = int.class; System.out.println(c4.getName());

     Class c5 = Integer.TYPE;
     System.out.println(c5.getName());
     Class c6 = Integer.class;
     System.out.println(c6.getName());
  }

} 结果: com.zj.sample.Point com.zj.sample.Point com.zj.sample.Point int int java.lang.Integer

7.Class的其他方法 1)Class.newInstance()使用所选的Class对象生成该类的新实例。它调用了缺省(无参数)的类构造器生成新的对象。所以使用newInstance()创建的类必须有一个缺省构造器。对于newInstance ()来说,可以在原先没有任何对象存在的情况下,使用它创建一个新的对象。 利用newInstance()实例化一个对象: package com.zj.sample; class Point { static { System.out.println(Loading Point); }

  int x, y;

} class ClassTest { public static void main(String[] args) { try { Class c = Class.forName(com.zj.sample.Point); Point pt = (Point) c.newInstance(); } catch (Exception e) { e.printStackTrace(); } } } 结果: Loading Point 2)Class.isInstance()方法提供了一种动态地调用instanceof运算符的途径。 3)Class.getInterfaces()方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。 4)如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。 5)Class类支持反射的概念,Java附带的库 java.lang.reflect包含了Field、Method以及Constructor类(每个类都实现了Member接口)。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。这样可以使用Constructor创建新的对象,用get()和set()方法读取和修改与 Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调用getFields()、getMethods、 getConstrucotrs()方法,返回表示字段、方法以及构造器的对象的数组。 8.利用反射API察看未知类的构造方法与方法 package com.zj.sample; import java.lang.reflect.Constructor; import java.lang.reflect.Method; class Point { static { System.out.println(Loading Point); } int x, y; void output() { System.out.println(x= + x + , + y= + y); } Point(int x, int y) { this.x = x; this.y = y; } } class ClassTest { public static void main(String[] args) {
try { Class c = Class.forName(com.zj.sample.Point); Constructor[] cons = c.getDeclaredConstructors(); for (int i = 0; i < cons.length; i++)// 返回所有声明的构造方法 { System.out.println(cons[i]); } Method[] ms = c.getDeclaredMethods(); for (int i = 0; i < ms.length; i++)// 返回所有声明的方法 { System.out.println(ms[i]); } } catch (Exception e) { e.printStackTrace(); } } }

结果: Loading Point com.zj.sample.Point(int,int) void com.zj.sample.Point.output() 9.动态调用一个类的实例(完全没有出现point这个名字) package com.zj.sample; import java.lang.reflect.Constructor; import java.lang.reflect.Method; class Point { static { System.out.println(Loading Point); } int x, y; void output() { System.out.println(x= + x + , + y= + y); } Point(int x, int y) { this.x = x; this.y = y; } } class ClassTest { public static void main(String[] args) {

     try {
         Class c = Class.forName(com.zj.sample.Point);
         Constructor[] cons = c.getDeclaredConstructors();
         Class[] params = cons[0].getParameterTypes();// 察看构造器的参数信息
         Object[] paramValues = new Object[params.length];// 构建数组传递参数
         for (int i = 0; i < params.length; i++) {
            if (params[i].isPrimitive())// 判断class对象表示是否是基本数据类型
            {
                paramValues[i] = new Integer(i);
            }
         }
         Object o = cons[0].newInstance(paramValues);// 创建一个对象的实例
         Method[] ms = c.getDeclaredMethods();// 调用方法
         ms[0].invoke(o, null);// 用指定的参数调用(output方法没有参数,null)
     } catch (Exception e) {
         e.printStackTrace();
     }
}

} 结果: Loading Point x=0,y=1

Java生成UUID通用唯一识别码

Posted on

Java生成UUID通用唯一识别码 - Programming on the fly - BlogJava

Programming on the fly Live as if you were to die tomorrow. Learn as if you were to live forever.

BlogJava 首页 新随笔 联系 聚合 管理

随笔-170 评论-150 文章-11 trackbacks-0 Java生成UUID通用唯一识别码UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

以下是具体生成UUID的例子:

view plaincopy to clipboardprint?

package test;

import java.util.UUID;

public class UUIDGenerator {

public UUIDGenerator() {

}

public static String getUUID() {

UUID uuid = UUID.randomUUID();

String str = uuid.toString();

// 去掉"-"符号

String temp = str.substring(0, + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);

return str+","+temp;

}

//获得指定数量的UUID

public static String[] getUUID(int number) {

if (number < 1) {

return null;

}

String[] ss = new String[number];

for (int i = 0; i < number; i++) {

ss[i] = getUUID();

}

return ss;

}

public static void main(String[] args) {

String[] ss = getUUID(10);

for (int i = 0; i < ss.length; i++) {

System.out.println("ss["+i+"]====="+ss[i]);

}

}

}

package test;

import java.util.UUID;

public class UUIDGenerator {

public UUIDGenerator() {

}

public static String getUUID() {

UUID uuid = UUID.randomUUID();

String str = uuid.toString();

// 去掉"-"符号

String temp = str.substring(0, + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23) + str.substring(24);

return str+","+temp;

} //获得指定数量的UUID

public static String[] getUUID(int number) {

if (number < 1) {

return null;

}

String[] ss = new String[number];

for (int i = 0; i < number; i++) {

ss[i] = getUUID();

}

return ss;

}

public static void main(String[] args) {

String[] ss = getUUID(10);

for (int i = 0; i < ss.length; i++) {

System.out.println("ss["+i+"]====="+ss[i]);

}

}

}

结果:

view plaincopy to clipboardprint?

ss[0]=====4cdbc040-657a-4847-b266-7e31d9e2c3d9,4cdbc040657a4847b2667e31d9e2c3d9

ss[1]=====72297c88-4260-4c05-9b05-d28bfb11d10b,72297c8842604c059b05d28bfb11d10b

ss[2]=====6d513b6a-69bd-4f79-b94c-d65fc841ea95,6d513b6a69bd4f79b94cd65fc841ea95

ss[3]=====d897a7d3-87a3-4e38-9e0b-71013a6dbe4c,d897a7d387a34e389e0b71013a6dbe4c

ss[4]=====5709f0ba-31e3-42bd-a28d-03485b257c94,5709f0ba31e342bda28d03485b257c94

ss[5]=====530fbb8c-eec9-48d1-ae1b-5f792daf09f3,530fbb8ceec948d1ae1b5f792daf09f3

ss[6]=====4bf07297-65b2-45ca-b905-6fc6f2f39158,4bf0729765b245cab9056fc6f2f39158

ss[7]=====6e5a0e85-b4a0-485f-be54-a758115317e1,6e5a0e85b4a0485fbe54a758115317e1

ss[8]=====245accec-3c12-4642-967f-e476cef558c4,245accec3c124642967fe476cef558c4

ss[9]=====ddd4b5a9-fecd-446c-bd78-63b70bb500a1,ddd4b5a9fecd446cbd7863b70bb500a1

ss[0]=====4cdbc040-657a-4847-b266-7e31d9e2c3d9,4cdbc040657a4847b2667e31d9e2c3d9

ss[1]=====72297c88-4260-4c05-9b05-d28bfb11d10b,72297c8842604c059b05d28bfb11d10b

ss[2]=====6d513b6a-69bd-4f79-b94c-d65fc841ea95,6d513b6a69bd4f79b94cd65fc841ea95

ss[3]=====d897a7d3-87a3-4e38-9e0b-71013a6dbe4c,d897a7d387a34e389e0b71013a6dbe4c

ss[4]=====5709f0ba-31e3-42bd-a28d-03485b257c94,5709f0ba31e342bda28d03485b257c94

ss[5]=====530fbb8c-eec9-48d1-ae1b-5f792daf09f3,530fbb8ceec948d1ae1b5f792daf09f3

ss[6]=====4bf07297-65b2-45ca-b905-6fc6f2f39158,4bf0729765b245cab9056fc6f2f39158

ss[7]=====6e5a0e85-b4a0-485f-be54-a758115317e1,6e5a0e85b4a0485fbe54a758115317e1

ss[8]=====245accec-3c12-4642-967f-e476cef558c4,245accec3c124642967fe476cef558c4

ss[9]=====ddd4b5a9-fecd-446c-bd78-63b70bb500a1,ddd4b5a9fecd446cbd7863b70bb500a1

可以看出,UUID 是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字

UUID由以下几部分的组合:

(1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。

(2)时钟序列

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。

UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),可以从cflib 下载CreateGUID() UDF进行转换。

使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。

通用惟一标识符还可以用来指向大多数的可能的物体。微软和其他一些软件公司都倾向使用全球惟一标识符(GUID),这也是通用惟一标识符的一种类型,可用来指向组建对象模块对象和其他的软件组件。第一个通用惟一标识符是在网罗计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件。 posted on 2009-12-14 17:19 Werther 阅读(466) 评论(1) 编辑 收藏 所属分类: 10.Java

评论:

/# re: Java生成UUID通用唯一识别码 2009-12-14 19:58 | 天独 在去掉“-”可以用replaceAll这个方法 回复 更多评论 IT新闻 新用户注册 刷新评论列表

Chrome OS专题 IT新闻 Java程序员招聘 标题 请输入标题 姓名 请输入你的姓名 主页 请输入验证码 验证码 /* 内容(请不要发表任何与政治相关的内容) 请输入评论内容 Remember Me? 登录 [使用Ctrl+Enter键可以直接提交] Windows 7专题 IT新闻: · 微软将推云计算迁移工具 · 广电总局明年加大查处力度 VeryCD有望逃过一劫 · 史玉柱携巨人重返珠海 · 谷歌2009年15件大事 先后2次裁员 · 谷歌和Facebook推出短域名goo.gl和Fb.me

博客园首页随笔: · 汉诺塔(Hanoi) C/#解法 · 计算机中的颜色VI——从色相值到纯色的快速计算 · 反编译Silverlight项目 · 程序之外的事情 (Part 1 - Speech) · Visual Studio 2010 Ultimate敏捷测试驱动开发 招聘信息: · .NET 网站程序开发工程师(龙宽网络信息技术(北京)有限公司) · 技术部经理(河南互惠信息咨询有限责任公司) · .NET(C/#)程序员(北京赛优科技有限公司) · .net平台研发工程师(北京易车互联信息技术有限公司) · C++开发工程师(空中网) 在知识库中查看: Java生成UUID通用唯一识别码 网站导航:

博客园 IT新闻 个人主页 博客生活 IT博客网 C++博客 博客园社区 管理 相关文章:

I'm reading...

Java 60 Head First SQL Apache Tomcat5 If you need these books,pls send me emails. Email:kunpeng.niu@163.com < 2009年12月 > 日 一 二 三 四 五 六 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9

留言簿(6)

随笔分类(154)

随笔档案(179)

文章档案(1)

新闻档案(5)

相册

1.Java Official Website

2.Java Study Website

3.Java Technic Website

4.Java Video Website

5.Database Website

6.Bookshop Website

7.English Website

8.Friends Link

9.Other Web

积分与排名

  • 积分 - 80344
  • 排名 - 172

最新评论

阅读排行榜

评论排行榜

J2EE总结

Posted on

J2EE总结--Servlet技术

J2EE总结--Servlet技术 我的所有随笔属于个人总结,有不足之处请回复指出

Servlet技术:

  1. 什么是servlet?

Servlet是一个java类,是一个提供基于协议请求和响应的java类;

  1. 它的生命周期

    1. 启动服务器时就会实例化并加载servlet实例;

    2. 进行初始化:自动调用init(ServletConfig servletConfig)方法;

    3. Servlet就绪:调用service(HttpServletRequest request,HttpServletResponse response)方法(其 中 service 就是dopost()或doget()方法),这是客户提交时,自动调用的;

    4. Servlet销毁:自动调用调用distory() ;

    注意:在实例化并加载servlet后,步骤二和四只调用一次,而步骤三,是在每次客户端发出请求时都调用;

  2. 怎样部署一个servlet?

Servlet类是必须在web.xml中注册才能使用的,例如,我有一个MyServlet类:

必须在web.xml中注册:

//-----------------------Servlet声明----------------------

       <servlet>

             <servlet-name>myServlet</servlet-name>

             <servlet-class>servletPakage.MyServlet</servlet-class>

  </servlet>

//------------------------Servlet注册(镜像)---------------

       <servlet-mapping>

             <servlet-name>myServlet</servlet-name>

             <url-pattern>/myServletURL</ url-pattern >

  </servlet-mapping>

这样你在提交时的Url地址就是/myServletURL了;

  1. 什么是service(HttpServletRequest request,HttpServletResponse response)方法?

其中service(HttpServletRequest request,HttpServletResponse response)方法包括两种:

  1.       doget(HttpServletRequest request,HttpServletResponse response)方法:

  这种方法被称为显式提交方法,主要原因是它的得到的参数放在url中,可以被看到,所以称为显示提      交;

  例如:有个表单:

  <form action[=”/myServletURL?name=todd](http://www.blogjava.net/myServletURL?name=todd)” method=”get”>

  </form>

  这种方法其request获得的参数就是你看到的name=todd;

  例如:String s=request.getParameter(“name”);

        其结果s=”todd”;

  2.       dopost(HttpServletRequest request,HttpServletResponse response)方法:

     这种方法被称为隐式提交方法,它的参数不会在url里得到,而是在请求数据体得到参数;

     例如:有个表单:

        <form action=”/myServletURL” method=”post”>

                 <input type=”text” name=”name” value=”todd”>

     </form>

  这种方法其request获得的参数就是表单体的name=todd;

        例如:String s=request.getParameter(“name”);

        其结果s=”todd”;
  1. 什么是ServletContext?

    ServletContext是一个接口,是WebApplication的视图,它的作用域时Application,它能访问Application中的初始化参数和属性,它不局限域一个Servlet,它属于整个Application;

ServletContext的初始化参数:

在web.xml中:

<context-param>

myBlog

www.blogjava.net/todd841026

这样在application中任意一个Servlet中可以得到这个参数,

例如:ServletContext sc = getServletContext ();

      String s = sc.getInitParameter(“myBlog”);

那么结果s就是”www.blogjava.net/todd841026”

  1. 什么是ServletConfig?

是单独的Servlet初始化配置;

例如:在web.xml中

        <servlet>

             <servlet-name>myServlet</servlet-name>

             <servlet-class>servletPakage.MyServlet</servlet-class>

  </servlet>

  <init-param>

        <param-name>cache</param-name>

        <param-value>off</param-value>

在这个Servlet中:ServletConfig sc = getServletConfig();

                        String s = sc.getInitParameter(“cache”);

那么结果s就是”off”;

  1. Servlet怎样处理多线程

在默认的情况下,单个Servlet实例是可以处理多个并发请求的,所以要考虑到多线程的共享同一对象的问题,例如:

//做个Servlet中产生了多少个object对象一个变量的例子

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response){

       Object object = new Object() ;

       count++ ;

       System.out.println(“count = ” + count) ;

}

当有5个用户提交数据时,因为Servlet是处理多线程的,所以可能出现,第四个用户的程序已经执行了count++,而第五个用户刚执行完Object object = new Object() ,就会出现数据不一致性,因为当前有5个object对象,但是count却是4;

解决方案一:

Private boolean flag = false ;

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response){

       synchronized(flag){

                Object object = new Object() ;

                count++ ;

}

       System.out.println(“count = ” + count) ;

}

用同步程序块解决多线程的问题,这样在同一时刻就只能有一个访问该程序块了;

解决方案二:

Private int count = 0 ;

Public void dopost(HttpServletRequest request,HttpServletResponse response)

Implements SingleThreadModel{

       Object object = new Object() ;

       count++ ;

       System.out.println(“count = ” + count) ;

}

实现SingleThreadModel接口,可以解决多线程问题;

  1. 什么是servlet过滤器?

也是一个java类,只是它实现了Filter这个接口;

  1. servlet过滤器的生命周期;

初始化:自动调用init(FilterConfig config)方法

执行:自动调用doFilter()方法;

销毁:自动调用destory()方法;

  1. servlet过滤器有什么用途?

    个人认为目前自己用到的Servlet过滤器的主要用途:是安全性检查

    当然过滤器在Servlet之前也可以修改请求,要是在Servlet之后,也可以修改响应;

  2. servlet过滤器怎样部署?

在web.xml中:

<filter>

  <filter-name>myFilter</filter-name>

  <filter-class>filterPage.MyFilter</filter-class>

  <filter-name>myFilter</filter-name>

  <url-pattern>/Todd//*</url-pattern>

这样就是说要访问WEB-INF下的Todd包下的jsp或Servlet的话,就必须要先通过myFilter这个类;