Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bạn có ứng dụng được thiết kế để gửi và nhận message. Ở tầng giữa, bạn có Axis2. Giả sử Axis đang chạy ở hai
phía client và server, tiến trình như sau:
Để phát triển các dịch vụ và ứng dụng, bạn sẽ cần bảng phân phối Standard Binary vì nó chứa tất cả file jar cần
thiết cũng như các script hữu ích để dễ dàng phát triển ứng dụng (axis2.bat, axis2.sh, axis2server.bat,
axis2server.sh, java2wsdl.bat, java2wsdl.sh, wsdl2java.bat, wsdl2java.sh, setenv.sh). Download hai phiên bản tại:
http://ws.apache.org/axis2/download/1_3/download.cgi
Cài Axis2 như một phần của trình chứa servlet tương thích J2EE:
+ Download http://apache.oregonstate.edu/ws/axis2/1_3/axis2-1.3-war.zip
+ Giải nén, bỏ file war vào webapps của Tomcat: C:\Program Files\Apache Software Foundation\Tomcat
6.0\webapps
+ http://127.0.0.1:8989/axis2/ (username/passwd là admin/axis2)
II .Ứng dụng mẫu:
+ Cấu trúc của ứng dụng
projectname
+ src
+ org.sample.service
+ BusinessService
+ test
+ org.sample.service
+ BusinessTest
+ resources
+ META-INF
+ services.xml
build.xml
+ Tạo services.xml định nghĩa service (hoặc có thể phát sinh ra .wsdl file bằng lệnh ant generate.wsdl)
<service name="businessService" scope="application"
targetNamespace="http://service.sample.org/">
<description> Business Service </description>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<schema schemaNamespace="http://service.sample.org/xsd"/>
<parameter name="ServiceClass"> org.sample.service.BusinessService</parameter>
</service>
+ Sử dụng ant để biên dịch và phát sinh .aar file
<project name="webservice" basedir="." default="generate.service">
<property environment="env"/>
<property name="AXIS2_HOME" value="D:/Java/Library/axis2-1.3"/>
<path id="axis2.classpath">
<fileset dir="${AXIS2_HOME}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="compile.service">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.dir}/classes"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
+ Service class
PersonService.java
package org.sample.service;
import org.sample.model.Person;
+ Model class
Person.java
package org.sample.model;
+ services.xml
<serviceGroup>
<service name="SpringInit" class="org.sample.service.SpringInit">
<description> This web service initializes Spring. </description>
<parameter name="ServiceClass">
org.sample.service.SpringInit</parameter>
<parameter name="ServiceTCCL">composite</parameter>
<parameter name="load-on-startup">true</parameter>
<operation name="springInit">
<messageReceiver
class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>
</serviceGroup>
+ Client class
PersonSpringClient.java
package org.sample.client;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Person;
options.setTo(targetEPR);
serviceClient.invokeRobust(opSetPerson, opSetPersonArgs);
if (result == null) {
System.out.println("Person doesn't exist!");
return;
}
}
}
+ Project layout
+ Tạo aar file
build.xml
<project name="pojospring" basedir="." default="generate.service">
<property environment="env"/>
<property name="service-name" value="PersonSpringService"/>
<property name="dest.dir" value="target"/>
<property name="axis2.home" value="D:/Java/Library/axis2-1.3"/>
<property name="catalina-modules"
value="${env.CATALINA_HOME}/webapps/axis2/WEB-INF/services"/>
<path id="build.class.path">
<fileset dir="${axis2.home}/lib">
<include name="*.jar"/>
</fileset>
<!--add downloaded spring jars to classpath-->
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</path>
<path id="client.class.path">
<pathelement location="${dest.dir.classes}"/>
<fileset dir="${axis2.home}/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean">
<delete dir="${dest.dir}"/>
</target>
<target name="clean.libs">
<delete dir="lib"/>
</target>
<mkdir dir="${dest.dir}"/>
<mkdir dir="${dest.dir.classes}"/>
<mkdir dir="${dest.dir.classes}/META-INF"/>
<antcall target="download.jars"/>
</target>
<mkdir dir="${dest.dir}"/>
<mkdir dir="${dest.dir.classes}"/>
<mkdir dir="${dest.dir.classes}/META-INF"/>
<copy file="src/META-INF/services.xml"
tofile="${dest.dir.classes}/META-INF/services.xml" overwrite="true"/>
<copy file="src/applicationContext.xml"
tofile="${dest.dir.classes}/applicationContext.xml"
overwrite="true"/>
<jar basedir="${dest.dir.classes}"
destfile="${dest.dir}/${service-name}.aar"/>
<copy file="${dest.dir}/${service-name}.aar"
tofile="${repository.path}/services/${service-name}.aar"
overwrite="true"/>
</target>
<target name="rpc.client">
<antcall target="rpc.client.run"/>
</target>
<!--We are not shipping spring jar with the release. This target can be used to
download spring jar to run this sample.-->
<target name="checkSpringJarAvailability">
<!--if either one of jar is not available, spring_available will set to false-->
<condition property="spring_available">
<and>
<available file="lib/spring-core-1.2.8.jar"/>
<available file="lib/spring-context-1.2.8.jar"/>
<available file="lib/spring-beans-1.2.8.jar"/>
</and>
</condition>
</target>
src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-core-
1.2.8.jar"
dest="lib/spring-core-1.2.8.jar" verbose="true"/>
<get
src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-context-
1.2.8.jar"
dest="lib/spring-context-1.2.8.jar" verbose="true"/>
<get
src="http://ws.zones.apache.org/repository/org.springframework/jars/spring-beans-
1.2.8.jar"
dest="lib/spring-beans-1.2.8.jar" verbose="true"/>
</target>
</project>
Product.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.sample.model">
<class name="Product" table="PRODUCT">
<id name="productId" column="PRODUCT_ID" type="java.lang.Integer">
<generator class="increment"/>
</id>
<property name="productName" type="java.lang.String"
column="PRODUCT_NAME"/>
<property name="description" type="java.lang.String" column="DESCRIPTION"/>
<property name="weight" type="java.lang.Float" column="WEIGHT"/>
<property name="price" type="java.math.BigDecimal" column="PRICE"/>
<property name="categoryId" type="java.lang.Integer" column="CATEGORY_ID"/>
</class>
</hibernate-mapping>
Category.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.sample.model">
<class name="Category" table="CATEGORY">
<id name="categoryId" column="CATEGORY_ID" type="java.lang.Integer">
<generator class="increment"/>
</id>
<property name="categoryName" type="java.lang.String"
column="CATEGORY_NAME"/>
</class>
</hibernate-mapping>
+ Dao class
ProductDAO.java
package org.sample.dao;
import org.sample.model.Product;
CategoryDAO.java
package org.sample.dao;
import org.sample.model.Category;
ProductDAOImpl.java
package org.sample.dao.impl;
import org.sample.dao.ProductDAO;
import org.sample.model.Product;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@SuppressWarnings("unchecked")
public Product[] listAllProduct() {
Product[] products = new Product[0];
return (Product[]) getHibernateTemplate().find("from
Product").toArray(products);
}
CategoryDAOImpl.java
package org.sample.dao.impl;
import java.util.List;
import org.sample.dao.CategoryDAO;
import org.sample.model.Category;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@SuppressWarnings("unchecked")
public Category[] getAllCategories() {
List list = getHibernateTemplate().find("from Category");
Category[] categories = (Category[]) list.toArray();
return categories;
}
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/product_management</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<bean id="hibernateInterceptor"
class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="productServiceTarget"
class="org.sample.service.impl.ProductServiceImpl">
<property name="productDao">
<ref local="productDao"/>
</property>
</bean>
<bean id="productService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="productServiceTarget"/>
</property>
<property name="proxyInterfaces">
<value> org.sample.service.ProductService </value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
<bean id="categoryServiceTarget"
class="org.sample.service.impl.CategoryServiceImpl">
<property name="categoryDao">
<ref local="categoryDao"/>
</property>
</bean>
<bean id="categoryService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="categoryServiceTarget"/>
</property>
<property name="proxyInterfaces">
<value> org.sample.service.CategoryService </value>
</property>
<property name="interceptorNames">
<list>
<value>hibernateInterceptor</value>
</list>
</property>
</bean>
</beans>
+ services.xml
<serviceGroup>
<service name="SpringInit" class="org.sample.service.SpringInit">
<description> This web service initializes Spring. </description>
<parameter name="ServiceClass">
org.sample.service.SpringInit</parameter>
<parameter name="ServiceTCCL">composite</parameter>
<parameter name="load-on-startup">true</parameter>
<operation name="springInit">
<messageReceiver
class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>
<service name="productService">
<parameter name="ServiceClass">
org.sample.service.impl.ProductServiceImpl</parameter>
<parameter name="ServiceObjectSupplier">
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<parameter name="SpringBeanName">productService</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
</service>
<service name="categoryService">
<parameter name="ServiceClass">
org.sample.service.impl.CategoryServiceImpl</parameter>
<parameter name="ServiceObjectSupplier">
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<parameter name="SpringBeanName">categoryService</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
</service>
</serviceGroup>
+ Client class
CreateProductSpringClient.java
UpdateProductSpringClient.java
package org.sample.client;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Category;
// get products
QName opGetCategory = new QName("http://impl.service.sample.org",
"getCategory");
// update Product
EndpointReference targetEPR1 = new EndpointReference(
"http://127.0.0.1:8989/axis2/services/categoryService");
options.setTo(targetEPR1);
cat.setCategoryName("Games");
serviceClient.invokeRobust(opGetCategory1, opGetCategoryArgs1);
System.out.println("xong roi");
}
}
DeleteProductSpringClient.java
ListProductSpringClient.java
package org.sample.client;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.sample.model.Product;
options.setTo(targetEPR);
// get products
QName opGetProduct = new QName("http://impl.service.sample.org",
"listAllProduct");
+ Library
cglib.jar
common-collection.jar
ehcache.jar
dom4j.jar
jta.jar
hibernate3.jar
mysql-connector.jar
antlr-2.7.5H3.jar
Chú ý: copy tất cả thư mục con của thư mục classes trong thư mục target vào C:\Program Files\Apache Software
Foundation\Tomcat 6.0\webapps\axis2\WEB-INF\classes
Tip
+ Lỗi java.lang.IllegalStateException: No valid ObjectCreator found <= thiếu stax-1.2.0.jar file
+ Có thể sử dụng eclipse plugin để phát sinh WSDL file: http://ws.apache.org/axis2/tools/index.html
+ SOAP: nghi thức trao đổi thông tin qua HTTP, SOAP message là XML message
+ JAX-WS là kỹ thuật để xây dựng web service và client giao tiếp qua XML
+ JAX-RPC cung cấp mô hình để phát triển ứng dụng dựa vào SOAP. Lập trình JAX-RPC đơn giản kỹ thuật chạy
nghi thức SOAP và cung cấp ánh xạ services giữa Java và WSDL
+ WSDL: file mô tả web service
+ Sử dụng tool java2wsdl để phát sinh wsdl file: java2wsdl -cp . -cn org.sample.service.BusinessService -of
BusinessService.wsdl
+ POJO nhấn mạnh đối tượng là đối tượng Java bình thường (hông phải Enterprise JavaBean, nó không cài đặt, kế
thừa bất kỳ lớp nào hoặc chứa annotation) để thiết kế đơn giản hơn, tốt hơn. JavaBean là một POJO có tính chất
serializable (cho phép truy cập các thuộc tính private của các đối tượng persistent), có phương thức khởi tạo không
tham số, cho phép truy cập các thuộc tính bằng phương thức getter và setter.
(Spring POJO: http://www.onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html)