<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>huangtut</title>
    <description></description>
    <link>http://huangtut.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>转：Strus常见错误及原因分析 </title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/148021" style="color:red;">http://huangtut.javaeye.com/blog/148021</a>&nbsp;
          发表时间: 2007年12月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本篇文章包含了在用Struts开发web应用时经常碰到的一些异常和错误，根据异常或错误信息本身，经常可以找到潜在的错误发生原因。<br /><br />下面列出了一些Struts的常见错误和异常，并给出了一些可能发生此类错误或异常的原因。有的后面有相关连接，你可以通过它找到更多的信息。<br /><br />Cannot retrieve mapping for action <br /> <br />异常 <br /> javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login （/Login是你的action名字） <br /> <br />  <br />   <br /> <br />可能原因 <br /> action没有再struts-config.xml 中定义，或没有找到匹配的action，例如在JSP文件中使用 &lt;html:form action="Login.do".将表单提交给Login.do处理，如果出现上述异常，请查看struts-config.xml中的定义部分，有时可能是打错了字符或者是某些不符合规则，可以使用struts console工具来检查。 <br /> <br /><br /><br /> <br /><br />Cannot retrieve definition for form bean null <br /> <br />异常 <br /> org.apache.jasper.JasperException: Cannot retrieve definition for form bean null <br /> <br />可能原因       <br />        <br /> 这个异常是因为Struts根据struts-config.xml中的mapping没有找到action期望的form bean。大部分的情况可能是因为在form-bean中设置的name属性和action中设置的name属性不匹配所致。换句话说，action和form都应该各自有一个name属性，并且要精确匹配，包括大小写。这个错误当没有name属性和action关联时也会发生，如果没有在action中指定name属性，那么就没有name属性和action相关联。当然当action制作某些控制时，譬如根据参数值跳转到相应的jsp页面，而不是处理表单数据，这是就不用name属性，这也是action的使用方法之一。 <br /> <br /><br /><br /> <br /><br />No action instance for path /xxxx could be created <br /> <br />异常 <br /> No action instance for path /xxxx could be created <br /> <br />可能原因 <br /> 特别提示：因为有很多中情况会导致这个错误的发生，所以推荐大家调高你的web服务器的日志/调试级别，这样可以从更多的信息中看到潜在的、在试图创建action类时发生的错误，这个action类你已经在struts-config.xml中设置了关联（即添加了&lt;action>标签）。 <br /> <br />在struts-config.xml中通过action标签的class属性指定的action类不能被找到有很多种原因，例如： <br /><br />定位编译后的.class文件失败。Failure to place compiled .class file for the action in the classpath (在web开发中，class的的位置在r WEB-INF/classes，所以你的action class必须要在这个目录下。例如你的action类位于WEB-INF/classes/action/Login.class,那么在struts-config.xml中设置action的属性type时就是action.Login). <br />拼写错误，这个也时有发生，并且不易找到，特别注意第一个字母的大小写和包的名称。 <br /> <br />在struts-config.xml中指定的action类没有继承自Stuts的Action类，或者你自定义的Action类没有继承自Struts提供的Action类。 <br /><br />你的action类必须继承自Struts提供的Action类。 <br /> <br />你的classpath的问题。例如web server没有发现你的资源文件，资源文件必须在WEB-INF/classes/目录下。 <br /> <br />Problem in struts-config.xml file with action mapping. <br /> <br />Problem with data-sources.xml file. <br /> <br />相关链接 <br /> http://www.mail-archive.com/struts-user@jakarta.apache.org/msg65874.html <br />Action Mapping mistake in struts-config.xml:<br />http://www.manning.com/ao/readforum.html?forum=siaao&readthread=177 <br />data-sources.xml file?:<br />http://www.caucho.com/quercus/faq/section.xtp?section_id=30 <br /> <br /><br /><br /> <br /><br />No getter method for property XXXX of bean org.apache.struts.taglib.html.BEAN <br /> <br />异常 <br /> javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN <br /> <br />可能原因 <br /> 没有位form bean中的某个变量定义getter 方法 <br /> <br />这个错误主要发生在表单提交的FormBean中，用struts标记&lt;html:text property=”username”>时，在FormBean中必须有一个getUsername()方法。注意字母“U”。 <br /> <br />Related Links <br /> Case can trip up the matching between get method's name and name specified in Struts tag<br />http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=58&t=000163 <br /> <br /><br /><br /> <br /><br />java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm <br /> <br />错误 <br /> java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm <br /> <br />可能原因 <br /> 这个错误主要发生在在classpath中找不到相应的Java .class文件。如果这个错误发生在web应用程序的运行时，主要是因为指定的class文件不在web server的classpath中（/WEB-INF/classes 和 /WEB-INF/lib）。 <br /><br />在上面的错误中，原因是找不到ActionForm类。 <br /> <br />This error is sometimes seen when one or more ActionForm.class instances are actually in the classpath. This most often occurs when ActionForm.class is made available correctly by placing struts.jar in the /WEB-INF/lib directory. When this library has been correctly placed and it is verified that ActionForm.class actually is present in the struts.jar file, the problem is either that more than one copy of ActionForm.class is in the classpath or (more likely) that duplicate versions of class files other than ActionForm are in the same classpath, causing confusion. This is especially true if a class that extends ActionForm is made available twice, such as in an .ear file that encompasses a .war file as well as in the .war file's own classpath (/WEB-INF/classes). This problem can be resolved by guaranteeing that there are no redundant classes, especially those related to Struts (directly from Struts or extensions of Struts), in the web application's view. <br /> <br />相关连接 <br /> EJB and Web Shared Links:<br />http://forum.java.sun.com/thread.jsp?forum=26&thread=413060&tstart=0&trange=15 <br />Keep Action and ActionForm (and their children) as non-overlapping unit(s) of an application<br />http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47466.html<br />http://www.mail-archive.com/struts-user@jakarta.apache.org/msg47467.html <br /> <br /><br /><br /> <br /><br />Exception creating bean of class org.apache.struts.action.ActionForm: {1} <br /> <br />异常 <br /> javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1} <br /> <br />可能原因 <br /> Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This might occur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this class for the form-bean. <br /> <br />Not associating an ActionForm-descended class with an action can also lead to this error. <br /> <br />Related Links <br />   <br /> <br /><br /><br /> <br /><br />Cannot find ActionMappings or ActionFormBeans collection <br /> <br />Exception <br /> javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection <br /> <br />可能原因 <br /> 不是标识Struts actionServlet的&lt;servlet>标记就是映射.do扩展名的&lt;sevlet-mapping>标记或者两者都没有在web.xml中声明。 <br /> <br />在struts-config.xml中的打字或者拼写错误也可导致这个异常的发生。例如缺少一个标记的关闭符号/>。最好使用struts console工具检查一下。 <br /> <br />另外，load-on-startup必须在web.xml中声明，这要么是一个空标记，要么指定一个数值，这个数值用来表servlet运行的优先级，数值越大优先级越低。 <br /> <br />还有一个和使用load-on-startup有关的是使用Struts预编译JSP文件时也可能导致这个异常。 <br /> <br />相关链接 <br /> Explicitly Define &lt;load-on-startup><br />http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=50&t=001055<br />http://threebit.net/tutorials/ejb/general/ <br /> <br /><br /><br /> <br /><br />NullPointerException at ... RequestUtils.forwardURL <br /> <br />异常 <br /> java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223) <br /> <br />可能原因 <br /> 在struts-config.xml中的forward元素缺少path属性。例如应该是如下形式：<br />&lt;forward name="userhome" path="/user/userhome.jsp"/> <br /> <br /><br /><br /> <br /><br />Cannot find bean org.apache.struts.taglib.html.BEAN in any scope <br /> <br />Exception <br /> javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope <br /> <br />  <br />   <br /> <br />Probable Causes <br /> 试图在Struts的form标记外使用form的子元素。这常常发生在你在&lt;/html:form>后面使用Struts的html标记。<br /><br />另外要注意可能你不经意使用的无主体的标记，如&lt;html:form … />，这样web 服务器解析时就当作一个无主体的标记，随后使用的所有&lt;html>标记都被认为是在这个标记之外的，如又使用了&lt;html:text property=”id”><br /><br />还有就是在使用taglib引入HTML标记库时，你使用的prefix的值不是html。 <br /> <br />相关连接 <br /> Using form subelements outside of a form tag<br />http://forum.java.sun.com/thread.jsp?thread=337537&forum=4&message=1384153 <br /> <br /><br /><br /> <br /><br />Missing message for key xx.xx.xx <br /> <br />Exception <br /> javax.servlet.jsp.JspException: Missing message for key xx.xx.xx <br /> <br />Probable Causes <br /> 这个key的值对没有在资源文件ApplicationResources.properties中定义。如果你使用eclipse时经常碰到这样的情况，当项目重新编译时，eclipse会自动将classes目录下的资源文件删除。 <br /> <br />资源文件ApplicationResources.properties 不在classpath中 应将资源文件放到 WEB-INF/classes 目录下，当然要在struts-config.xml中定义) <br /> <br /><br /><br /> <br /><br />Cannot find message resources under key org.apache.struts.action.MESSAGE <br /> <br />异常 <br /> Cannot find message resources under key org.apache.struts.action.MESSAGE <br /> <br />可能原因 <br /> 很显然，这个错误是发生在使用资源文件时，而Struts没有找到资源文件。 <br /> <br />Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifying the options in its body -- this assumes options are specified in ApplicationResources.properties file) <br /> <br />XML parser issues -- too many, too few, incorrect/incompatible versions <br /> <br />Related Links <br /> Provide Struts with Resource Bundle<br />http://threebit.net/tutorials/ejb/general/ <br />XML Parser Issues<br />http://www.mail-archive.com/struts-user@jakarta.apache.org/msg15779.html <br /> <br /><br /><br /> <br /><br />No input attribute for mapping path /loginAction <br /> <br />错误 <br /> No input attribute for mapping path /xxxxAction <br /> <br />可能原因e <br /> No input attribute in action mapping in struts-config.xml file for the action with the name specified in the error message. An input attribute is not required if form validation is not performed (either because the validate attribute is set to false or because the validation method in the relevant form class is not implemented. The input attribute specifies the page leading to this action because that page is used to display error messages from the form validation. <br /> <br />Related Links <br />   <br /> <br /><br /><br /> <br /><br />Strange Output Characters <br /> <br />错误 <br /> Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet. <br /> <br />可能原因 <br /> 混和使用Struts的html:form标记和标准的HTML标记不正确。 <br /> <br />使用的编码样式在本页中不支持。 <br /> <br /><br /><br /> <br /><br />"Document contained no data" or no data rendered on page <br /> <br />错误 <br /> "Document contained no data" in Netscape <br /> <br />No data rendered (completely empty) page in Microsoft Internet Explorer <br /> <br />可能原因 <br /> 使用一个Action的派生类而没有实现perform()方法或execute()方法。在Struts1.0中实现的是perform()方法，在Struts1.1中实现的是execute()方法，但Struts1.1向后兼容perform()方法。<br /><br />但你使用Struts1.1创建一个Action的派生类，并且实现了execute()方法，而你在Struts1.0中运行的话，就会得到"Document contained no data" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的错误信息。 <br /> <br /><br /><br />原文地址：http://www.blogjava.net/soochow_hhb/archive/2005/06/11/5905.html
          <br/>
          <span style="color:red;">
            <a href="http://huangtut.javaeye.com/blog/148021#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Dec 2007 10:10:13 +0800</pubDate>
        <link>http://huangtut.javaeye.com/blog/148021</link>
        <guid>http://huangtut.javaeye.com/blog/148021</guid>
      </item>
      <item>
        <title>转：axis 开发 web service 实战</title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/121667" style="color:red;">http://huangtut.javaeye.com/blog/121667</a>&nbsp;
          发表时间: 2007年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td>
            <table cellspacing="0" border="0" bgcolor="#ffffff" width="100%" cellpadding="0">
                <tbody>
                    <tr>
                        <td class="title1" height="40" align="center" colspan="3" bgcolor="#eeeeee" width="100%"><strong>axis&nbsp;开发&nbsp;web&nbsp;service&nbsp;实战</strong></td>
                    </tr>
                    <tr>
                        <td align="center" bgcolor="#eeeeee" width="100%"><a href="mailto:lianghyan@hotmail.com">lianghyan</a> 原创&nbsp;&nbsp;&nbsp;更新：2005-06-24 15:29:51&nbsp;&nbsp;版本: 1.0 &nbsp;&nbsp; </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <!-- end of article title -->
        <tr>
            <td align="center" valign="top" width="100%"><!--start of article content -->
            <table class="rtable" border="0" width="98%">
                <tbody>
                    <tr>
                        <td class="text" align="left" width="100%"><br />
                        一、axis安装<br />
                        1.环境<br />
                        &nbsp;&nbsp;J2SE&nbsp;SDK&nbsp;1.3&nbsp;or&nbsp;1.4:&nbsp;&nbsp;我使用&nbsp;1.4.2<br />
                        &nbsp;&nbsp;&nbsp;Servlet&nbsp;Container:&nbsp;我使用Tomcat&nbsp;5.0&nbsp;<br />
                        2.到&nbsp;<a href="http://ws.apache.org/axis/">http://ws.apache.org/axis/</a>网站下载axis安装包<br />
                        3.解压缩安装包，将AXIS_UNZIP_PATH\axis-version\webapps下的axis包拷贝到TOMCAT_HOME\webapps\下，<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;以下约定AXIS_HOME为该TOMCAT_HOME\webapps\axis目录<br />
                        4.启动tomcat,访问<a href="http://localhost:8080/axis">http://localhost:8080/axis</a>&nbsp;检查安装是否成功<br />
                        5.以上步骤执行成功，可以开发webservice例子了<br />
                        <br />
                        axis支持三种web&nbsp;service的部署和开发，分别为：<br />
                        1。Dynamic&nbsp;Invocation&nbsp;Interface&nbsp;(&nbsp;DII)<br />
                        2。&nbsp;Stubs方式<br />
                        3。Dynamic&nbsp;Proxy方式<br />
                        <br />
                        以下逐一讲述web&nbsp;service在axis上的部署和开发，设置classpath<br />
                        set&nbsp;CLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;E:/thirdparty/activation/activation.jar;E:/thirdparty/activation/mail.jar<br />
                        <br />
                        <br />
                        <br />
                        二、编写DII(Dynamic&nbsp;Invocation&nbsp;Interface&nbsp;)方式web服务<br />
                        1.编写服务端程序HelloClient<br />
                        public&nbsp;class&nbsp;HelloClient&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getName(String&nbsp;name)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;hello&nbsp;&quot;+name;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        <br />
                        2.将源码拷贝到AXIS_HOME下，重命名为&nbsp;HelloClient.jws<br />
                        3.访问连接<a href="http://localhost:8080/axis/HelloClient.jws?wsdl">http://localhost:8080/axis/HelloClient.jws?wsdl</a>，页面显示axis自动生成的wsdl<br />
                        4.编写访问服务的客户端&nbsp;TestHelloClient.java<br />
                        <br />
                        import&nbsp;org.apache.axis.client.Call;<br />
                        import&nbsp;org.apache.axis.client.Service;<br />
                        import&nbsp;javax.xml.namespace.QName;<br />
                        import&nbsp;javax.xml.rpc.ServiceException;<br />
                        import&nbsp;java.net.MalformedURLException;<br />
                        import&nbsp;java.rmi.RemoteException;<br />
                        <br />
                        public&nbsp;class&nbsp;SayHelloClient2&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;=&nbsp;&quot;http://localhost:8080/axis/HelloClient.jws&quot;;<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;service&nbsp;=&nbsp;new&nbsp;Service();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;call&nbsp;=&nbsp;null;<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;=&nbsp;(Call)&nbsp;service.createCall();<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(new&nbsp;QName(<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;http://localhost:8080/axis/HelloClient.jws&quot;,&nbsp;&quot;getName&quot;));<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(new&nbsp;java.net.URL(endpoint));<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ret&nbsp;=&nbsp;(String)&nbsp;call.invoke(new&nbsp;Object[]&nbsp;{&quot;zhangsan&quot;});<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;return&nbsp;value&nbsp;is&nbsp;&quot;&nbsp;+&nbsp;ret);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        三、编写Dynamic&nbsp;Proxy方式访问服务<br />
                        1.编写部署服务端程序，同上边DII方式，本次仍使用上边部署的HelloClient<br />
                        2.编写代理接口<br />
                        public&nbsp;interface&nbsp;HelloClientInterface&nbsp;extends&nbsp;java.rmi.Remote&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getName(String&nbsp;name)&nbsp;throws&nbsp;java.rmi.RemoteException;<br />
                        }<br />
                        3.编写并执行客户端程序TestHelloClient.java<br />
                        <br />
                        import&nbsp;javax.xml.rpc.Service;<br />
                        import&nbsp;javax.xml.rpc.ServiceFactory;<br />
                        import&nbsp;java.net.URL;<br />
                        import&nbsp;javax.xml.namespace.QName;<br />
                        <br />
                        public&nbsp;class&nbsp;TestHelloClient&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;wsdlUrl&nbsp;=&nbsp;&quot;http://localhost:8080/axis/HelloClient.jws?wsdl&quot;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;nameSpaceUri&nbsp;=&nbsp;&quot;http://localhost:8080/axis/HelloClient.jws&quot;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;serviceName&nbsp;=&nbsp;&quot;HelloClientService&quot;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;portName&nbsp;=&nbsp;&quot;HelloClient&quot;;<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceFactory&nbsp;serviceFactory&nbsp;=&nbsp;ServiceFactory.newInstance();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;afService&nbsp;=&nbsp;serviceFactory.createService(new&nbsp;URL(wsdlUrl),<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;QName(nameSpaceUri,&nbsp;serviceName));<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloClientInterface&nbsp;proxy&nbsp;=&nbsp;(HelloClientInterface)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afService.getPort(new&nbsp;QName(<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameSpaceUri,&nbsp;portName),&nbsp;HelloClientInterface.class);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;return&nbsp;value&nbsp;is&nbsp;&quot;+proxy.getName(&quot;john&quot;)&nbsp;)&nbsp;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;ex)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace()&nbsp;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        <br />
                        四、编写wsdd发布web服务，编写stub&nbsp;client访问web服务<br />
                        <br />
                        1.编写服务端程序server,SayHello.java，编译server.SayHello.java&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        package&nbsp;server;<br />
                        public&nbsp;class&nbsp;SayHello&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getName(String&nbsp;name)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;hello&nbsp;&quot;+name;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        2.编写LogHandler.java<br />
                        import&nbsp;org.apache.axis.AxisFault;<br />
                        import&nbsp;org.apache.axis.Handler;<br />
                        import&nbsp;org.apache.axis.MessageContext;<br />
                        import&nbsp;org.apache.axis.handlers.BasicHandler;<br />
                        <br />
                        import&nbsp;java.util.Date;<br />
                        <br />
                        public&nbsp;class&nbsp;LogHandler&nbsp;extends&nbsp;BasicHandler&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;invoke(MessageContext&nbsp;msgContext)&nbsp;throws&nbsp;AxisFault<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;Log&nbsp;an&nbsp;access&nbsp;each&nbsp;time&nbsp;we&nbsp;get&nbsp;invoked.<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Handler&nbsp;serviceHandler&nbsp;=&nbsp;msgContext.getService();<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;numAccesses&nbsp;=<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Integer)serviceHandler.getOption(&quot;accesses&quot;);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(numAccesses&nbsp;==&nbsp;null)<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numAccesses&nbsp;=&nbsp;new&nbsp;Integer(0);<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numAccesses&nbsp;=&nbsp;new&nbsp;Integer(numAccesses.intValue()&nbsp;+&nbsp;1);<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;=&nbsp;new&nbsp;Date();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;date&nbsp;+&nbsp;&quot;:&nbsp;service&nbsp;&quot;&nbsp;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msgContext.getTargetService()&nbsp;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;accessed&nbsp;&quot;&nbsp;+&nbsp;numAccesses&nbsp;+&nbsp;&quot;&nbsp;time(s).&quot;;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serviceHandler.setOption(&quot;accesses&quot;,&nbsp;numAccesses);<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;AxisFault.makeFault(e);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        3..编写wsdd文件<br />
                        deploy.wsdd<br />
                        &lt;deployment&nbsp;xmlns=&quot;http://xml.apache.org/axis/wsdd/&quot;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:java=&quot;http://xml.apache.org/axis/wsdd/providers/java&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&lt;handler&nbsp;name=&quot;print&quot;&nbsp;type=&quot;java:LogHandler&quot;/&gt;&nbsp;<br />
                        &nbsp;&lt;service&nbsp;name=&quot;sayhello&quot;&nbsp;provider=&quot;java:RPC&quot;&gt;<br />
                        &nbsp;&nbsp;&nbsp;&lt;requestFlow&gt;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;handler&nbsp;type=&quot;print&quot;/&gt;<br />
                        &nbsp;&nbsp;&nbsp;&lt;/requestFlow&gt;<br />
                        &nbsp;&nbsp;&lt;parameter&nbsp;name=&quot;className&quot;&nbsp;value=&quot;server.SayHello&quot;/&gt;<br />
                        &nbsp;&nbsp;&lt;parameter&nbsp;name=&quot;allowedMethods&quot;&nbsp;value=&quot;*&quot;/&gt;&nbsp;&nbsp;<br />
                        &nbsp;&lt;/service&gt;<br />
                        &lt;/deployment&gt;<br />
                        <br />
                        3.将编译后的文件拷贝到AXIS_HOME/WEB-INF/classes下，如：D:\tomcat\webapps\axis\WEB-INF\classes<br />
                        4.发布服务：<br />
                        java&nbsp;org.apache.axis.client.AdminClient&nbsp;deploy.wsdd<br />
                        5.生成client&nbsp;stub文件<br />
                        &nbsp;&nbsp;&nbsp;a:方式1<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将SayHello.java拷贝到AXIS_HOME/下，重命名为SayHello.jws，执行下面的命令生存client&nbsp;stub<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java&nbsp;org.apache.axis.wsdl.WSDL2Java&nbsp;&nbsp;-p&nbsp;client&nbsp;&nbsp;http://localhost:8080/axis/services/SayHello.jws?wsdl<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;b:方式2<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;执行如下命令生成SayHello.wsdl<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java&nbsp;org.apache.axis.wsdl.Java2WSDL&nbsp;-oSayHello.wsdl&nbsp;-lhttp://localhost:8080/axis/services/SayHello&nbsp;-nsayhello&nbsp;server.SayHello<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行如下命令生成client&nbsp;stub<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java&nbsp;org.apache.axis.wsdl.WSDL2Java&nbsp;&nbsp;SayHello.wsdl&nbsp;&nbsp;-p&nbsp;client<br />
                        &nbsp;&nbsp;&nbsp;生成的stub&nbsp;client文件列表为：<br />
                        &nbsp;&nbsp;&nbsp;1。SayHello.java<br />
                        &nbsp;&nbsp;&nbsp;2。SayHelloService.java。<br />
                        &nbsp;&nbsp;&nbsp;3。SayHelloServiceLocator.java<br />
                        &nbsp;&nbsp;&nbsp;4。SayHelloSoapBindingStub.java<br />
                        6.编写客户端程序，编译并执行<br />
                        public&nbsp;class&nbsp;SayHelloClient&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHelloService&nbsp;service&nbsp;=&nbsp;new&nbsp;client.<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SayHelloServiceLocator();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.SayHello_PortType&nbsp;client&nbsp;=&nbsp;service.getSayHello();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;retValue=client.getName(&quot;zhangsan&quot;);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(retValue);<br />
                        <br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;Execution&nbsp;failed.&nbsp;Exception:&nbsp;&quot;&nbsp;+&nbsp;e);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;}<br />
                        }<br />
                        <br />
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://huangtut.javaeye.com/blog/121667#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Sep 2007 15:37:44 +0800</pubDate>
        <link>http://huangtut.javaeye.com/blog/121667</link>
        <guid>http://huangtut.javaeye.com/blog/121667</guid>
      </item>
      <item>
        <title>转：webService 调用方法</title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/121628" style="color:red;">http://huangtut.javaeye.com/blog/121628</a>&nbsp;
          发表时间: 2007年09月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          调用webservice，可以首先根据wsdl文件生成客户端，或者直接根据地址调用，下面讨论直接调用地址的两种不同方式：axis和Soap，soap方式主要是用在websphere下<br />
