当前位置:   article > 正文

java 1.6特性_JDK1.6.0新特性详解与代码示例

jdk1.6

JDK6.0发布有段时间了,新的JDK也有不少新的特性,我去网上搜集了一下,列在下面和大家一起学习.

1.

Desktop和SystemTray. 在JDK6中

,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱

发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托

盘程序。

我随便找了几张图,在Tray里面都是空的,没有图,可能是图太大,有xdjm知道希望告诉我.

485609_1.gifimportjava.awt.AWTException;

485609_1.gifimportjava.awt.Desktop;

485609_1.gifimportjava.awt.Image;

485609_1.gifimportjava.awt.MenuItem;

485609_1.gifimportjava.awt.PopupMenu;

485609_1.gifimportjava.awt.SystemTray;

485609_1.gifimportjava.awt.Toolkit;

485609_1.gifimportjava.awt.TrayIcon;

485609_1.gifimportjava.awt.event.ActionEvent;

485609_1.gifimportjava.awt.event.ActionListener;

485609_1.gifimportjava.io.File;

485609_1.gifimportjava.io.IOException;

485609_1.gifimportjava.net.URI;

485609_1.gifimportjava.net.URISyntaxException;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassDesktopTrayTest...{

485609_18.gifprivatestaticDesktop desktop;

485609_18.gifprivatestaticSystemTray st;

485609_18.gifprivatestaticPopupMenu pm;

485609_18.gif    

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_22.gif

485609_23.gifif( Desktop.isDesktopSupported() )...{

485609_18.gif            desktop=Desktop.getDesktop();

485609_27.gif        }485609_22.gif

485609_23.gifif( SystemTray.isSupported() )...{

485609_18.gif            st=SystemTray.getSystemTray();

485609_18.gif            Image image=Toolkit.getDefaultToolkit().createImage("http://www.51ppt.com.cn/Article/Uploadphotos/200604/20064147333288.png");

485609_18.gif            createPopupMenu();

485609_18.gif            TrayIcon ti=newTrayIcon( image,"Demo", pm );

485609_22.gif

485609_23.giftry...{

485609_18.gif                st.add( ti );

485609_22.gif

485609_23.gif            }catch( AWTException awte )...{

485609_18.gif                awte.printStackTrace();

485609_27.gif            }485609_27.gif        }485609_27.gif    }485609_22.gif

485609_23.gifpublicstaticvoidsendMail( String mail )...{

485609_18.gifif( desktop!=null&&485609_22.gif

485609_23.gif            desktop.isSupported( Desktop.Action.MAIL ) )...{

485609_22.gif

485609_23.giftry...{

485609_18.gif                desktop.mail(newURI( mail ) );

485609_22.gif

485609_23.gif            }catch(IOException e)...{

485609_18.gif                e.printStackTrace();

485609_22.gif

485609_23.gif            }catch(URISyntaxException e)...{

485609_18.gif                e.printStackTrace();

485609_27.gif            }485609_27.gif        }485609_27.gif    }485609_22.gif

485609_23.gifpublicstaticvoidopenBrowser( String url )...{

485609_18.gifif( desktop!=null&&485609_22.gif

485609_23.gif            desktop.isSupported( Desktop.Action.BROWSE ))...{

485609_22.gif

485609_23.giftry...{

485609_18.gif                desktop.browse(newURI( url ) );

485609_22.gif

485609_23.gif            }catch(IOException e)...{

485609_18.gif                e.printStackTrace();

485609_22.gif

485609_23.gif            }catch(URISyntaxException e)...{

485609_18.gif                e.printStackTrace();

485609_27.gif            }485609_27.gif        }485609_27.gif    }485609_22.gif

