1、JDK1.5/1.6/1.7 之新特性总结http:/ jdk1.5-jdk1.7 的使用,在不同的阶段,都使用过了jdk 的一些新特性,操作起来更加方面啦!特此总结了下,与喜欢 it 的朋友共勉!呵呵以下是测试代码:JDK1.5 新特性:1.自动装箱与拆箱:Integer iObj = 3;System.out.println(iObj + 12);Integer i1 = 137(-128-127 范围时,为 true);Integer i2 = 137(-128-127 范围时,为 true);System.out.println(i1 = i2); /false,但是括号中时却返回 t
2、ure,原因是 Integer 采用的是享元模式Integer i3 = Integer.valueOf(213);Integer i4 = Integer.valueOf(213);System.out.println(i3=i4);/同上,另一种包装形式2.枚举(常用来设计单例模式)public class EnumTest /* param args*/public static void main(String args) WeekDay1 weekDay = WeekDay1.MON;System.out.println(weekDay.nextDay();WeekDay weekD
3、ay2 = WeekDay.FRI;System.out.println(weekDay2);System.out.println(weekDay2.name();System.out.println(weekDay2.ordinal(); System.out.println(WeekDay.valueOf(“SUN“).toString();System.out.println(WeekDay.values().length);new Date(300);public enum WeekDaySUN(1),MON(),TUE,WED,THI,FRI,SAT;private WeekDay(
4、)System.out.println(“first“);private WeekDay(int day)System.out.println(“second“);public enum TrafficLampRED(30)public TrafficLamp nextLamp()return GREEN;,GREEN(45)public TrafficLamp nextLamp()return YELLOW; ,YELLOW(5)public TrafficLamp nextLamp()return RED; ;public abstract TrafficLamp nextLamp();p
5、rivate int time;private TrafficLamp(int time)this.time = time;3.静态导入import static java.lang.Math.*;public class StaticImport public static void main(String args)int x = 1;try x+; finally System.out.println(“template“);System.out.println(x);System.out.println(max(3, 6);System.out.println(abs(3 - 6);4
6、.可变参数public class VarableParameter /* param args*/public static void main(String args) System.out.println(add(2,3);System.out.println(add(2,3,5); public static int add(int x,int. args)int sum = x;/* for(int i=0;i/bin 加入 path 环境变量2.在命令行下切换当前目录到 WSProvider 的 class 文件所在的目录,运行下面命令wsgen -cp . WebServices
7、.WSProvider在这个例子中会生成以下 3 个类的源代码文件及 class 文件SayHiSayHiResponsePrintTime3.执行如下代码发布 WSProvider 到http:/localhost:8888/chinajash/WSProvider,在这里可以执行 WSProvider类的 main 方法就可以Endpoint.publish(“http:/localhost:8888/chinajash/WSProvider“,new WSProvider();4.在浏览器输入 http:/localhost:8888/chinajash/WSProvider?wsdl
8、就可以看到生成的 WSDL 文件,为了节省篇幅,这里就不把生成的 WSDL 文件贴上了,大家可以自己动手试试.2.脚本语言支持JDK6 增加了对脚本语言的支持(JSR 223),原理上是将脚本语言编译成bytecode,这样脚本语言也能享用 Java 平台的诸多优势,包括可移植性,安全等,另外,由于现在是编译成 bytecode 后再执行,所以比原来边解释边执行效率要高很多。加入对脚本语言的支持后,对 Java 语言也提供了以下好处。1、许多脚本语言都有动态特性,比如,你不需要用一个变量之前先声明它,你可以用一个变量存放完全不同类型的对象,你不需要做强制类型转换,因为转换都是自动的。现在 Ja
9、va 语言也可以通过对脚本语言的支持间接获得这种灵活性。2、 可以用脚本语言快速开发产品原型,因为现在可以 Edit-Run,而无需Edit-Compile-Run,当然,因为 Java 有非常好的 IDE 支持,我 们完全可以在IDE 里面编辑源文件,然后点击运行(隐含编译),以此达到快速开发原型的目的,所以这点好处基本上可以忽略。3、通过引入脚本语言可以轻松实现 Java 应用程序的扩展和自定义,我们可以把原来分布在在 Java 应用程序中的配置逻辑,数学表达式和业务规则提取出来,转用 JavaScript 来处理。Sun 的 JDK6 实现包含了一个基于 Mozilla Rhino 的
10、脚本语言引擎,支持JavaScript,这并不是说明 JDK6 只支持 JavaScript,任何第三方都可以自己实现一个 JSR-223 兼容的脚本引擎 使得 JDK6 支持别的脚本语言,比如,你想让 JDK6 支持 Ruby,那你可以自己按照 JSR 223 的规范实现一个 Ruby 的脚本引擎类,具体一点,你需要实现 javax.script.ScriptEngine(简单起见,可以继承 javax.script.AbstractScriptEngine)和javax.script.ScriptEngineFactory 两个接口。当然,在你实现自己的脚本语言引擎之前,先到 proje
11、ct 这里看看是不是有人已经帮你做了工作,这样你就可以直接拿来用就行。Scripting API-Scripting API 是用于在 Java 里面编写脚本语言程序的 API, 在Javax.script 中可以找到 Scripting API,我们就是用这个 API 来编写JavaScript 程序,这个包里面有一个 ScriptEngineManager 类,它是使用Scripting API 的入口,ScriptEngineManager 可以通过 jar 服务发现(service discovery)机制寻找合适的脚本引擎类(ScriptEngine),使用 Scripting AP
12、I的最简单方式只需下面三步1、创建一个 ScriptEngineManager 对象2、通过 ScriptEngineManager 获得 ScriptEngine 对象3、用 ScriptEngine 的 eval 方法执行脚本下面是一个 Hello World 程序/* * author chinajash */public class HelloScript public static void main(String args) throws Exception ScriptEngineManager factory = new ScriptEngineManager();/step
13、1 ScriptEngine engine = factory.getEngineByName(“JavaScript“);/Step 2 engine.eval(“print(Hello, Scripting)“);/Step 3 运行上面程序,控制台会输出 Hello, Scripting 上面这个简单的 Scripting 程序演示了如何在 Java 里面运行脚本语言,除此之外,我们还可以利用 Scripting API 实现以下功能 1、暴露 Java 对象为脚本语言的全局变量 2、在 Java 中调用脚本语言的方法 3、脚本语言可以实现 Java 的接口 4、脚本语言可以像 Java
14、 一样使用JDK 平台下的类下面的类演示了以上 4 种功能 package Scripting;import java.io.File;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;import javax.script.ScriptException;/* * author chinajash */public class ScriptingAPITester public static void main(String args)
15、throws Exception ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName(“JavaScript“); testScriptVariables(engine);/演示如何暴露 Java 对象为脚本语言的全局变量 testInvokeScriptMethod(engine);/演示如何在 Java 中调用脚本语言的方法 testScriptInterface(engine);/演示脚本语言如何实现 Java 的接口 testUsin
16、gJDKClasses(engine);/演示脚本语言如何使用 JDK 平台下的类 public static void testScriptVariables(ScriptEngine engine) throws ScriptException File file = new File(“test.txt“); engine.put(“f“, file); engine.eval(“println(Total Space:+f.getTotalSpace()“); public static void testInvokeScriptMethod(ScriptEngine engine)
17、throws Exception String script = “function hello(name) return Hello, + name;“; engine.eval(script); Invocable inv = (Invocable) engine; String res = (String)inv.invokeFunction(“hello“, “Scripting“ ); System.out.println(“res:“+res); public static void testScriptInterface(ScriptEngine engine) throws S
18、criptException String script = “var obj = new Object(); obj.run = function() println(run method called); “; engine.eval(script); Object obj = engine.get(“obj“); Invocable inv = (Invocable) engine; Runnable r = inv.getInterface(obj,Runnable.class); Thread th = new Thread(r); th.start(); public static
19、 void testUsingJDKClasses(ScriptEngine engine) throws Exception /Packages 是脚本语言里的一个全局变量,专用于访问 JDK 的 package String js = “function doSwing(t)var f=new Packages.javax.swing.JFrame(t);f.setSize(400,300);f.setVisible(true);“; engine.eval(js); Invocable inv = (Invocable) engine; inv.invokeFunction(“doSwi
20、ng“, “Scripting Swing“ ); Scripting Tool-SUN 提供的 JDK6 中有一个命令行工具?jrunscript,你可以在/bin 下面找到这个工具,jrunscript 是一个脚本语言的解释程序,它独立于脚本语言,但默认是用 JavaScript,我们可以用 jrunscript 来测试自己写的脚本语言是否正确,下面是一个在命令行运行 jrunscript 的简单例子jrunscriptjsprintln(“Hello,JrunScript“);Hello,JrunScriptjs9*872.0js3.JTable 的排序和过滤原来的 JTable 基本上
21、是只能显示数据,在 JDK6 新增了对 JTable 的排序和过滤功能,下面代码演示了这两个功能/* author chinajash*/public class JTableTester static String data = “China“,“Beijing“,“Chinese“,“America“,“Washington“,“English“,“Korea“,“Seoul“,“Korean“,“Japan“,“Tokyo“,“Japanese“,“France“,“Paris“,“French“,“England“,“London“,“English“,“Germany“,“Berli
22、n“,“German“,;static String titles = “Country“,“Capital“,“Language“;public static void main(String args) DefaultTableModel m = new DefaultTableModel(data,titles);JTable t = new JTable(m);final TableRowSorter sorter = new TableRowSorter(m); t.setRowSorter(sorter); /为 JTable 设置排序器JScrollPane sPane = ne
23、w JScrollPane();sPane.setViewportView(t);JPanel p = new JPanel();p.setLayout(new BoxLayout(p,BoxLayout.X_AXIS);JLabel l = new JLabel(“Criteria:“);final JTextField tf = new JTextField();JButton b = new JButton(“Do Filter“);p.add(l);p.add(tf);p.add(b);b.addActionListener(new ActionListener() public vo
24、id actionPerformed(ActionEvent e) if(tf.getText().length()=0)sorter.setRowFilter(null);elsesorter.setRowFilter(RowFilter.regexFilter(tf.getText();/为 JTable设置基于正则表达式的过滤条件);JFrame f = new JFrame(“JTable Sorting and Filtering“);f.getContentPane().add(sPane,BorderLayout.CENTER); f.getContentPane().add(p
25、,BorderLayout.SOUTH);f.setSize(400,300);f.setVisible(true); 运行上面程序,单击 JTable 的某一个 title,这个 title 对应的列就会按照升序/降序重新排列;在下面的 Criteria 文本框中输入“ese“,点击“Do Filter“按钮,JTable 将只显示带有“ese“字符串的行,也就是 China 和 Japan 两行,如果文本框里面什么都没有,点击“Do Filter“按钮,这时 JTable 会显示所有的行。4.更简单,更强大的 JAX-WSJAX-WS2.0 的来历-JAX-WS(JSR-224) 是 Ja
26、va Architecture for XML Web Services 的缩写,简单说就是一种用 Java 和 XML 开发 Web Services 应用程序的框架, 目前版本是2.0, 它是 JAX-RPC 1.1 的后续版本, J2EE 1.4 带的就是 JAX-RPC1.1, 而 Java EE 5 里面包括了 JAX-WS 2.0,但为了向后兼容,仍然支持 JAX-RPC. 现在,SUN 又把 JAX-WS 直接放到了 Java SE 6 里面,由于 JAX-WS 会用到 Common Annotation(JSR 250),Java Web Services Metadata(J
27、SR 181), JAXB2(JSR 222), StAX(JSR 173), 所以 SUN 也必须把后几个原属于 Java EE 范畴的Components 下放到 Java SE, 现在我们可以清楚地理解了为什么 Sun 要把这些看似跟 Java SE 没有关系的 Components 放进来,终极目的就是要在 Java SE 里面支持 Web Services.JAX-WS2.0 的架构-JAX-WS 不是一个孤立的框架,它依赖于众多其他的规范,本质上它由以下几部分组成1.用来开发 Web Services 的 Java API2.用来处理 Marshal/Unmarshal 的 XML
28、 Binding 机制,JAX-WS2.0 用 JAXB2 来处理 Java Object 与 XML 之间的映射,Marshalling 就是把 Java Object 映射到XML,Unmarshalling 则是把 XML 映射到 Java Object.之所以要做 Java Object与 XML 的映射,是因为最终作为方法参数和返回值的 Java Object 要通过网络传输协议(一般是 SOAP)传送,这就要求必须对 Java Object 做类似序列化和反序列化的工作,在 SOAP 中就是要用 XML 来表示 Java object 的内部状态3.众多元数据(Annotation
29、s)会被 JAX-WS 用来描述 Web Services 的相关类,包括 Common Annotations, Web Services Metadata, JAXB2 的元数据和 JAX-WS2.0规范自己的元数据.4.Annotation Processing Tool(APT)是 JAX-WS 重要的组成部分,由于 JAX-WS2.0规范用到很多元数据,所以需要 APT 来处理众多的 Annotations.在/bin 下有两个命令 wsgen 和 wsimport,就是用到 APT 和 Compiler API 来处理碰到的 Annotations,wsgen 可以为 Web Se
30、rvices Provider 产生并编译必要的帮助类和相关支持文件,wsimport 以 WSDL 作为输入为 Web Service Consumer 产生并编译必要的帮助类和相关支持文件.5.JAX-WS 还包括 JAX-WS Runtime 与应用服务器和工具之间的契约关系JAX-WS2.0 的编程模型-现在用 JAX-WS2.0 来编写 Web Services 非常简单,不像 JAX-RPC,JAX-WS 可以把任意 POJO 暴露为 Web Services,服务类不需要实现接口,服务方法也没有必要抛出 RMI 异常.下面介绍在 JDK6 环境下用 JAX-WS2.0 开发和测试
31、 Web Services的步骤1.编写服务类,并用 Web Services Metadata(JSR-181)标注这个服务类,我用我的另一篇 BlogJDK6 的新特性之十:Web 服务元数据中的 WSProvider 类作为服务类的例子,在此我重复贴一下 WSProvider 类的源代码:/* author chinajash*/WebService(targetNamespace=“http:/ class WSProvider WebResult(name=“Greetings“)/自定义该方法返回值在 WSDL 中相关的描述 WebMethodpublic String sayHi
32、(WebParam(name=“MyName“) String name)return “Hi,“+name; /WebParam 是自定义参数 name 在 WSDL 中相关的描述 Oneway /表明该服务方法是单向的,既没有返回值,也不应该声明检查异常WebMethod(action=“printSystemTime“,operationName=“printSystemTime“)/自定义该方法在 WSDL 中相关的描述public void printTime()System.out.println(System.currentTimeMillis();public static v
33、oid main(String args) Thread wsPublisher = new Thread(new WSPublisher();wsPublisher.start(); private static class WSPublisher implements Runnablepublic void run() /发布 WSProvider 到http:/localhost:8888/chinajash/WSProvider 这个地址,之前必须调用 wsgen命令/生成服务类 WSProvider 的支持类,命令如下:/wsgen -cp . WebServices.WSProvi
34、derEndpoint.publish(“http:/localhost:8888/chinajash/WSProvider“,new WSProvider(); 2.用 wsgen 生成上面服务类的必要的帮助类,然后调用用 EndPoint 类的静态方法 publish 发布服务类(步骤请参考我的另一篇 Blog JDK6 的新特性之十:Web服务元数据),我在这里是将服务类发布到http:/localhost:8888/chinajash/WSProvider3.用 wsimport 为服务消费者(也就是服务的客户端)生成必要的帮助类,命令如下:wsimport http:/localho
35、st:8888/chinajash/WSProvider?wsdl这会在netcsdnblogchinajash 下生成客户端的帮助类,在这个例子中会生成 7 个类HelloService.classObjectFactory.classpackage-info.classPrintSystemTime.classSayHi.classSayHiResponse.classWSProvider.class4.在客户端用下面代码即可调用步骤 1 定义的 Web ServiceHelloService hs = new HelloService();WSProvider ws = hs.getWS
36、ProviderPort();System.out.println(ws.sayHi(“chinajash“);ws.printSystemTime();调用上述代码后客户端控制台输出hi,chinajash服务端控制台输出服务器当前系统时间5.轻量级 Http ServerJDK6 的新特性之五:轻量级 Http ServerJDK6 提供了一个简单的 Http Server API,据此我们可以构建自己的嵌入式Http Server,它支持 Http 和 Https 协议,提供了 HTTP1.1 的部分实现,没有被实现的那部分可以通过扩展已有的 Http Server API 来实现,程序
37、员必须自己实现 HttpHandler 接口,HttpServer 会调用 HttpHandler 实现类的回调方法来处理客户端请求,在这里,我们把一个 Http 请求和它的响应称为一个交换,包装成HttpExchange 类,HttpServer 负责将 HttpExchange 传给 HttpHandler 实现类的回调方法.下面代码演示了怎样创建自己的 Http Server/* Created by IntelliJ IDEA.* User: Chinajash* Date: Dec 30, 2006*/public class HTTPServerAPITester public s
38、tatic void main(String args) try HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);/设置 HttpServer 的端口为 8888hs.createContext(“/chinajash“, new MyHandler();/用MyHandler 类内处理到/chinajash 的请求hs.setExecutor(null); / creates a default executorhs.start(); catch (IOException e) e.printStackTrac
39、e();class MyHandler implements HttpHandler public void handle(HttpExchange t) throws IOException InputStream is = t.getRequestBody();String response = “Happy New Year 2007!-Chinajash“;t.sendResponseHeaders(200, response.length();OutputStream os = t.getResponseBody();os.write(response.getBytes();os.c
40、lose();运行程序后,在浏览器内输入 http:/localhost:8888/xx,浏览器输出6.嵌入式数据库 DerbyDerby 是 IBM 送给开源社区的又一个礼物,是一个 pure java 的数据库,现在已经被列入到 java1.6 中。不知道对于大数据量的性能如何,但传说中启动 derby 只会给 JVM 添加 2M 的内存,对那些小数据库应用,比如像用 access 那种应该是挺有诱惑力的。另外,麻雀虽小,五脏俱全,功能要比 access 多得多咯,包括事务处理,并发,触发器都有,管理又简单,因此自己用来做点工具正好合适。废话少说,介绍一下我折腾了半天的经验吧。我的 Der
41、by 配置过程:1,下载 db-derby-10.1.3.1-bin.tar.gz,derby_core_plugin_10.1.3.zip 和derby_ui_plugin_1.1.0.zip,把两个插件安装到 eclipse 上2,打开 ecllipse,新建一个 project3,右键这个 project,选择 Apache Derby,再选择 add apache derby native,发现只是给我的 project 添加了几个 derby 的 jar,还不是在我看着顺眼的 lib 目录里,索性干掉,换上 db-derby- 10.1.3.1-bin.tar.gz 解压出来以后 l
42、ib 目录下的 jar 文件,在 Build Path 里设置一下;4,右键 Project,在 apache derby 里选择 start apache derby network server,控制台可以看到 derby 启动后打出的“服务器准备在端口 1527 上接受连接。”5,右键 Project,在 apache derby 里选择 ij(Interactive SQL),启动 SQL 控制台;6,输入 connect jdbc:derby:testdb;create=true; 注意要有单引号,可以在工程跟目录下创建 testdb 数据库,可以看到一个新建的目录 testdb,那
43、里的文件就是数据库咯;7,用标准的 SQL 语句来建一个数据库试试:create table test (a varchar(4) not null, b char(2) primary key);居然可以用,太神奇了,呵呵8,再插入一条语句试试呢,insert into test(a,b) values(a,11);,嗯,不错,可以用 select 查出来的哦。9,再插一下:insert into test(a,b) values(a,11);,哦哦,报错了,“错误 23505:语句异常终止,因为它导致“TEST”上所定义的“SQL060710092132480”标识的唯一或主键约束或唯一索
44、引中出现重复键值。” 呵呵。10,好了,现在可以像你控制的其他数据库一样来控制 Derby 了。如果上述方法不行,或者你习惯了在 eclipse 之外使用和管理数据库,那么可以很方便的把 Derby“装”在系统里。下面我说一下步骤:1,把 db-derby-10.1.3.1-bin.tar.gz 解压到 c:derby,使 lib 和 framework两个目录在 c:derby 下边即可2,设置环境变量设置一个 c:derbyframeworkembededbin 或c:derbyframeworkNetworkServebin 到 Path 中,这样我们就可以直接执行上边介绍的 conne
45、ct 这样的命令而不用每次钻到那个目录下去执行了 设置 c:derbylibderby.jar;c:derbylibderbytoos.jar 到 CLASSPATH 中,以便让这些 java 编成的命令能够正确执行;3,打开 cmd4,敲入 startNetworkServer,可以看到像在 eclisp 中提示的那样启动了server5,再打开一个 cmd,敲入 sysinfo,可以看到 derby 的环境信息了,注意在 java user dir 这一项,也许是 java 用户目录上和上边看到的会有所不同哦,这样在 connect jdbc:derby:testdb;create=tru
46、e;的建的数据库目录就不一样咯。6,敲入 ij,好了,进入到上边的交互界面,可以建一个数据库看看了。7,最后在另外一个 cmd 中敲入 stopNetworkServer 就可以关闭数据库了。如果你两种方法都试过了,那么需要注意的,还是上边步骤 5 的问题,这个问题是你可能随时会启动一个数据库或新建一个数据库,但如果你刚刚使用derby,你可能还没有察觉。derby 实际上有两种启动方式,一种是嵌入式的,一种是网络服务器的启动。1,我们在 eclipse 中右键 start apache derby network server 那个,就是网络服务器的启动方式,在这种方式下可以用另外一台计算机在 ij 中以:connect jdbc:derby:/192.168.0.28:1527/testdb 的方式进行链接。2,第二种启动方式是在 ij 里边就直接connect jdbc:derby:testdb这实际是在连当前配置环境下 java user dir 下那个目录的数据库。看到这里可能有点糊涂了,这么就会出问题了那?实际上 derby 的访问更像是一种使用 derby driver 对本地文件系统的访问,不管启动不启动网络服务器,都可以用 driver 访问本地的数据库。这样