<br />
axis方式调用：<br />
<br />
<br />
import java.util.Date;<br />
<br />
import java.text.DateFormat;<br />
<br />
import org.apache.axis.client.Call;<br />
<br />
import org.apache.axis.client.Service;<br />
<br />
import javax.xml.namespace.QName;<br />
<br />
import java.lang.Integer;<br />
<br />
import javax.xml.rpc.ParameterMode;<br />
<br />
<br />
public class caClient {<br />
<br />
<br />
<br />
public static void main(String[] args) {<br />
<br />
<br />
try {<br />
<br />
String endpoint = &quot;http://localhost:8080/ca3/services/caSynrochnized?wsdl&quot;;<br />
<br />
Service service = new Service();<br />
<br />
Call call = (Call) service.createCall();<br />
<br />
call.setTargetEndpointAddress(endpoint);<br />
<br />
call.setOperationName(&quot;addUser&quot;);<br />
<br />
call.addParameter(&quot;userName&quot;, org.apache.axis.encoding.XMLType.XSD_DATE,<br />
<br />
javax.xml.rpc.ParameterMode.IN);<br />
<br />
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);<br />
<br />
call.setUseSOAPAction(true);<br />
<br />
call.setSOAPActionURI(&quot;http://www.my.com/Rpc&quot;);<br />
<br />
//Integer k = (Integer) call.invoke(new Object[] { i, j });<br />
<br />
//System.out.println(&quot;result is &quot; + k.toString() + &quot;.&quot;);<br />
<br />
String temp = &quot;测试人员&quot;;<br />
<br />
String result = (String)call.invoke(new Object[]{temp});<br />
<br />
System.out.println(&quot;result is &quot;+result);<br />
<br />
}<br />
<br />
catch (Exception e) {<br />
<br />
System.err.println(e.toString());<br />
<br />
}<br />
<br />
}<br />
<br />
}<br />
soap方式调用<br />
<div style="BACKGROUND-COLOR: rgb(255,255,153); TEXT-ALIGN: center">
<h2>调用java生成的webservice</h2>
</div>
<br />
import org.apache.soap.util.xml.*;<br />
<br />
import org.apache.soap.*;<br />
<br />
import org.apache.soap.rpc.*;<br />
<br />
<br />
import java.io.*;<br />
<br />
import java.net.*;<br />
<br />
import java.util.Vector;<br />
<br />
<br />
public class caService{<br />
<br />
public static String getService(String user) {<br />
<br />
URL url = null;<br />
<br />
try {<br />
<br />
url=new URL(&quot;http://192.168.0.100:8080/ca3/services/caSynrochnized&quot;);<br />
<br />
} catch (MalformedURLException mue) {<br />
<br />
return mue.getMessage();<br />
<br />
}<br />
<br />
// This is the main SOAP object<br />
<br />
Call soapCall = new Call();<br />
<br />
// Use SOAP encoding<br />
<br />
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);<br />
<br />
// This is the remote object we're asking for the price<br />
<br />
soapCall.setTargetObjectURI(&quot;urn:xmethods-caSynrochnized&quot;);<br />
<br />
// This is the name of the method on the above object<br />
<br />
soapCall.setMethodName(&quot;getUser&quot;);<br />
<br />
// We need to send the ISBN number as an input parameter to the method<br />
<br />
Vector soapParams = new Vector();<br />
<br />
<br />
// name, type, value, encoding style<br />
<br />
Parameter isbnParam = new Parameter(&quot;userName&quot;, String.class, user, null);<br />
<br />
soapParams.addElement(isbnParam);<br />
<br />
soapCall.setParams(soapParams);<br />
<br />
try {<br />
<br />
// Invoke the remote method on the object<br />
<br />
Response soapResponse = soapCall.invoke(url,&quot;&quot;);<br />
<br />
// Check to see if there is an error, return &quot;N/A&quot;<br />
<br />
if (soapResponse.generatedFault()) {<br />
<br />
Fault fault = soapResponse.getFault();<br />
<br />
String f = fault.getFaultString();<br />
<br />
return f;<br />
<br />
} else {<br />
<br />
// read result<br />
<br />
Parameter soapResult = soapResponse.getReturnValue ();<br />
<br />
// get a string from the result<br />
<br />
return soapResult.getValue().toString();<br />
<br />
}<br />
<br />
} catch (SOAPException se) {<br />
<br />
return se.getMessage();<br />
<br />
}<br />
<br />
}<br />
<br />
}<br />
<br />
返回一维数组时<br />
<br />
Parameter soapResult = soapResponse.getReturnValue();<br />
<br />
String[] temp = (String[])soapResult.getValue();<br />
<br />
<div style="BACKGROUND-COLOR: rgb(255,255,153); TEXT-ALIGN: center">
<h2>调用ASP.Net生成的webservice</h2>
</div>
<br />
private String HelloWorld(String uri, String u) {<br />
<br />
try {<br />
<br />
SOAPMappingRegistry smr = new SOAPMappingRegistry();<br />
<br />
StringDeserializer sd = new StringDeserializer();<br />
<br />
ArraySerializer arraySer = new ArraySerializer();<br />
<br />
BeanSerializer beanSer = new BeanSerializer();<br />
<br />
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(<br />
<br />
&quot;http://tempuri.org/&quot;, &quot;HelloWorldResult&quot;), String.class,<br />
<br />
null, sd);<br />
<br />
smr.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(<br />
<br />
&quot;http://tempuri.org/&quot;, &quot;temp&quot;), String.class,<br />
<br />
beanSer, beanSer);<br />
<br />
<br />
URL url = new URL(uri);<br />
<br />
Call call = new Call();<br />
<br />
call.setSOAPMappingRegistry(smr);<br />
<br />
call.setTargetObjectURI(&quot;urn:xmethods-Service1&quot;);<br />
<br />
call.setMethodName(&quot;HelloWorld&quot;);<br />
<br />
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);<br />
<br />
<br />
Vector soapParams = new Vector();<br />
<br />
soapParams.addElement(new Parameter(&quot;temp&quot;, String.class, u, null));<br />
<br />
call.setParams(soapParams);<br />
<br />
<br />
Response soapResponse = call.invoke(url,&quot;http://tempuri.org/HelloWorld&quot;);<br />
<br />
<br />
if (soapResponse.generatedFault()) {<br />
<br />
Fault fault = soapResponse.getFault();<br />
<br />
System.out.println(fault);<br />
<br />
} else {<br />
<br />
Parameter soapResult = soapResponse.getReturnValue();<br />
<br />
Object obj = soapResult.getValue();<br />
<br />
System.out.println(&quot;===&quot; + obj);<br />
<br />
}<br />
<br />
} catch (Exception e) {<br />
<br />
e.printStackTrace();<br />
<br />
}<br />
<br />
return null;<br />
} <br />
          <br/>
          <span style="color:red;">
            <a href="http://huangtut.javaeye.com/blog/121628#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Sep 2007 15:10:00 +0800</pubDate>
        <link>http://huangtut.javaeye.com/blog/121628</link>
        <guid>http://huangtut.javaeye.com/blog/121628</guid>
      </item>
      <item>
        <title>转：JDK5.0 新特性--泛型</title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/105400" style="color:red;">http://huangtut.javaeye.com/blog/105400</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="FONT-SIZE: 12pt">JDK1.5 </span><span style="FONT-SIZE: 12pt">令我们期待很久</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">可是当他发布的时候却更换版本号为</span><span style="FONT-SIZE: 12pt">5.0</span><span style="FONT-SIZE: 12pt">。这说明</span><span style="FONT-SIZE: 12pt">Java</span><span style="FONT-SIZE: 12pt">已经有大幅度的变化。本文将讲解</span><span style="FONT-SIZE: 12pt">JDK5.0</span><span style="FONT-SIZE: 12pt">支持的新功能</span><span style="FONT-SIZE: 12pt">-----Java</span><span style="FONT-SIZE: 12pt">的泛型</span><span style="FONT-SIZE: 12pt">. <br />