485609_23.gifpublicstaticvoidedit()...{

485609_18.gifif( desktop!=null&&485609_22.gif

485609_23.gif            desktop.isSupported( Desktop.Action.EDIT ) )...{

485609_18.gif            File file=newFile("test.txt");

485609_22.gif

485609_23.giftry...{

485609_22.gif

485609_23.gifif( file.exists()==false)...{

485609_18.gif                    file.createNewFile();

485609_27.gif                }485609_18.gif                desktop.edit( file );

485609_22.gif

485609_23.gif            }catch( IOException ioe )...{

485609_18.gif                ioe.printStackTrace();

485609_27.gif            }485609_27.gif        }485609_27.gif    }485609_22.gif

485609_23.gifpublicstaticvoidcreatePopupMenu()...{

485609_18.gif        pm=newPopupMenu();

485609_18.gif        MenuItem ob=newMenuItem("Open url");

485609_22.gif

485609_23.gif        ob.addActionListener(newActionListener()...{

485609_22.gif

485609_23.gifpublicvoidactionPerformed( ActionEvent ae )...{

485609_18.gif                openBrowser("http://blog.csdn.net/xumingming64398966");

485609_27.gif            }485609_27.gif        });

485609_18.gif        MenuItem sm=newMenuItem("Send Mail");

485609_22.gif

485609_23.gif        sm.addActionListener(newActionListener()...{

485609_22.gif

485609_23.gifpublicvoidactionPerformed( ActionEvent ae )...{

485609_18.gif                sendMail("64398966@qq.com");

485609_27.gif            }485609_27.gif        });

485609_18.gif        MenuItem ed=newMenuItem("Edit");

485609_22.gif

485609_23.gif        ed.addActionListener(newActionListener()...{

485609_22.gif

485609_23.gifpublicvoidactionPerformed( ActionEvent ae )...{

485609_18.gif                edit();

485609_27.gif            }485609_27.gif        });

485609_18.gif        MenuItem ex=newMenuItem("Exit");

485609_22.gif

485609_23.gif        ex.addActionListener(newActionListener()...{

485609_22.gif

485609_23.gifpublicvoidactionPerformed( ActionEvent ae )...{

485609_18.gif                System.exit(0);

485609_27.gif            }485609_27.gif        });

485609_18.gif        pm.add( ob );

485609_18.gif        pm.add( sm );

485609_18.gif        pm.add( ed );

485609_18.gif        pm.addSeparator();

485609_18.gif        pm.add( ex );

485609_27.gif    }485609_137.gif}485609_1.gif

2.

Console. JDK6中提供了java.io.Console类专用来访问基于字符的控制台设备.

你的程序如果要与Windows下的cmd或者Linux下的Terminal交互,就可以用Console类代劳.

但我们不总是能得到可用的Console, 一个JVM是否有可用的Console依赖于底层平台和JVM如何被调用.

如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的Console实

例. 下面代码演示了Console类的用法:

485609_1.gifimportjava.io.Console;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassConsoleTest...{

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_18.gif        Console console=System.console();

485609_22.gif

485609_23.gifif( console!=null)...{

485609_18.gif            String user=newString( console.readLine("Enter User:",newObject[0] ) );

485609_18.gif            String pwd=newString( console.readPassword("Enter Password:",newObject[0] ));

485609_22.gif

485609_23.gif            console.printf("User name is:%s",newObject[]...{user});

485609_22.gif

485609_23.gif            console.printf("Password is:%s",newObject[]...{pwd});

485609_22.gif

485609_23.gif        }else...{

485609_18.gif            System.out.println("No Console!");

485609_27.gif        }485609_27.gif    }485609_137.gif}485609_1.gif

你如果是在一个IDE中如eclipse, netbeans中运行你将得到:

No Console!

因为只有在命令行中才能得到Console对象。

3.

Compiler API. 现在我们可以用JDK6 的Compiler API(JSR 199)去动态编译Java源文件,Compiler

API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码,有点动态语言的特征。这个特性对于某些需要用到动态编译的应用程序相当有用,比

如JSP Web Server,当我们手动修改JSP后,是不希望需要重启Web

Server才可以看到效果的,这时候我们就可以用Compiler API来实现动态编译JSP文件,当然,现在的JSP Web

