Spring WS - เซิร์ฟเวอร์การเขียน
ในบทนี้เราจะเข้าใจวิธีการสร้างเว็บแอปพลิเคชันเซิร์ฟเวอร์โดยใช้ Spring WS
ขั้นตอน | คำอธิบาย |
---|---|
1 | สร้างโปรเจ็กต์ด้วยชื่อ countryService ภายใต้แพ็คเกจ com.tutorialspoint ตามที่อธิบายไว้ในบท Spring WS - First Application |
2 | สร้าง countries.xsd คลาสโดเมน CountryRepository และ CountryEndPoint ตามที่อธิบายไว้ในขั้นตอนต่อไปนี้ |
3 | อัพเดต spring-ws-servlet.xml ภายใต้โฟลเดอร์ย่อย / WEB-INF |
4 | ขั้นตอนสุดท้ายคือการสร้างเนื้อหาสำหรับซอร์สและไฟล์คอนฟิกูเรชันทั้งหมดและเอ็กซ์พอร์ตแอปพลิเคชันตามที่อธิบายด้านล่าง |
countries.xsd
<xs:schema xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:tns = "http://tutorialspoint/schemas"
targetNamespace = "http://tutorialspoint/schemas"
elementFormDefault = "qualified">
<xs:element name = "getCountryRequest">
<xs:complexType>
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name = "getCountryResponse">
<xs:complexType>
<xs:sequence>
<xs:element name = "country" type = "tns:country"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name = "country">
<xs:sequence>
<xs:element name = "name" type = "xs:string"/>
<xs:element name = "population" type = "xs:int"/>
<xs:element name = "capital" type = "xs:string"/>
<xs:element name = "currency" type = "tns:currency"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name = "currency">
<xs:restriction base = "xs:string">
<xs:enumeration value = "GBP"/>
<xs:enumeration value = "USD"/>
<xs:enumeration value = "INR"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
สร้างโครงการ
ให้เราเปิดคอนโซลคำสั่งไปที่ไดเร็กทอรี C: \ MVN และดำเนินการต่อไปนี้ mvn คำสั่ง
C:\MVN>mvn archetype:generate -DarchetypeGroupId = org.springframework.ws
-DarchetypeArtifactId = spring-ws-archetype -DgroupId = com.tutorialspoint
-DartifactId = countryService
Maven จะเริ่มประมวลผลและจะสร้าง Java Application Project Structure ที่สมบูรณ์
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] Using property: groupId = com.tutorialspoint
[INFO] Using property: artifactId = countryService
Define value for property 'version': 1.0-SNAPSHOT: :
[INFO] Using property: package = com.tutorialspoint
Confirm properties configuration:
groupId: com.tutorialspoint
artifactId: countryService
version: 1.0-SNAPSHOT
package: com.tutorialspoint
Y: :
[INFO] -------------------------------------------------------------------------
---
[INFO] Using following parameters for creating project from Old (1.x) Archetype:
spring-ws-archetype:2.0.0-M1
[INFO] -------------------------------------------------------------------------
---
[INFO] Parameter: groupId, Value: com.tutorialspoint
[INFO] Parameter: packageName, Value: com.tutorialspoint
[INFO] Parameter: package, Value: com.tutorialspoint
[INFO] Parameter: artifactId, Value: countryService
[INFO] Parameter: basedir, Value: C:\mvn
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\mvn\countryService
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 35.989 s
[INFO] Finished at: 2017-01-21T11:18:31+05:30
[INFO] Final Memory: 17M/178M
[INFO] ------------------------------------------------------------------------
ตอนนี้ไปที่ไดเรกทอรี C: / MVN เราจะเห็นโปรเจ็กต์แอปพลิเคชัน java ที่สร้างขึ้นชื่อ countryService (ตามที่ระบุใน artifactId) อัปเดต pom.xml
pom.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint.hr</groupId>
<artifactId>countryService</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>countryService Spring-WS Application</name>
<url>http://www.springframework.org/spring-ws</url>
<build>
<finalName>countryService</finalName>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.4.0.RELEASE</version>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
</project>
สร้างคลาสโดเมน
คัดลอก countries.xsd ในโฟลเดอร์ C: \ mvn \ countryService \ src \ main \ resources ให้เราเปิดคอนโซลคำสั่งไปที่ไดเร็กทอรี C: \ mvn \ countryService \ src \ main \ resources และดำเนินการต่อไปนี้xjc คำสั่งเพื่อสร้างคลาสโดเมนโดยใช้ countries.xsd
C:\MVN\countryService\src\main\resources>xjc -p com.tutorialspoint countries.xsd
Maven จะเริ่มประมวลผลและจะสร้างคลาสโดเมนในแพ็คเกจ com.tutorialspoint
parsing a schema...
compiling a schema...
com\tutorialspoint\Country.java
com\tutorialspoint\Currency.java
com\tutorialspoint\GetCountryRequest.java
com\tutorialspoint\GetCountryResponse.java
com\tutorialspoint\ObjectFactory.java
com\tutorialspoint\package-info.java
สร้างโฟลเดอร์ java ในโฟลเดอร์ C: \ mvn \ countryService \ src \ main คัดลอกคลาสทั้งหมดในโฟลเดอร์ C: \ mvn \ countryService \ src \ main \ java สร้าง CountryRepository และ CountryEndPoint เพื่อแสดงฐานข้อมูลประเทศและเซิร์ฟเวอร์ของประเทศตามลำดับ
CountryRepository.java
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.propertyeditors.CurrencyEditor;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@Component
public class CountryRepository {
private static final List<Country> countries = new ArrayList<Country>();
public CountryRepository(){
initData();
}
public void initData() {
Country us = new Country();
us.setName("United States");
us.setCapital("Washington");
us.setCurrency(Currency.USD);
us.setPopulation(46704314);
countries.add(us);
Country india = new Country();
india.setName("India");
india.setCapital("New Delhi");
india.setCurrency(Currency.INR);
india.setPopulation(138186860);
countries.add(india);
Country uk = new Country();
uk.setName("United Kingdom");
uk.setCapital("London");
uk.setCurrency(Currency.GBP);
uk.setPopulation(63705000);
countries.add(uk);
}
public Country findCountry(String name) {
Assert.notNull(name);
Country result = null;
for (Country country : countries) {
if (name.trim().equals(country.getName())) {
result = country;
}
}
return result;
}
}
CountryEndPoint.java
package com.tutorialspoint.ws;
import org.jdom.JDOMException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import com.tutorialspoint.Country;
import com.tutorialspoint.CountryRepository;
import com.tutorialspoint.GetCountryRequest;
import com.tutorialspoint.GetCountryResponse;
@Endpoint
public class CountryEndPoint {
private static final String NAMESPACE_URI = "http://tutorialspoint/schemas";
private CountryRepository countryRepository;
@Autowired
public CountryEndPoint(CountryRepository countryRepository) throws JDOMException {
this.countryRepository = countryRepository;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getCountryRequest")
@ResponsePayload
public GetCountryResponse getCountry(@RequestPayload GetCountryRequest request)
throws JDOMException {
Country country = countryRepository.findCountry(request.getName());
GetCountryResponse response = new GetCountryResponse();
response.setCountry(country);
return response;
}
}
/WEB-INF/spring-ws-servlet.xml
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:sws = "http://www.springframework.org/schema/web-services"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/web-services
http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint"/>
<sws:annotation-driven/>
<sws:dynamic-wsdl id="countries"
portTypeName = "CountriesPort"
locationUri = "/countryService/"
targetNamespace = "http://tutorialspoint.com/definitions">
<sws:xsd location = "/WEB-INF/countries.xsd"/>
</sws:dynamic-wsdl>
</beans>
/WEB-INF/web.xml
<web-app xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version = "2.4">
<display-name>TutorialsPoint Country Service</display-name>
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet
</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
สร้างโครงการ
ให้เราเปิดคอนโซลคำสั่ง ไปที่ไดเร็กทอรี C: \ MVN \ countryService และดำเนินการดังต่อไปนี้mvn คำสั่ง
C:\MVN\countryService>mvn clean package
Maven จะเริ่มสร้างโครงการ
INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building countryService Spring-WS Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ countryService ---
[INFO] Deleting C:\mvn\countryService\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ countrySer
vice ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ countryService
---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e.
build is platform dependent!
[INFO] Compiling 4 source files to C:\mvn\countryService\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co
untryService ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\mvn\countryService\src\test\resour
ces
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ country
Service ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ countryService ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:2.2:war (default-war) @ countryService ---
[INFO] Packaging webapp
[INFO] Assembling webapp [countryService] in [C:\mvn\countryService\target\count
ryService]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\mvn\countryService\src\main\webapp]
[INFO] Webapp assembled in [5137 msecs]
[INFO] Building war: C:\mvn\countryService\target\countryService.war
[INFO] WEB-INF\web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16.484 s
[INFO] Finished at: 2017-01-28T09:07:59+05:30
[INFO] Final Memory: 19M/170M
[INFO] ------------------------------------------------------------------------
เรียกใช้โครงการ
เมื่อเราสร้างซอร์สและไฟล์คอนฟิกแล้วให้ส่งออกไฟล์ countryService.war ในโฟลเดอร์ webapps ของ Tomcat
ตอนนี้เริ่มเซิร์ฟเวอร์ Tomcat และตรวจสอบว่าเราสามารถเข้าถึงหน้าเว็บอื่น ๆ จากโฟลเดอร์ webapps โดยใช้เบราว์เซอร์มาตรฐานได้หรือไม่ สร้างคำร้องขอ POST ไปยัง URL - http: // localhost: 8080 / countryService / และโดยใช้ไคลเอนต์ SOAP ใด ๆ ทำการร้องขอต่อไปนี้
<x:Envelope xmlns:x = "http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns = "http://tutorialspoint/schemas">
<x:Header/>
<x:Body>
<tns:getCountryRequest>
<tns:name>United States</tns:name>
</tns:getCountryRequest>
</x:Body>
</x:Envelope>
คุณจะเห็นผลลัพธ์ต่อไปนี้
<SOAP-ENV:Envelope xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:getCountryResponse xmlns:ns2 = "http://tutorialspoint/schemas">
<ns2:country>
<ns2:name>United States</ns2:name>
<ns2:population>46704314</ns2:population>
<ns2:capital>Washington</ns2:capital>
<ns2:currency>USD</ns2:currency>
</ns2:country>
</ns2:getCountryResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>