</span><span style="FONT-SIZE: 12pt">目录</span> </p>
<p><font size="3">1. 介绍</font><br />
<strong><span style="FONT-SIZE: 12pt">2. </span></strong><strong><span style="FONT-SIZE: 12pt">定义简单</span></strong><strong><span style="FONT-SIZE: 12pt">Java</span></strong><strong><span style="FONT-SIZE: 12pt">泛型</span></strong><br />
<strong><span style="FONT-SIZE: 12pt">3. </span></strong><strong><span style="FONT-SIZE: 12pt">泛型通配符</span></strong><br />
<font size="3">&nbsp;&nbsp;&nbsp; &nbsp;</font><span style="FONT-SIZE: 12pt; COLOR: black">3.1</span><span style="FONT-SIZE: 12pt; COLOR: black">有限制的通配符</span><br />
<strong><span style="FONT-SIZE: 12pt">4.</span></strong><strong><span style="FONT-SIZE: 12pt">泛型与数据类型转换</span></strong><br />
<span><font size="3">&nbsp;&nbsp; </font></span><span style="FONT-SIZE: 12pt">4.1.</span><span style="FONT-SIZE: 12pt">消除类型转换</span><span style="FONT-SIZE: 12pt"><br />
</span><font size="3"><span>&nbsp;&nbsp; 4.2 </span>自动解包装与自动包装的功能</font><br />
<font size="3"><span>&nbsp;&nbsp; 4.3 </span><font size="3">限制泛型中类型参数的范围</font><br />
<strong><span style="FONT-SIZE: 12pt">5.</span></strong><strong><span style="FONT-SIZE: 12pt">泛型方法</span></strong><br />
<font size="3">6. </font><font size="3">和遗留代码的交互</font><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 6.1 </font><font size="3">在泛型代码中使用遗留代码</font><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 6.2 </font><font size="3">檫除和转换</font><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 6.3 </font><font size="3">在遗留代码中使用泛型</font><br />
<font size="3">7 </font><font size="3">完美的打印</font><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 7.1 </font><font size="3">泛型类被所有的它的调用所共享</font><br />
<font size="3">&nbsp;&nbsp;&nbsp; &nbsp;7.2 </font><font size="3">转型和</font><font size="3">InstanceOf<br />
&nbsp;&nbsp;&nbsp;&nbsp; 7.3 数组</font><br />
<font size="3">8 </font><font size="3">在运行时类型拖肯的类的表面</font><br />
<font size="3">9 </font><font size="3">非常有趣的通配符</font><br />
<font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 9.1 </font><font size="3">通配符捕捉</font><br />
<font size="3">10 </font><font size="3">使用泛型转换遗留代码</font> </font></p>
<p style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt"></span><font size="3"><strong>1. </strong><strong>介绍</strong></font><br />
<span style="FONT-SIZE: 12pt"><br />
<strong>2.</strong></span><font size="3"><strong>定义简单</strong><strong><span style="FONT-SIZE: 12pt">Java</span></strong></font><strong><span style="FONT-SIZE: 12pt">泛型</span></strong><span style="FONT-SIZE: 12pt"><br />
<br />
</span><span style="FONT-SIZE: 12pt">　其实</span><span style="FONT-SIZE: 12pt">Java</span><span style="FONT-SIZE: 12pt">的泛型就是创建一个用类型作为参数的类。就象我们写类的方法一样，方法是这样的</span><span style="FONT-SIZE: 12pt">method(String str1,String str2 ),</span><span style="FONT-SIZE: 12pt">方法中参数</span><span style="FONT-SIZE: 12pt">str1</span><span style="FONT-SIZE: 12pt">、</span><span style="FONT-SIZE: 12pt">str2</span><span style="FONT-SIZE: 12pt">的值是可变的。而泛型也是一样的，这样写</span><span style="FONT-SIZE: 12pt">class Java_Generics</span><span style="FONT-SIZE: 12pt">，这里边的</span><span style="FONT-SIZE: 12pt">K</span><span style="FONT-SIZE: 12pt">和</span><span style="FONT-SIZE: 12pt">V</span><span style="FONT-SIZE: 12pt">就象方法中的参数</span><span style="FONT-SIZE: 12pt">str1</span><span style="FONT-SIZE: 12pt">和</span><span style="FONT-SIZE: 12pt">str2,</span><span style="FONT-SIZE: 12pt">也是可变。下面看看例子：</span><span style="FONT-SIZE: 12pt"> <br />
<br />
</span></p>
<div></div>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt"><br />
import Java.util.Hashtable; <br />
class TestGen0{ <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> public Hashtable h=new Hashtable(); <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> public void put(K k, V v) { <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> h.put(k,v); <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> } <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> public V get(K k) { <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> return h.get(k); <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> } <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> public static void main(String args[]){ <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> TestGen0 t=new TestGen0(); <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> t.put(&quot;key&quot;, &quot;value&quot;); <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> String s=t.get(&quot;key&quot;); <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> System.out.println(s); <br />
</span><span style="FONT-SIZE: 12pt">　</span><span style="FONT-SIZE: 12pt"> } <br />
} </span></p>
</div>
<p style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">正确输出</span><span style="FONT-SIZE: 12pt">:value <br />
<br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">这只是个例子，不过看看是不是创建一个用类型作为参数的类，参数是</span><span style="FONT-SIZE: 12pt">K</span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt">V</span><span style="FONT-SIZE: 12pt">，传入的</span><span style="FONT-SIZE: 12pt">&ldquo;</span><span style="FONT-SIZE: 12pt">值</span><span style="FONT-SIZE: 12pt">&rdquo;</span><span style="FONT-SIZE: 12pt">是</span><span style="FONT-SIZE: 12pt">String</span><span style="FONT-SIZE: 12pt">类型。这个类他没有特定的待处理型别，以前我们定义好了一个类，在输入参数有所固定，是什么型别的有要求，但是现在编写程序，完全可以不制定参数的类型，具体用的时候来确定，增加了程序的通用性，像是一个模板。</span><span style="FONT-SIZE: 12pt"><br />
<br />
<strong>3. </strong></span><strong><span style="FONT-SIZE: 12pt">泛型通配符</span></strong><span style="FONT-SIZE: 12pt"><br />
</span><span style="FONT-SIZE: 12pt">首先，下面是一个例子，作用是打印出一个集合中的所有元素，我们首先用老版本</span><span style="FONT-SIZE: 12pt">jdk1.4</span><span style="FONT-SIZE: 12pt">的编码规则，代码如下：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">void printColleciton(Collection c){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; TEXT-INDENT: 24pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">iterator i = c.iterator(); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; TEXT-INDENT: 24pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">for (k = 0; k &lt; c.size();k++){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; TEXT-INDENT: 24pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">System.out.pritnln(i.next(); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">} </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">然后，我们用</span><span style="FONT-SIZE: 12pt">jdk5.0</span><span style="FONT-SIZE: 12pt">泛型来重写上面这段代码（循环的语法是新版本的语法）：</span> </p>
<font face="Arial">
<p><br />
&nbsp;void printCollection(Colleciton&lt; Object &gt; c) {</p>
<p>&nbsp;&nbsp;for (Object e : c) {</p>
<p>&nbsp;&nbsp;&nbsp;System.out.print(e);</p>
<p>&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p><span style="FONT-SIZE: 12pt">这个新版本并不比老版本的好多少，老版本可以用任意一种集合类型作为参数来调用，而新版本仅仅持有</span><span style="FONT-SIZE: 12pt">Collection&lt; Object &gt;</span><span style="FONT-SIZE: 12pt">类型，</span><span style="FONT-SIZE: 12pt">Colleciton&lt;&nbsp; Object&nbsp; &gt;</span><span style="FONT-SIZE: 12pt">并不是任意类型的</span><span style="FONT-SIZE: 12pt">Collection</span><span style="FONT-SIZE: 12pt">的超类。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt">那么什么是所有</span><span style="FONT-SIZE: 12pt">Colleciton</span><span style="FONT-SIZE: 12pt">类型的超类型呢？它是</span><span style="FONT-SIZE: 12pt">Collection&lt; ?&gt; </span><span style="FONT-SIZE: 12pt">这样一个类型，读作</span><span style="FONT-SIZE: 12pt">&ldquo;</span><span style="FONT-SIZE: 12pt">未知</span><span style="FONT-SIZE: 12pt">Colleciton&rdquo;</span><span style="FONT-SIZE: 12pt">。它的意思是说</span><span style="FONT-SIZE: 12pt">Colleciton</span><span style="FONT-SIZE: 12pt">的元素类型可以匹配任意类型，我们把它称作通配符类型，我们这样写：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; void printCollection(Colleciton c){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Object e: c){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
</div>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 12pt">现在我们用任意类型的集合来调用它了，需要注意的是内部方法</span><span style="FONT-SIZE: 12pt">printColleciton(),</span><span style="FONT-SIZE: 12pt">我们任可以从</span><span style="FONT-SIZE: 12pt">c</span><span style="FONT-SIZE: 12pt">中来读出元素，并且这些元素是</span><span style="FONT-SIZE: 12pt">Object</span><span style="FONT-SIZE: 12pt">类型，而且是安全的，因为无论集合中是什么类型，它总包括</span><span style="FONT-SIZE: 12pt">Object</span><span style="FONT-SIZE: 12pt">，但是将任意对象加到集合中是不安全的：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp; &nbsp;Colleciton c = new ArrayList<string></string>(); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp; c.add(new Object());//</span><span style="FONT-SIZE: 12pt">编译时错误</span> </p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt">由于我们不知道</span><span style="FONT-SIZE: 12pt">c</span><span style="FONT-SIZE: 12pt">持有的是什么类型的元素，我们不能加</span><span style="FONT-SIZE: 12pt">object</span><span style="FONT-SIZE: 12pt">到集合中去。</span><span style="FONT-SIZE: 12pt">add()</span><span style="FONT-SIZE: 12pt">方法用类型</span><span style="FONT-SIZE: 12pt">E</span><span style="FONT-SIZE: 12pt">作为参数，（集合的元素类型）当真正的参数类型是？的时候，它代表的是一些未知类型。任何传递给</span><span style="FONT-SIZE: 12pt">add()</span><span style="FONT-SIZE: 12pt">方法的参数必须是这个未知类型的子类型。由于我们不知道未知类型，所以我们传递给它任何东西。主要的例外是</span><span style="FONT-SIZE: 12pt">null,</span><span style="FONT-SIZE: 12pt">它是每一个类型的成员。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt">另一方面，假定给一个</span><span style="FONT-SIZE: 12pt">List</span><span style="FONT-SIZE: 12pt">，我们调用</span><span style="FONT-SIZE: 12pt">get()</span><span style="FONT-SIZE: 12pt">并且充分利用结果。结果类型是未知类型。但是我总是知道它是一个</span><span style="FONT-SIZE: 12pt">Object</span><span style="FONT-SIZE: 12pt">，因此分配一个从</span><span style="FONT-SIZE: 12pt">get()</span><span style="FONT-SIZE: 12pt">取出来的结果到一个</span><span style="FONT-SIZE: 12pt">object</span><span style="FONT-SIZE: 12pt">的变量是安全的，或者作为一个参数传递到一个需要</span><span style="FONT-SIZE: 12pt">object</span><span style="FONT-SIZE: 12pt">类型的地方。</span><span style="FONT-SIZE: 12pt"><br />
<br />
</span></p>
<p align="left" style="BACKGROUND: white"><strong><span style="FONT-SIZE: 12pt; COLOR: black">3.1</span></strong><strong><span style="FONT-SIZE: 12pt; COLOR: black">有限制的通配符</span></strong> </p>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 24pt"><span style="FONT-SIZE: 12pt; COLOR: black">考虑一个画图的应用程序，这个程序能够画长方形、圆等类型，为了在程序中表示这样的图形，你可以定义一个类型的层次结构：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public abstract class Shape{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public abstract void draw(Canvas c); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;} </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public class Circle extends Shape{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int x,y,radius; </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void draw(Canvas c){} </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">} </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public class Rectangle extends Shape{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int x,y,width,height; </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void draw(Canvas c){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; TEXT-INDENT: 60pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">} </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">} </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">//</span><span style="FONT-SIZE: 12pt; COLOR: black">这些类能被画在画布上：</span> </p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public class Canvas{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void draw(Shape s){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;s.draw(this); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">} </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
<div>&nbsp;
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 24pt"><span style="FONT-SIZE: 12pt; COLOR: black">任何画图的动作的都包含一些图形，假设他们被表示在一个list中，在Canvas中它将会有一个很方便的方法来画他们：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; public void drawAll(List<shape></shape> shapes){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;for(Shape s :shapes){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;s.draw(this); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; } </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black"><span style="FONT-SIZE: 12pt; COLOR: black">现在类型规则说，方法drawAll()只能在真正的Shape类型的List上被调用，而它的子类无法调用，例如List&lt; Circle &gt;上被调用。这是很不幸的。由于所有的方法确实从List中读出Shape，所以它仅能在List&lt; Object &gt;上被调用，下面我们改后的代码可以在任意类型的Shape上被调用：</span></span></p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black"><span style="FONT-SIZE: 12pt; COLOR: black"></span></span><span style="FONT-SIZE: 12pt; COLOR: black"></span></p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public void drawAll(List&lt; ? extends Shape&gt;{ } </span></p>
</div>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt; COLOR: black">这里有一个很小的不同是，我们已经用List<!--xtends Sha-->替换了List&lt; Object &gt;，现在drawAll()方法可以接受任意的Shape的子类了，我们当然可以在List&lt; Circle &gt;上调用。<span>&nbsp;&nbsp; </span></span></p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; <!--xtends Cla--></span><span style="FONT-SIZE: 12pt; COLOR: black">是一种限制通配符类型，它可以接受所有&lt; Class &gt;以及Class的子类型。然而调用代价是，只读访问，无法向</span><span style="FONT-SIZE: 12pt; COLOR: black">shapes</span><span style="FONT-SIZE: 12pt; COLOR: black">中添加元素</span><span style="FONT-SIZE: 12pt; COLOR: black">。像通常一样，使用通配符带来的灵活性将付出代价，例如，下面是不允许的：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; public void addRectangle(List<!--xtends Sha--> shapes){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;shapes.add(0,new Rectangle());//</span><span style="FONT-SIZE: 12pt; COLOR: black">编译时错误</span> </p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; } </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;</span><span style="FONT-SIZE: 12pt; COLOR: black">限制性通配符的一个例子是，是一个人口普查的例子，我们假设数据是由一个名字映射一个人，名字是字符串，人（可以是Person,或是它的子类Driver）,Map是一个泛型的例子，它拥有两个参数，表示为一个KEY和value的映射<span>MAP </span></span></p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">再次注意正规参数的命名规则，K代表key,V代表<span>value </span></span></p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black"><span><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;public class Census{ </span></span></span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void addRegistry(Map<string person="" extends=""></string> Registry){ } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; Map &nbsp;allDrivers =; </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; census.addResigtry(allDrivers); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;<strong><span style="FONT-SIZE: 12pt">编写泛型类要注意：</span></strong><span style="FONT-SIZE: 12pt"> <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> 1) </span><span style="FONT-SIZE: 12pt">在定义一个泛型类的时候，在</span><span style="FONT-SIZE: 12pt"> &ldquo;&lt;&gt;&rdquo;</span><span style="FONT-SIZE: 12pt">之间定义形式类型参数，例如：</span><span style="FONT-SIZE: 12pt">&ldquo;class TestGen&rdquo;</span><span style="FONT-SIZE: 12pt">，其中</span><span style="FONT-SIZE: 12pt">&ldquo;K&rdquo; , &ldquo;V&rdquo;</span><span style="FONT-SIZE: 12pt">不代表值，而是表示类型。</span><span style="FONT-SIZE: 12pt"> <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> 2) </span><span style="FONT-SIZE: 12pt">实例化泛型对象的时候，一定要在类名后面指定类型参数的值（类型），一共要有两次书写。例如：</span><span style="FONT-SIZE: 12pt"><br />
TestGen t=new TestGen()</span><span style="FONT-SIZE: 12pt">；</span><span style="FONT-SIZE: 12pt"> <br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt"> 3) </span><span style="FONT-SIZE: 12pt">泛型中</span><span style="FONT-SIZE: 12pt"><k extends="" object=""></k>,extends</span><span style="FONT-SIZE: 12pt">并不代表继承，它是类型范围限制。</span> </span></span></p>
<p align="left" style="MARGIN: 0cm 0cm 12pt"><strong><span style="FONT-SIZE: 12pt">4.</span></strong><strong><span style="FONT-SIZE: 12pt">泛型与数据类型转换</span></strong><span style="FONT-SIZE: 12pt"><br />
<strong>4.1. </strong></span><strong><span style="FONT-SIZE: 12pt">消除类型转换</span></strong><span style="FONT-SIZE: 12pt"><br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">上面的例子大家看到什么了，数据类型转换的代码不见了。在以前我们经常要书写以下代码，如：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">import Java.util.Hashtable; <br />
class Test { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public static void main(String[] args) { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> Hashtable h = new Hashtable(); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> h.put(&quot;key&quot;, &quot;value&quot;); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> String s = (String)h.get(&quot;key&quot;); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> System.out.println(s); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
} </span></p>
</div>
<p align="left" style="MARGIN: 0cm 0cm 12pt"><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">这个我们做了类型转换，是不是感觉很烦的，并且强制类型转换会带来潜在的危险，系统可能会抛一个</span><span style="FONT-SIZE: 12pt">ClassCastException</span><span style="FONT-SIZE: 12pt">异常信息。在</span><span style="FONT-SIZE: 12pt">JDK5.0</span><span style="FONT-SIZE: 12pt">中我们完全可以这么做，如：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">import Java.util.Hashtable; <br />
class Test { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public static void main(String[] args) { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> Hashtable h = new Hashtable (); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> h.put(&quot;key&quot;, new Integer(123)); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> int s = h.get(&quot;key&quot;).intValue(); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> System.out.println(s); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
} </span></p>
</div>
<p align="left" style="MARGIN: 0cm 0cm 12pt"><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">这里我们使用泛化版本的</span><span style="FONT-SIZE: 12pt">HashMap,</span><span style="FONT-SIZE: 12pt">这样就不用我们来编写类型转换的代码了，类型转换的过程交给编译器来处理，是不是很方便，而且很安全。上面是</span><span style="FONT-SIZE: 12pt">String</span><span style="FONT-SIZE: 12pt">映射到</span><span style="FONT-SIZE: 12pt">String</span><span style="FONT-SIZE: 12pt">，也可以将</span><span style="FONT-SIZE: 12pt">Integer</span><span style="FONT-SIZE: 12pt">映射为</span><span style="FONT-SIZE: 12pt">String</span><span style="FONT-SIZE: 12pt">，只要写成</span><span style="FONT-SIZE: 12pt">HashTable h=new HashTable();h.get(new Integer(0))</span><span style="FONT-SIZE: 12pt">返回</span><span style="FONT-SIZE: 12pt">value</span><span style="FONT-SIZE: 12pt">。果然很方便。</span><span style="FONT-SIZE: 12pt"> <br />
<strong>4.2 </strong><strong><span style="FONT-SIZE: 12pt">自动解包装与自动包装的功能</span></strong><span style="FONT-SIZE: 12pt"><br />
</span><span style="FONT-SIZE: 12pt">　　从上面有没有看到有点别扭啊，</span><span style="FONT-SIZE: 12pt">h.get(new Integer(123))</span><span style="FONT-SIZE: 12pt">这里的</span><span style="FONT-SIZE: 12pt">new Integer(123);</span><span style="FONT-SIZE: 12pt">好烦的，在</span><span style="FONT-SIZE: 12pt">JDK5.0</span><span style="FONT-SIZE: 12pt">之前我们只能忍着了，现在这种问题已经解决了，请看下面这个方法。我们传入一个</span><span style="FONT-SIZE: 12pt">int</span><span style="FONT-SIZE: 12pt">这一基本型别，然后再将</span><span style="FONT-SIZE: 12pt">i</span><span style="FONT-SIZE: 12pt">的值直接添加到</span><span style="FONT-SIZE: 12pt">List</span><span style="FONT-SIZE: 12pt">中，其实</span><span style="FONT-SIZE: 12pt">List</span><span style="FONT-SIZE: 12pt">是不能储存基本型别的，</span><span style="FONT-SIZE: 12pt">List</span><span style="FONT-SIZE: 12pt">中应该存储对象，这里编译器将</span><span style="FONT-SIZE: 12pt">int</span><span style="FONT-SIZE: 12pt">包装成</span><span style="FONT-SIZE: 12pt">Integer</span><span style="FONT-SIZE: 12pt">，然后添加到</span><span style="FONT-SIZE: 12pt">List</span><span style="FONT-SIZE: 12pt">中去。接着我们用</span><span style="FONT-SIZE: 12pt">List.get(0);</span><span style="FONT-SIZE: 12pt">来检索数据，并返回对象再将对象解包装成</span><span style="FONT-SIZE: 12pt">int</span><span style="FONT-SIZE: 12pt">。恩，</span><span style="FONT-SIZE: 12pt">JDK5.0</span><span style="FONT-SIZE: 12pt">给我们带来更多方便与安全。</span> </span></p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">public void autoBoxingUnboxing(int i) { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> ArrayList<integer></integer> L= new ArrayList<integer></integer>(); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> L.add(i); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> int a = L.get(0); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> System.out.println(&quot;The value of i is &quot; + a); <br />
} </span></p>
</div>
<p align="left" style="MARGIN: 0cm 0cm 12pt"><strong><span style="FONT-SIZE: 12pt">4.3 </span></strong><strong><span style="FONT-SIZE: 12pt">限制泛型中类型参数的范围</span></strong><span style="FONT-SIZE: 12pt"><br />
</span><span style="FONT-SIZE: 12pt">　　也许你已经发现在</span><span style="FONT-SIZE: 12pt">TestGen</span><span style="FONT-SIZE: 12pt">这个泛型类</span><span style="FONT-SIZE: 12pt">,</span><span style="FONT-SIZE: 12pt">其中</span><span style="FONT-SIZE: 12pt">K,V</span><span style="FONT-SIZE: 12pt">可以是任意的型别。也许你有时候呢想限定一下</span><span style="FONT-SIZE: 12pt">K</span><span style="FONT-SIZE: 12pt">和</span><span style="FONT-SIZE: 12pt">V</span><span style="FONT-SIZE: 12pt">当然范围，怎么做呢？看看如下的代码：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">class TestGen2<k number="" extends="" extents=""></k> <br />
{ <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> private V v=null; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> private K k=null; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public void setV(V v){ <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> this.v=v; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public V getV(){ <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> return this.v; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public void setK(K k){ <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> this.k=k; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public V getK(){ <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> return this.k; <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> public static void main(String[] args) <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> { <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> TestGen2 t2=new TestGen2(); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> t2.setK(new String(&quot;String&quot;)); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> t2.setV(new Integer(123)); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> System.out.println(t2.getK()); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　　</span><span style="FONT-SIZE: 12pt; COLOR: black"> System.out.println(t2.getV()); <br />
</span><span style="FONT-SIZE: 12pt; COLOR: black">　</span><span style="FONT-SIZE: 12pt; COLOR: black"> } <br />
} </span></p>
</div>
<p style="BACKGROUND: white"><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">上边</span><span style="FONT-SIZE: 12pt">K</span><span style="FONT-SIZE: 12pt">的范围是</span><span style="FONT-SIZE: 12pt">&lt;=String </span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt">V</span><span style="FONT-SIZE: 12pt">的范围是</span><span style="FONT-SIZE: 12pt">&lt;=Number</span><span style="FONT-SIZE: 12pt">，注意是</span><span style="FONT-SIZE: 12pt">&ldquo;&lt;=&rdquo;,</span><span style="FONT-SIZE: 12pt">对于</span><span style="FONT-SIZE: 12pt">K</span><span style="FONT-SIZE: 12pt">可以是</span><span style="FONT-SIZE: 12pt">String</span><span style="FONT-SIZE: 12pt">的，</span><span style="FONT-SIZE: 12pt">V</span><span style="FONT-SIZE: 12pt">当然也可以是</span><span style="FONT-SIZE: 12pt">Number</span><span style="FONT-SIZE: 12pt">，也可以是</span><span style="FONT-SIZE: 12pt">Integer,Float,Double,Byte</span><span style="FONT-SIZE: 12pt">等。看看下图也许能直观些请看上图</span><span style="FONT-SIZE: 12pt">A</span><span style="FONT-SIZE: 12pt">是上图类中的基类，</span><span style="FONT-SIZE: 12pt">A1</span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt">A2</span><span style="FONT-SIZE: 12pt">分别是</span><span style="FONT-SIZE: 12pt">A</span><span style="FONT-SIZE: 12pt">的子类，</span><span style="FONT-SIZE: 12pt">A2</span><span style="FONT-SIZE: 12pt">有</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">个子类分别是</span><span style="FONT-SIZE: 12pt">A2_1</span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt">A2_2</span><span style="FONT-SIZE: 12pt">。</span><span style="FONT-SIZE: 12pt"> <br />
<br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">然后我们定义一个受限的泛型类</span><span style="FONT-SIZE: 12pt">class MyGen<e extends="" a2=""></e>,</span><span style="FONT-SIZE: 12pt">这个泛型的范围就是上图中兰色部分。</span><span style="FONT-SIZE: 12pt"> <br />
<br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">这个是单一的限制，你也可以对型别多重限制，如下：</span><span style="FONT-SIZE: 12pt"> <br />
<br />
class C<t extends="" t="" super=""></t> &amp; Serializable&gt;<br />
</span><span style="FONT-SIZE: 12pt">　　</span><span style="FONT-SIZE: 12pt">我们来分析以下这句，</span><span style="FONT-SIZE: 12pt">T extends Comparable</span><span style="FONT-SIZE: 12pt">这个是对上限的限制，</span><span style="FONT-SIZE: 12pt">Comparable&lt; super T&gt;</span><span style="FONT-SIZE: 12pt">这个是下限的限制，</span><span style="FONT-SIZE: 12pt">Serializable</span><span style="FONT-SIZE: 12pt">是第</span><span style="FONT-SIZE: 12pt">2</span><span style="FONT-SIZE: 12pt">个上限。一个指定的类型参数可以具有一个或多个上限。具有多重限制的类型参数可以用于访问它的每个限制的方法和域。</span></p>
<p style="BACKGROUND: white"><span style="FONT-SIZE: 12pt"><strong>5.</strong><strong><span style="FONT-SIZE: 12pt; COLOR: black">泛型方法</span></strong> </span></p>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt; COLOR: black">考虑写一个持有数组类型对象和一个集合对象的方法，把数组里的所有对象都放到</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">集合里。第一个程序为：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;</span><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;static void fromArrayToColleciton(Object[]a,Collection c){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;for (Object o : a){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; c.add(o);//</span><span style="FONT-SIZE: 12pt; COLOR: black">编译时错误</span> </p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; } </span></p>
</div>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt; COLOR: black">到现在为止，你可能学会避免开始的错误而去使用Collection&lt; Object &gt;作为集合参数的类型，你可能会意识到使用Colleciton&lt; ? &gt;将不会工作。</span> </p>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt; COLOR: black">解决这个问题的方法是使用泛型方法，GENERIC METHODS，就像类型声明、方法声明一样，就是被一个或更多的类型参数参数化。</span> </p>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt">&nbsp;static <t></t>void fromArrayToCollection(T[]a,Collection<t></t> c){ </p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(T o :a){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;c.add(o);//</span><span style="FONT-SIZE: 12pt; COLOR: black">正确</span> </p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; } </span></p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">我们可以用任意类型的集合调用这个方法，他的元素类型是数组元素类型的超类型。</span> </p>
<p><font face="Arial">Object[] oa = new Object[100]; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Collection &lt; Object &gt; co = new ArrayList&lt; Object &gt;(); </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(oa,co);//T 被认为是Object类型 </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; String[] sa = new String[100]; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Colleciton&lt; String &gt; cs = new ArrayList&lt; String &gt;(); </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(sa,cs);//T被认为是String类型 </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(sa,co);//T 被认为是Object类型 </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Integer[] is = new Integer[100]; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Float[] fa = new Float[100]; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Number[] na = new Number[100]; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; Collection&lt; Number &gt; cn = new ArrayList&lt; Number &gt;();&nbsp; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(is,cn);//Number </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(fa,cn);//Number </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(na,cn);//Number </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(na,co);//Object </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; fromArrayToCollection(na,cs);//编译时错误 <br />
</font></p>
<p align="left" style="BACKGROUND: white; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt; COLOR: black">我们不必给一个泛型方法传递一个真正的类型参数,编译器会推断类型参数.一个问题出现了,什么时候使用泛型方法,什么时候使通配符类型,为了回答这些问题,我们从Colleciton库中看一下几个方法：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; interface Collection<e></e>{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public boolean containsAll(Collection c); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public boolean addAll(Collection<!--xtends--> c); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; } </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">使用泛型方法的形式为：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; interface Collection<e></e>{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public <t></t>boolean containsAll(Collection<t></t> c); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public <t extends="" e=""></t>boolean addAll(Collection<t></t> c); </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; }</span><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp; </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">无论如何，在ContainAll和addAll中，类型参数T仅被使用一次。返回类型不依赖于类型参数，也不依赖方法中的任何参数。这告诉我类型参数正被用于多态，它的影响仅仅是允许不同的实参在不同的调用点被使用。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">泛型方法允许类型参数被用于表达在一个或更多参数之间或者方法中的参数、返回类型的依赖。如果没有如此依赖，泛型方法就不能被使用。可能一前一后来联合使用泛型和通配符，这里有个例子：</span> </p>
<div style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 4pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 1pt; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 1pt solid">
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;class Collections{ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static <t></t>void copy(List<t></t> dest,List<!--xtends--> src){ </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; } </span></p>
<p align="left" style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; BACKGROUND: #cccccc; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;} </span></p>
</div>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">注意两个参数之间的依赖，任何从原list的对象复制，必须分配一个目标LIST元素的类型T,于是Src的元素类型可能是任何T的子类型。我们不必在意在COPY的表达中，表示依赖使用一个类型参数，但是是使用一个通配符。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">下面我们不使用通配符来重写上面的方法：</span> </p>
<p><font face="Arial">&nbsp; class Collections{ </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static &lt;&nbsp; T，S extends T&nbsp; &gt; </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void copy(List&lt; T &gt; dest,List&lt;&nbsp; S&nbsp; &gt; src){ </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp; } </font></p>
<p><font face="Arial">&nbsp; } </font></p>
<p><span style="FONT-SIZE: 12pt; COLOR: black">这非常好，但是第一个类型参数既在dst中使用，也在第二个类型参数中使用，S本身就被使用了一次。在类型src中,没有什么类型依赖它。这是一个标志我们可以用通配符来替换它。使用通配符比显示的声明类型参数更加清楚和精确。所以有可能推荐使用通配符。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">通配符也有优势，可以在方法之外来使用，作为字段类型、局部变量和数组。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">这里有一个例子。</span> </p>
<p align="left" style="BACKGROUND: white"><span style="FONT-SIZE: 12pt; COLOR: black">&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black">返回到我们画图的例子，假设我们要保持一个画图请求的历史，我们可以在Shape类内部用一个静态变量来保持历史。用drawAll()存储它到来的参数到历史字段。</span> </p>
<p><font face="Arial">&nbsp;static List&lt;&nbsp; List &lt; ? extends Shape &gt;&nbsp; &gt; history = </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp; new ArrayList&nbsp; &lt;&nbsp; List&nbsp; &lt;&nbsp; ? extends Shape&nbsp; &gt;&nbsp; &gt;(); </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp; public void drawAll(List<!--xtends Sha--> shapes){ </font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;history.addLast(shapes</font></p></div></font>
          <br/>
          <span style="color:red;">
            <a href="http://huangtut.javaeye.com/blog/105400#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 15:22:28 +0800</pubDate>
        <link>http://huangtut.javaeye.com/blog/105400</link>
        <guid>http://huangtut.javaeye.com/blog/105400</guid>
      </item>
      <item>
        <title>转：什么是webService?</title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/104759" style="color:red;">http://huangtut.javaeye.com/blog/104759</a>&nbsp;
          发表时间: 2007年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div align="left">
<table cellspacing="0" border="0" align="left" cellpadding="10">
    <tbody>
    </tbody>
</table>
<p>你可能早就听说过Web Service了，你也可能已经对Web Service有了一些概念，现在不管是在什么场合，谈到以后发展的新趋势，大家都会提到Web Service。世界上的顶级公司，不管是微软、IBM还是SUN，都开始把Web Service频繁地挂在嘴边。大多数媒体也开始鼓吹Web Service是多么的好，多么的有前途或者&ldquo;钱&rdquo;途&hellip;&hellip;但Web Service到底是什么呢？数据库通过网页实现服务？网络上的协议？还是一种软件的标准？</p>
<p>　　在http//www.hexiesoft.net 上你可以欣赏到.NET下使用微软开发工具建立的Web Service企业级ERP应用系统。</p>
<p>　　在http//dwdemos.alphaworks.ibm.com/HospitalProj/index.html上，你可以体验使用IBM开发工具创建的提供医疗保险信息查询的Web Service。</p>
<p>　　Web Service概念</p>
<p>　　什么是Web Service呢？从表面上看，Web Service就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。这就是说，你能够用编程的方法通过Web调用来实现某个功能的应用程序。例如，笔者创建一个Web Service，它的作用是查询某公司某员工的基本信息。它接受该员工的编号作为查询字符串，返回该员工的具体信息。你可以在浏览器的地址栏中直接输入HTTP GET请求来调用罗列该员工基本信息的ASP页面，这就可以算作是体验Web Service了。</p>
<p>　　从深层次上看，Web Service是一种新的Web应用程序分支，它们是自包含、自描述、模块化的应用，可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用。</p>
<p>　　Web Service便是基于网络的、分布式的模块化组件，它执行特定的任务，遵守具体的技术规范，这些规范使得Web Service能与其他兼容的组件进行互操作。它可以使用标准的互联网协议，像超文本传输协议HTTP和XML，将功能体现在互联网和企业内部网上。Web Service平台是一套标准，它定义了应用程序如何在Web上实现互操作性。你可以用你喜欢的任何语言(笔者用的是C#)，在你喜欢的任何平台上写Web Service。 </p>
<p>Web Service的技术支持</p>
<p>　　Web Service平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性，Web Service平台必须提供一套标准的类型系统，用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有：</p>
<p>　　1.XML和XSD</p>
<p>　　可扩展的标记语言XML是Web Service平台中表示数据的基本格式。除了易于建立和易于分析外，XML主要的优点在于它既与平台无关，又与厂商无关。XML是由万维网协会(W3C)创建，W3C制定的XML SchemaXSD定义了一套标准的数据类型，并给出了一种语言来扩展这套数据类型。</p>
<p>　　Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB.NET或C#来构造一个Web Service时，为了符合Web Service标准，所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递，还需要用某种东西将它包装起来。这种东西就是一种协议，如 SOAP。</p>
<p>　　2.SOAP</p>
<p>　　SOAP即简单对象访问协议(Simple Object Access Protocol)，它是用于交换XML编码信息的轻量级协议。它有三个主要方面：XML-envelope为描述信息内容和如何处理内容定义了框架，将程序对象编码成为XML对象的规则，执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如，你可以使用 SMTP，即因特网电子邮件协议来传递SOAP消息，这可是很有诱惑力的。在传输层之间的头是不同的，但XML有效负载保持相同。</p>
<p>　　Web Service 希望实现不同的系统之间能够用&ldquo;软件-软件对话&rdquo;的方式相互调用，打破了软件应用、网站和各种设备之间的格格不入的状态，实现&ldquo;基于Web无缝集成&rdquo;的目标。</p>
<p>　　3.WSDL</p>
<p>　　Web Service描述语言WSDL就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言，用于描述Web Service及其函数、参数和返回值。因为是基于XML的，所以WSDL既是机器可阅读的，又是人可阅读的。</p>
<p>　　4.UDDI</p>
<p>　　UDDI 的目的是为电子商务建立标准；UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范，同时也包含一组使企业能将自身提供的Web Service注册，以使别的企业能够发现的访问协议的实现标准。</p>
<p>　　5.远程过程调用RPC与消息传递</p>
<p>　　Web Service本身其实是在实现应用程序间的通信。我们现在有两种应用程序通信的方法：RPC远程过程调用和消息传递。使用RPC的时候，客户端的概念是调用服务器上的远程过程，通常方式为实例化一个远程对象并调用其方法和属性。RPC系统试图达到一种位置上的透明性：服务器暴露出远程对象的接口，而客户端就好像在本地使用的这些对象的接口一样，这样就隐藏了底层的信息，客户端也就根本不需要知道对象是在哪台机器上。</p>
<p>　Web Service软件的支持</p>
<p>　　操作系统离不开丰富的应用软件的支持。同样，Web Service这项技术只有通过日益广泛的应用才能体现出其价值，目前比较流行的实现方法是使用.NET 和 Java两种技术，并且两种实现方法可以互相操作；如今我们已经可以看到使用微软、IBM、SUN、Borland等不同厂商的Web Service构建工具建立的Web Service应用。</p>
<p>　　微软.NET</p>
<p>　　微软的.NET技术应该算是时下最为流行的Web Service 开发技术。首先因为其公司在以前相应的产品就占有相当大的市场份额，以至使新推出的.NET得以有比较稳定的用户群；其次也是更重要的是 .NET平台不仅延续了微软一贯的编程风格，而且还增加了许多支持Web 服务的关键性技术，使得.NET在操作的简单性和执行的稳定性，高效性上达到了一个非常好的结合。</p>
<p>　　微软的Visual Studio.NET便是一个便于 Web 服务的开发工具。微软的目标是，将其新编程语言&mdash;&mdash;C#作为Web Service的首选语言。虽然C#看起来与Java类似，但是还有一些Java中没有的独特的功能。.NET技术中用于Web Service 开发的主要工具是ASP.NET从技术上说，ASPasp.net 提供了一些超出ASP以前版本的优点(例如：代码和HTML的分离，与脚本语言相比较，对&ldquo;真正&rdquo;的编程语言如 C# 的支持)。</p>
<p>　　IBM的WebSphere</p>
<p>　　IBM公司是业界第一家能够提供全面支持Web服务的电子商务基础设施中间件的公司。通过多年来与W3C(The World Wide Web Consortium)的共同努力，包括DB2、Lotus、Tivoli 和WebSphere在内的所有IBM软件都实现了对SOAP、WSDL、UDDI、Linux、XML、J2EE等开放技术和标准的全面支持。　　IBM公司的WebSphere也是比较好的基础架构软件开发平台。WebSphere软件平台及开发工具包括WebSphere Studio Application Developer WSAD 基于J2EE、XML 和Web服务等开放标准，并具备 IBM 在可靠性、扩展性和安全性上的主要优势。WebSphere 是 IBM 在 Web Services策略中的核心平台，它支持所有开发、发布、部署 Web Services应用所必需的开放标准和技术，包括 UDDI，SOAP，J2EE，WSDL，和对 XML 技术集成的增强，这特使得它在全球有很多用户。</p>
<p>　　Borland的JBuilder</p>
<p>　　Borland公司在 JBuilder7中，用户可以用其Borland Web Services Kit for Java和Borland JBuilder MobileSet 3进行更快捷地开发Web Service和无线应用。这样将使开发者能够在同一个开发环境中轻松地创建和集成Web Service。今年新推出的JBuidler8更是针对Web Service开发更提供了方便和高效的方法。</p>
<p>　　总之，在Web Service开发上，.NET 和Java都是很好的选择，尽管两者现在都有一些需要完善的地方，但是就目前来说，它们还是最好的开发手段和技术。具体选择哪种开发工具，也是仁者见仁，智者见智的<a href="http://bbs.chinaemail.com.cn/" class="channel_keylink" target="_blank">问题</a>。从根本上说，这两种方法没有孰优孰劣的<a href="http://bbs.chinaemail.com.cn/" class="channel_keylink" target="_blank">问题</a>，只是根据使用者对这两种方法的掌握程度和对具体语言的偏爱程度来决定。<br />
</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://huangtut.javaeye.com/blog/104759#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jul 2007 16:22:04 +0800</pubDate>
        <link>http://huangtut.javaeye.com/blog/104759</link>
        <guid>http://huangtut.javaeye.com/blog/104759</guid>
      </item>
      <item>
        <title>转：Eclipse快捷键 Template用法探讨 </title>
        <author>huangtut</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://huangtut.javaeye.com">huangtut</a>&nbsp;
          链接：<a href="http://huangtut.javaeye.com/blog/104414" style="color:red;">http://huangtut.javaeye.com/blog/104414</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div><a href="http://www.google.com/search?hl=zh-CN&amp;q=site%3Aitutu.net%20eclipse"><u>Eclipse</u></a> Template用法探讨</div>
<div></div>
<div><font size="2">在编码的过程中，对代码重用的追求应该是我们的一个永恒的追求。我们先从相同或相似的代码里提出公用方法，来方便我们的重用；而后，随着面向对象技术的提出，我们又提出父类或基类，在类的基础上对代码进行重用；后来，我们又有了模式这种层次的代码重用，虽然模式不仅仅是为了代码重用，但这也是一个目的；最后，我们又创建了各种框架或架构，来在更高层次的重用代码；展望未来，我们会在元数据、域领域的范围内进行代码的重用。</font></div>
<div style="TEXT-INDENT: 15.4pt"><span style="FONT-SIZE: 9pt">所有这一切，仍然还不能满足我们对代码重用的要求，我们还是会遇到各种各样的代码重用上的烦恼。以下我来简单举出几个我们在编码过程中遇到的实际问题：</span></div>
<div style="TEXT-INDENT: 18pt"><span style="FONT-SIZE: 9pt">System.out.println(&hellip;&hellip;);</span></div>
<div style="TEXT-INDENT: 18pt"><span style="FONT-SIZE: 9pt">这个方法是我们在</span><span style="FONT-SIZE: 9pt">Java</span><span style="FONT-SIZE: 9pt">编程的过程中经常会用到的，用得太频繁了，本来不是很长的方法调用，在我们使用频率过高后，就会觉得非常的麻烦。为什么呢？我们每次使用这个方法，所不同的只是</span><span style="FONT-SIZE: 9pt">println</span><span style="FONT-SIZE: 9pt">方法里面的参数，但每次不得不从</span><span style="FONT-SIZE: 9pt">System</span><span style="FONT-SIZE: 9pt">到</span><span style="FONT-SIZE: 9pt">println</span><span style="FONT-SIZE: 9pt">一个一个字母的敲。</span></div>
<div style="TEXT-INDENT: 18pt"><span style="FONT-SIZE: 9pt">与之相同的情况还有：</span><span style="FONT-SIZE: 9pt">public final static String SEQUENCE_T_PRODUCT_HIST = &quot;T_PRODUCT_HIST&quot;;</span><span style="FONT-SIZE: 9pt">这是一个为常量赋值的语句，在我们的项目中，使用量也相当的大。</span></div>
<div style="TEXT-INDENT: 18pt"><span style="FONT-SIZE: 9pt">可能有人会说上面的语句比较简单，不能重用也是可以忍受的，而挖空心思去重用它们，反倒好像走了极端。如果有人这么想，那么请看看下面的例子：</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">try</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">{</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">&hellip;&hellip;</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">}</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">catch(SQLException Ex)</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">{</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt"></span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">log.error(this.getClass(), &quot;addUserRole&quot;, Ex, Ex.getMessage());</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">throw new PersistenceException(Ex);</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">}</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">Catch(Exception e)</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span style="FONT-SIZE: 9pt">{</span></div>
<div style="MARGIN: 0cm 0cm 0pt 15.4pt"><span s