Server也是支持JSP热部署的,现在的JSP Web

Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码,这种方式需要我们产生另一个进程去

做编译工作,不够优雅而且容易使代码依赖与特定的操作系统;Compiler

API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。 下面代码演示了Compiler API的使用:

485609_1.gifimportjava.io.BufferedWriter;

485609_1.gifimportjava.io.FileWriter;

485609_1.gifimportjava.io.IOException;

485609_1.gifimportjava.util.Iterator;

485609_1.gif

485609_1.gifimportjavax.tools.JavaCompiler;

485609_1.gifimportjavax.tools.JavaFileObject;

485609_1.gifimportjavax.tools.StandardJavaFileManager;

485609_1.gifimportjavax.tools.ToolProvider;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassCompilerAPITest...{

485609_18.gifprivatefinalstaticString srcFileName="Test.java";

485609_18.gifprivatefinalstaticString classFileName="Test.class";

485609_18.gifprivatefinalstaticString className="Test";

485609_18.gif    

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_18.gif        JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();

485609_22.gif

485609_23.gifif( compiler==null)...{

485609_18.gif            System.err.println("Compiler is null!");

485609_18.gifreturn;

485609_27.gif        }485609_18.gif        StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null);

485609_18.gif        generateJavaClass();

485609_18.gif        

485609_22.gif

485609_23.gif        Iterable<?extendsJavaFileObject>sourceFiles=fileManager.getJavaFileObjects(newString[]...{ srcFileName });

485609_18.gif        compiler.getTask(null, fileManager,null,null,null, sourceFiles ).call();

485609_22.gif

485609_23.giftry...{

485609_18.gif            fileManager.close();

485609_18.gif            Class.forName( className ).newInstance();

485609_22.gif

485609_23.gif        }catch(IOException e)...{

485609_18.gif            e.printStackTrace();

485609_22.gif

485609_23.gif        }catch(InstantiationException e)...{

485609_18.gif            e.printStackTrace();

485609_22.gif

485609_23.gif        }catch(IllegalAccessException e)...{

485609_18.gif            e.printStackTrace();

485609_22.gif

485609_23.gif        }catch(ClassNotFoundException e)...{

485609_18.gif            e.printStackTrace();

485609_27.gif        }485609_27.gif    }485609_18.gif    

485609_22.gif

485609_23.gifpublicstaticvoidgenerateJavaClass()...{

485609_22.gif

485609_23.giftry...{

485609_18.gif            FileWriter rw=newFileWriter( srcFileName );

485609_18.gif            BufferedWriter bw=newBufferedWriter( rw );

485609_18.gif            bw.write("public class"+className+"{");

485609_18.gif            bw.newLine();

485609_18.gif            

485609_18.gif            bw.write("public"+className+"() {");

485609_18.gif            bw.newLine();

485609_18.gif            bw.write("System.out.println( 'you are in the constructor of Class Test' );");

485609_18.gif            bw.write("}");

485609_18.gif            bw.newLine();

485609_18.gif            

485609_18.gif            bw.write("}");

485609_18.gif            bw.flush();

485609_18.gif            bw.close();

485609_22.gif

485609_23.gif        }catch(IOException e)...{

485609_18.gif            e.printStackTrace();

485609_27.gif        }485609_27.gif    }485609_137.gif}485609_1.gif

我在运行这个例子的时候发现ToolProvider.getSystemJavaCompiler得到的是NULL,后来上网一查,原来是一个Bug!链接如下:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477844

Closed, not reproducible

那为什么我一直在reproduce阿?

4.Http

Server API. JDK6提供了一个简单的Http Server API,据此我们可以构建自己的嵌入式Http

Server,它支持Http和Https协议,提供了HTTP1.1的部分实现,没有被实现的那部分可以通过扩展已有的Http Server

API来实现,程序员必须自己实现HttpHandler接口,HttpServer会调用HttpHandler实现类的回调方法来处理客户端请求,在

