用心爱你,努力工作。
#
之前的例子比较简单,打算了解一下Spring的基本用法。Spring的依赖注入有三种实现方式,常用是setter和construct方式。对于像数组和集合对象注入,注入前必须填充一些对象到集合中,然后再把集合注入到Bean,采用setter方式来完成。 通过一个例子来说明。 导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包) 包下载地址: http://www.ziddu.com/download/3555993/Spring.rar.html (1)创建ObjectSet类 package com.set;
public class ObjectSet { private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return name; } } (2)创建SomeBean类 package com.set;
import java.util.List; import java.util.Map;
public class SomeBean { private String[] someStrArray; private ObjectSet[] someObjArray; private List someList; private Map someMap; public SomeBean() {} public List getSomeList() { return someList; } public void setSomeList(List someList) { this.someList = someList; } public Map getSomeMap() { return someMap; } public void setSomeMap(Map someMap) { this.someMap = someMap; } public ObjectSet[] getSomeObjArray() { return someObjArray; } public void setSomeObjArray(ObjectSet[] someObjArray) { this.someObjArray = someObjArray; } public String[] getSomeStrArray() { return someStrArray; } public void setSomeStrArray(String[] someStrArray) { this.someStrArray = someStrArray; } } (3)在类路径下,创建set-config.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="first_object" class="com.set.ObjectSet" > <property name="name"> <value>ducklyl</value> </property> </bean> <bean id="second_object" class="com.set.ObjectSet" > <property name="name"> <value>wangsp</value> </property> </bean>
<bean id="someBean" class="com.set.SomeBean" > <property name="someStrArray"> <list> <value>Hello</value> <value>Welcome</value> </list> </property> <property name="someObjArray"> <list> <ref bean="first_object"/> <ref bean="second_object"/> </list> </property> <property name="someList"> <list> <value>ListTest</value> <ref bean="first_object"/> <ref bean="second_object"/> </list> </property> <property name="someMap"> <map> <entry key="first"> <value>Hello,ducklyl!</value> </entry> <entry key="second"> <ref bean="first_object"/> </entry> </map> </property> </bean> </beans> (4)创建测试类SpringTest
package com.set;
import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import java.util.*;
public class SpringTest { public static void main(String[] args) { //读取配置文件 ApplicationContext context=new FileSystemXmlApplicationContext("set-config.xml"); //获取id="setBean"对象 SomeBean someBean=(SomeBean)context.getBean("someBean"); //获取someStrArray,someObjArray String[] strs=someBean.getSomeStrArray(); ObjectSet[] some=someBean.getSomeObjArray(); for(int i=0;i<strs.length;i++) System.out.println(strs[i]+","+some[i]); //获取someList List someList=(List)someBean.getSomeList(); for(int i=0;i<someList.size();i++) System.out.println(someList.get(i)); //获取someMap Map someMap=someBean.getSomeMap(); System.out.println(someMap); } }
如果以上配置正确,运行测试程序,结果如下: Hello,ducklyl Welcome,wangsp ListTest ducklyl wangsp {first=Hello,ducklyl!, second=ducklyl}
package example;
public interface Basic { public String hello(); //与服务端的hello方法对应 } (2)服务端实现类
public class BasicService implements Basic { private String _greeting = "Hello,ducklyl!";
public void setGreeting(String greeting) { _greeting = greeting; }
public String hello() { return _greeting; } }
import com.caucho.hessian.client.HessianProxyFactory; /** * <p>Title: hessian实现远程调用</p> * <p>Copyright: Copyright (c) 2007</p> * @author ducklyl * @version 1.0 */ public class BasicClient { public static void main(String []args) throws Exception { String url = "http://127.0.0.1:8080/Hessian/ducklyl"; //创建factory实例 HessianProxyFactory factory = new HessianProxyFactory(); //客户端需实现Basic接口 Basic basic = (Basic) factory.create(Basic.class, url);
System.out.println("Hessian: " + basic.hello()); } }
(4) web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>ducklyl</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>example.BasicService</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>example.Basic</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ducklyl</servlet-name> <url-pattern>/ducklyl</url-pattern> </servlet-mapping> </web-app>
运行客户端程序BasicClient ,如果以下配置没问题,输出结果为:
计划用一个月时间来学习Spring,在这里把自己的学习过程记录下来,方便想学习Spring的人,也为自己日后复习有个参考。以下通过一个简单的例子来先了解下Spring的用法。 (1)创建一个java工程,建立如下类:HelloBean
package com.ducklyl;
public class HelloBean { private String helloWord;
public String getHelloWord() { return helloWord; }
public void setHelloWord(String helloWord) { this.helloWord = helloWord; }
}
(2)创建Spring配置文件:beans-config.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans> <bean id="helloBean" class="com.ducklyl.HelloBean"> <property name="helloWord"> <value>Hello,ducklyl!</value> </property> </bean>
</beans> (3)导入Spring所需的包:commons-logging.jar,spring.jar 。(日志包和Spring包) 包下载地址: http://www.ziddu.com/download/3555993/Spring.rar.html (4)创建测试类:SpringDemo.java
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.*;
public class SpringDemo{ public static void main(String[] args) { //读取配置文件 Resource rs=new FileSystemResource("beans-config.xml"); //实例化Bean工厂 BeanFactory factory=new XmlBeanFactory(rs); //获取id="helloBean"对象 HelloBean hello=(HelloBean)factory.getBean("helloBean"); //调用helloBean对象getHelloWord()方法 System.out.println(hello.getHelloWord()); }
} 如果以上配置正确的话,运行SpringDemo.java,可以看到输出结果:Hello,ducklyl!
在这篇文章中,我不打算只肤浅的解释SOAP技术的定义,我们假设读者熟悉JAVA语言,Web技术,具有XML语言,XML Namespaces,XML Schema的基础。在这种情况下,理解本文将不存在任何困难。然而,即使没有这些知识,你也不必担心,我们将尽可能的解释得简单,但是当你开始做自己的SOAP应用程序时会遇到一些问题和麻烦。因此,花费一定时间来学习上面的知识是很有必要的。
从技术的角度来说,有必要提一下我们的调试环境。我们使用的是Windows XP操作系统,安装有JAVA 2 SDK 1.4.1,Apache SOAP 2.3.1,JAF 1.0.2,JAVAMAIL 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 JSP/Servlet容器中正常运行。所有的软件都是免费自由软件,因此你能够很容易的下载它们并自己在任何你喜欢的平台如Windows或UNIX上安装它们。Java SDK,JAF和JAVAMAIL位于SUN的官方网站(http://java.sun.com),其他的软件在Jakarta项目组的官方网站(http://jakarta.apache.org)上有down的。
可能你在看到我们需要这么多不同的包(package)时已经有点担心和不安了,但是实际上你不应该担心这些的。一旦你懂了基础,那么对你将相当容易。安装不是一件很难的事情,你只需要在设置环境变量的时候仔细些,比如CATALINA_HOME, CLASSPATH, JAVA_HOME 等等,所有这些步骤都是手工的。由于我仅仅是想将你的注意力再次集中到它们身上,所以你能很快的就完成以上配置过程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat文件中:
SOAP意思是简单对象访问协议(Simple Object Access Protocol)。的确如它的名字一样,SOAP是很简单的。它是一个基于XML的协议,允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台,它不依赖程序语言,它是简单的,弹性的,很容易扩展的。目前,应用程序能够彼此使用一种基于DCOM和CORBA技术的远程过程调用(RPC)来进行相互通讯,但HTTP不被设计为这个目的。RPC在Internet上应用是非常困难的,它们会出现许多兼容性和安全性的问题,因为防火墙和代理服务器通常都会阻断(block)这些类型的流量。应用程序之间最好的通讯方式是通过HTTP协议,因为HTTP是支持所有Internet浏览器和服务器的。基于这个目的,SOAP协议被创建出来。 那么,它们是如何运作的呢?比如,一个应用程序(A)需要和另一个应用程序(B)在SOAP的帮助下进行彼此通讯。它们将使用下面的框架图来完成这个过程:
这个SOAP信封(SOAP envelope)是一个包含以下内容的XML文档:
正如你看到的,它是非常简单的。它看起来确实就象一个普通的信封或者你的email。你想看看它们是如何动作的吗?下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己的“Hello World”应用程序的,但是因为我们要保持它的简单性,我会给你一个它运作方式的框架图(scheme)。
我们的“Hello World”范例会包含一个SOAP Service。我们的SOAP Client将发送它们的名字到该SOAP Service,并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin的工具,以至重定位所有请求的SOAP(Proxy) RPC Router能够知道它们应该使用哪种服务来运作。总而言之,这个是以下面的方式来运作的:
现在,我们来一步步的看看到底发生了什么。在Step 1里,HelloWorldClient将连接一个SOAP RPC Router,请求我们的SOAP Service并将包含我们名字的一个字符串传递给它。该SOAP RPC Router会检查是否它已经部署了这个SOAP Service。如果它被发现是被部署的,那么它将传递数据到这个SOAP Service并调用特定的方法,这个是Step 2。然后SOAP Service方法会被执行,将返回某个字符串值(该值就是SOAP Client的答复或者响应)(Step 3)。在Step4中,SOAP RPC Router将仅仅只是重定向这个数据到SOAP Client。所有在Step1和Step4里传输的数据是通过SOAP Envelope来完成的。正如你所看到的,算法是相当简单的,因此我们只准备关心实际的代码。
首先,我们要创建一个SOAP Service。下面是它的代码,请不要忘记将它放入HelloWorld/ 目录中(必须被包含在你的CLASSPATH中):
一些注释:ID是我们要从SOAP Client标识我们的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java类的名字。
现在,点击Deploy 按钮,那么你的服务会被部署。再次强调,请注意正确设置CLASSPATH环境变量。然后,你的HelloWorld.SOAPService类能够被找到,并且所有必需的jar包也能被找到。这是个几乎每个人都会犯的普通错误。现在,你能够点击 List ,将会看见你的服务已经被部署进来。恭喜!
最后,让我们来创建一个SOAP Client。代码看起来有点复杂,但是在现实中不会只有这么点长。
用以下方式编译这个SOAP Client:
javac HelloWorldClient.java
为了圆满完成它,让我们检查一下针对我们的测试,是否所有事情都准备就绪。Tomcat正在运行,所有的环境变量都正确,SOAP Service被编译和部署,SOAP Client被成功编译。OK,让我们运行它,你将看到这个屏幕:
正如你所看到的,我们的SOAP Client使用SOAP协议成功发送它的名字和接收了一个答复。正如前面所说的,SOAP Service发送和接收的是SOAP envelope。这个是SOAP envelope的源代码。
被发送到SOAP Service的SOAP Envelope
我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单的,有趣的,强大的,弹性的。它被用在许多Web应用中,这些应用的数量也在不断增加。学习SOAP是值得的,至少你要知道它是什么和它是怎么运作的。
Powered by: BlogJava Copyright © 王生生