这里,我们把一个Http请求和它的响应称为一个交换,包装成HttpExchange类,HttpServer负责将HttpExchange传给

HttpHandler实现类的回调方法.下面代码演示了怎样创建自己的Http Server .

485609_1.gifimportjava.io.IOException;

485609_1.gifimportjava.io.InputStream;

485609_1.gifimportjava.io.OutputStream;

485609_1.gifimportjava.net.InetSocketAddress;

485609_1.gif

485609_1.gifimportcom.sun.net.httpserver.HttpExchange;

485609_1.gifimportcom.sun.net.httpserver.HttpHandler;

485609_1.gifimportcom.sun.net.httpserver.HttpServer;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassHttpServerAPITest...{

485609_18.gifprivatestaticintcount=0;

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_22.gif

485609_23.giftry...{

485609_18.gif            HttpServer hs=HttpServer.create(newInetSocketAddress(8888),0);

485609_18.gif            hs.createContext("/",newMyHandler() );

485609_18.gif            hs.createContext("/java",newMyHandler() );

485609_18.gif            hs.setExecutor(null);

485609_18.gif            hs.start();

485609_18.gif            System.out.println("---begin---");

485609_18.gif            System.out.println("Listening on"+hs.getAddress() );

485609_22.gif

485609_23.gif        }catch( IOException ioe )...{

485609_18.gif            ioe.printStackTrace();

485609_27.gif        }485609_27.gif    }485609_22.gif

485609_23.gifstaticclassMyHandlerimplementsHttpHandler...{

485609_22.gif

485609_23.gifpublicvoidhandle( HttpExchange he )throwsIOException...{

485609_18.gif            System.out.println("Request"+count++);

485609_18.gif            System.out.println( he.getHttpContext().getPath() );

485609_18.gif            

485609_18.gif            InputStream is=he.getRequestBody();

485609_18.gif            String response="Happy Spring Festerval";

485609_18.gif            he.sendResponseHeaders(200, response.length() );

485609_18.gif            OutputStream os=he.getResponseBody();

485609_18.gif            os.write( response.getBytes() );

485609_18.gif            os.close();

485609_27.gif        }485609_27.gif    }485609_137.gif}485609_1.gif

效果如图:

485609_280.bmp

5.对脚本语言的支持如: ruby, groovy, javascript.

代码如下:

485609_1.gifimportjava.io.FileReader;

485609_1.gif

485609_1.gifimportjavax.script.Invocable;

485609_1.gifimportjavax.script.ScriptEngine;

485609_1.gifimportjavax.script.ScriptEngineManager;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassScriptTest...{

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_18.gif        ScriptEngineManager manager=newScriptEngineManager();

485609_18.gif        ScriptEngine engine=manager.getEngineByName("ECMAScript");

485609_22.gif

485609_23.giftry...{

485609_18.gif            engine.eval(newFileReader("C:\test.js") );

485609_18.gif            Invocable invocableEngine=(Invocable)engine;

485609_18.gif            Object ret=invocableEngine.invokeFunction("test",null);

485609_18.gif            System.out.println("The result is :"+(Double)ret );

485609_22.gif

485609_23.gif        }catch( Exception e )...{

485609_18.gif            e.printStackTrace();

485609_27.gif        }485609_27.gif    }485609_137.gif}485609_1.gif

test.js如下:

485609_16.gif

485609_17.giffunctiontest()...{

485609_18.gifreturnMath.round(11.2);

485609_137.gif}

6.

插入式注解处理API(Pluggable Annotation Processing API),插入式注解处理API(JSR

269)提供一套标准API来处理Annotations.JSR 269用Annotation

Processor在编译期间而不是运行期间处理Annotation, Annotation

Processor相当于编译器的一个插件,所以称为插入式注解处理.如果Annotation

Processor处理Annotation时(执行process方法)产生了新的Java代码,编译器会再调用一次Annotation

Processor,如果第二次处理还有新代码产生,就会接着调用Annotation

Processor,直到没有新代码产生为止.每执行一次process()方法被称为一个"round",这样整个Annotation

processing过程可以看作是一个round的序列.

举个例子:们想建立一套基于Annotation的单元测试框架(如TestNG),在测试类里面用Annotation来标识测试期间需要执行的测试方法,如下所示:

485609_1.gif@TestMethod

485609_16.gif

485609_17.gifpublicvoidtestCheckName()...{

485609_18.gif//do something here485609_137.gif}

这时我们就可以用JSR 269提供的API来处理测试类,根据Annotation提取出需要执行的测试方法.

再举个例子: 下面我用代码演示如何来用JSR 269提供的API来处理Annotations和读取Java源文件的元数据(metadata)

485609_1.gifimport java.util.List;

485609_1.gifimport java.util.Map;

485609_1.gifimport java.util.Set;

485609_1.gif

485609_1.gifimport javax.annotation.processing.AbstractProcessor;

485609_1.gifimport javax.annotation.processing.RoundEnvironment;

485609_1.gifimport javax.annotation.processing.SupportedAnnotationTypes;

485609_1.gifimport javax.annotation.processing.SupportedSourceVersion;

485609_1.gifimport javax.lang.model.SourceVersion;

485609_1.gifimport javax.lang.model.element.AnnotationMirror;

485609_1.gifimport javax.lang.model.element.AnnotationValue;

485609_1.gifimport javax.lang.model.element.Element;

485609_1.gifimport javax.lang.model.element.ExecutableElement;

485609_1.gifimport javax.lang.model.element.TypeElement;

485609_1.gifimport javax.lang.model.util.ElementFilter;

485609_1.gifimport javax.tools.Diagnostic.Kind;

485609_1.gif

485609_1.gif@SupportedAnnotationTypes("ToBeTested")

485609_1.gif@SupportedSourceVersion( SourceVersion.RELEASE_6 )

485609_16.gif

485609_17.gifpublicclassMyAnnotationProcessor extends AbstractProcessor...{

485609_22.gif

485609_23.gifprivatevoidnote( String msg )...{

485609_18.gif        processingEnv.getMessager().printMessage( Kind.NOTE, msg );

485609_27.gif    }485609_22.gif

485609_23.gifpublicboolean process( Set<?extends  TypeElement>annotations, RoundEnvironment roundEnv )...{

485609_22.gif

485609_23.giffor( TypeElement te : annotations )...{

485609_18.gif            note("annotation:"+te.toString() );

485609_27.gif        }485609_18.gif        Set<?extends  Element>elements=roundEnv.getRootElements();

485609_22.gif

485609_23.giffor( Element e : elements )...{

485609_18.gif            List<?extends  Element>enclosedElems=e.getEnclosedElements();

485609_18.gif            List<?extends  ExecutableElement>ees=ElementFilter.methodsIn( enclosedElems );

485609_22.gif

485609_23.giffor( ExecutableElement ee : ees )...{

485609_18.gif                note("Executable Element Name:"+ee.getSimpleName() );

485609_18.gif                List<?extends  AnnotationMirror>as=ee.getAnnotationMirrors();

485609_18.gif                note("as:"+as); 

485609_22.gif

485609_23.giffor( AnnotationMirror am :as)...{

485609_18.gif                    Map<?extends  ExecutableElement,?extends AnnotationValue>map=am.getElementValues();

485609_18.gif                    Set<?extends  ExecutableElement>ks=map.keySet();

485609_22.gif

485609_23.giffor( ExecutableElement k : ks )...{

485609_18.gif                        AnnotationValue av=map.get( k );

485609_18.gif                        note("----"+ee.getSimpleName()+"."+k.getSimpleName()+"="+av.getValue());

485609_27.gif                    }485609_27.gif                }485609_27.gif            }485609_27.gif        }485609_18.gifreturnfalse;

485609_27.gif    }485609_137.gif}485609_1.gif

485609_1.gif485609_16.gif

485609_17.gifpublicclassTesting...{

485609_18.gif    @ToBeTested(group="A")

485609_22.gif

485609_23.gifpublicvoidm1()...{

485609_27.gif    }485609_18.gif    @ToBeTested(group="B",owner="QQ")

485609_22.gif

485609_23.gifpublicvoidm2()...{

485609_27.gif    }485609_137.gif}485609_1.gif

485609_1.gifimportjava.lang.annotation.ElementType;

485609_1.gifimportjava.lang.annotation.Retention;

485609_1.gifimportjava.lang.annotation.RetentionPolicy;

485609_1.gifimportjava.lang.annotation.Target;

485609_1.gif

485609_1.gif@Retention( RetentionPolicy.RUNTIME )

485609_1.gif@Target( ElementType.METHOD )

485609_16.gif

485609_17.gifpublic@interfaceToBeTested...{

485609_18.gif    String owner()default"Chinajash";

485609_18.gif    String group();

485609_137.gif}485609_1.gif

效果如下:

485609_398.BMP

7.StAX.

StAX是The Streaming API for XML的缩写,是继DOM(Document Object

Model)和SAX(Simple API for

XML)之后的又一种处理xml的api,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器

(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是

程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,

但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存

树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。

下面是个例子:

485609_1.gifimportjava.io.FileNotFoundException;

485609_1.gifimportjava.io.FileOutputStream;

485609_1.gif

485609_1.gifimportjavax.xml.namespace.QName;

485609_1.gifimportjavax.xml.stream.XMLEventReader;

485609_1.gifimportjavax.xml.stream.XMLInputFactory;

485609_1.gifimportjavax.xml.stream.XMLOutputFactory;

485609_1.gifimportjavax.xml.stream.XMLStreamException;

485609_1.gifimportjavax.xml.stream.XMLStreamWriter;

485609_1.gifimportjavax.xml.stream.events.StartElement;

485609_1.gifimportjavax.xml.stream.events.XMLEvent;

485609_1.gif

485609_16.gif

485609_17.gifpublicclassStaxTest...{

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] arg )throwsXMLStreamException, FileNotFoundException...{

485609_18.gif        readXMLByStAX();

485609_18.gif        writeXMLByStAX();

485609_27.gif    }485609_22.gif

485609_23.gifpublicstaticvoidreadXMLByStAX()throwsXMLStreamException, FileNotFoundException...{

485609_18.gif        XMLInputFactory factory=XMLInputFactory.newInstance();

485609_18.gif        XMLEventReader  reader=factory.createXMLEventReader( StaxTest.class.getResourceAsStream("test.xml") );

485609_18.gif        XMLEvent event;

485609_18.gif        StringBuffer  parsingResult=newStringBuffer();

485609_22.gif

485609_23.gifwhile( reader.hasNext() )...{

485609_18.gif            event=reader.nextEvent();

485609_22.gif

485609_23.gifif( event.isStartElement() )...{

485609_18.gif                StartElement se=event.asStartElement();

485609_18.gif                parsingResult.append("

485609_18.gif                parsingResult.append( se.getName() );

485609_22.gif

485609_23.gifif( se.getName().getLocalPart().equals("catalog") )...{

485609_18.gif                    parsingResult.append("id="");

485609_18.gif                    parsingResult.append( se.getAttributeByName(newQName("id") ).getValue());

485609_18.gif                    parsingResult.append(""") ;

485609_27.gif                }485609_18.gif                parsingResult.append(">");

485609_22.gif

485609_23.gif            }elseif( event.isCharacters() )...{

485609_18.gif                parsingResult.append( event.asCharacters().getData() );

485609_22.gif

485609_23.gif            }elseif( event.isEndElement() )...{

485609_18.gif                parsingResult.append("");

485609_18.gif                parsingResult.append( event.asEndElement().getName() );

485609_18.gif                parsingResult.append(">");

485609_27.gif            }485609_27.gif        }485609_18.gif        System.out.println( parsingResult );

485609_27.gif    }485609_18.gif    

485609_22.gif

485609_23.gifpublicstaticvoidwriteXMLByStAX()throwsXMLStreamException, FileNotFoundException...{

485609_18.gif        XMLOutputFactory factory=XMLOutputFactory.newInstance();

485609_18.gif        XMLStreamWriter writer=factory.createXMLStreamWriter(newFileOutputStream("output.xml") );

485609_18.gif        writer.writeStartDocument();

485609_18.gif        writer.writeCharacters("");

485609_18.gif        writer.writeComment("testing comment");

485609_18.gif        writer.writeCharacters("");

485609_18.gif        writer.writeStartElement("catalogs");

485609_18.gif        writer.writeNamespace("myNS","http://blog.csdn.net/Chinajash");

485609_18.gif        writer.writeAttribute("owner","sina");

485609_18.gif        writer.writeCharacters("");

485609_18.gif        writer.writeStartElement("http://blog.csdn.net/Chinajash","catalog");

485609_18.gif        writer.writeAttribute("id","007");

485609_18.gif        writer.writeCharacters("Apparel");

485609_18.gif//写入catalog元素的结束标签485609_18.gifwriter.writeEndElement();

485609_18.gif//写入catalogs元素的结束标签485609_18.gifwriter.writeEndElement();

485609_18.gif//结束 XML 文档485609_18.gifwriter.writeEndDocument();         

485609_18.gif        writer.close();

485609_18.gif

485609_27.gif    }485609_137.gif}485609_1.gif

test.xml:

485609_1.gif<?xml  version="1.0" encoding="UTF-8"?>485609_1.gif485609_1.gifBook485609_1.gifVideo485609_1.gif

8.

Web Service. 由于Web服务日趋流行,利用Web服务的功能性的API特征正从最新的Java EE版本中向Java SE

6平台迁移。换言之,针对Web服务不需另外加入额外的工具,在Java EE和Java

SE平台拥有相同的API。野马将大把不同的Web服务相关的API加到标准的工具柜中:以JSR 181针对Java

平台的Web服务元数据,通过JSR 224的基于XML 的Web服务Java API(JAX-WS);针对Java的带有附件的SOAP

API(SAAJ)作为JSR 67 。与三个Web服务API相关的包新增到Java SE 6.0里:JAX-WS API

放置到javax.xml.ws包; SAAJ类在javax.xml.soap 包; Web服务的元数据类放置在javax.jws包里。

下面是一个简单的例子, 下面的代码是要作为web service发布的类。

485609_1.gifpackagehello;

485609_1.gifimportjavax.jws.WebService;

485609_1.gifimportjavax.xml.ws.Endpoint;

485609_1.gif

485609_1.gif@WebService

485609_16.gif

485609_17.gifpublicclassCircleFunctions...{

485609_22.gif

485609_23.gifpublicdoublegetArea(intradius )...{

485609_18.gifreturnMath.PI*radius*radius;

485609_27.gif    }485609_22.gif

485609_23.gifpublicdoublegetCircumference(intradius )...{

485609_18.gifreturnMath.PI*radius*2;

485609_27.gif    }485609_18.gif    

485609_22.gif

485609_23.gifpublicstaticvoidmain( String[] args )...{

485609_18.gif        Endpoint.publish("http://localhost:8888/WebServiceExample/circlefunctions",newCircleFunctions());

485609_27.gif    }485609_137.gif}485609_1.gif

处理的方法如下:

javac -d ./ CircleFunctions.java

wsgen hello.CircleFunctions

java hello.CircleFunctions

然后在浏览器中输入如下url,你将得到一个xml页面:

http: //localhost:8888/WebServiceExample/circlefunctions?WSDL

posted on 2007-07-22 22:44 dyerac in java... 阅读(451) 评论(0)  编辑  收藏 所属分类: 转载学习区

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/557717
推荐阅读
相关标签
  

闽ICP备14008679号