webservice第二种调用方式,客户端调用。需要客户端(ws-client01),服务端(SpringMaven20180325)这里由于太长所以在服务器中对访问路径进行了改动(改为了spring),中间工程(ws-api)。中间工程要maven install打成jar包导入服务端和客户端,服务端和客户端要导入中间工程的jar包,到中间工程的pom.xml中复制其jar包信息导入即可。三个都是用的maven工程,服务端工程是直接导入的,中间工程和客户端工程是自己创建的,创建时要选中Create a simple project,然后点next,给出Group Id和Artifact Id,然后点finish。完成后更改jdk配置为默认的1.7。
中间工程要放通用的东西,这里放了一个CustomerDTO实体类和TestWebService接口,记得规范创建dto包和一个ws包,放对应的文件。
以下是CustomerDTO的代码
package dto;
/**
* 用户实体类
* @author fengzhuo
* @date 2018/11/28
*/
public class CustomerDTO {
/**
* 用户名
*/
private String uname;
/**
* 密码
*/
private String pwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "Cuntomer [uname=" + uname + ", pwd=" + pwd + "]";
}
}
这是TestWebService的代码
package ws;
import javax.jws.WebService;
import dto.CustomerDTO;
/**
* 测试所用接口
* @author fengzhuo
* @date 2018/11/28
*/
@WebService
public interface TestWebService {
/**
* @param CustomerDTO
* @return msg 欢迎信息
*/
public String sayHello(CustomerDTO customerDTO);
}
还有要创建一个配置文件wsclient.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- <bean id="clientLogInterceptor" class="com.ebiz.platform.common.api.webservice.advice.ClientLogInterceptor" /> -->
<!-- 测试 -->
<jaxws:client id="hService"
serviceClass="ws.TestWebService"
address="${wsurl}/WebService/Test?wsdl">
</jaxws:client>
</beans>
中间工程不需要其他jar包,所以pom.xml不做改动
接下来创建客户端,客户端要选package为war,完成后,要右键Deployment Descriptor然后点击Generate Deployment Descriptor Stub生成所需文件。
客户端工程的pom.xml可以复制服务端的,注意头部自动生成的信息要保留,内容如下
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wsclient</groupId>
<artifactId>ws-client01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.vesion>3.1.4.RELEASE</spring.vesion>
<cxf.vesion>2.2.9</cxf.vesion>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
<version>2.5.3</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- 导入中间工程的jar包,注意若不同请更改 -->
<dependency>
<groupId>com.wsapi</groupId>
<artifactId>ws-api01</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.vesion}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument-tomcat</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-struts</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- ibatis -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.10</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.vesion}</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_2.5_spec</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>apache-cxf</artifactId>
<version>${cxf.vesion}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.vesion}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-common</artifactId>
<version>2.5.4</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-core</artifactId>
<version>${cxf.vesion}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
再在web.xml中添加spring相关配置
<!-- 配置Spring MVC DispatcherServlet -->
<servlet>
<servlet-name>MVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<!-- 加载SpringMVC的xml到 spring的上下文容器中 -->
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置DispatcherServlet所需要拦截的 url -->
<servlet-mapping>
<servlet-name>MVC</servlet-name>
<url-pattern>*.abc</url-pattern>
</servlet-mapping>
<!-- 监听spring上下文容器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 加载spring的xml配置文件到 spring的上下文容器中 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:root-context.xml</param-value>
</context-param>
在resources文件下添加配置文件mvc.xml和root-context.xml,考虑到路径的改动,对访问路径也采取了配置文件读取,建一个config.properties
mvc.xml配置如下
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- SpringMVC配置 -->
<!-- 通过component-scan 让Spring扫描org.swinglife.controller下的所有的类,让Spring的代码注解生效 -->
<context:component-scan base-package="controller"></context:component-scan>
<!-- 配置SpringMVC的视图渲染器, 让其前缀为:/ 后缀为.jsp 将视图渲染到/page/<method返回值>.jsp中 -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/" p:suffix=".jsp">
</beans:bean>
</beans:beans>
root-context.xml配置如下,客户端不需要webservice和ibatis相关配置,在服务端配置便可
<?xml version="1.0" encoding="UTF-8"?>
<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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 读取属性配置文件 -->
<bean id="propertyManager" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config.properties</value>
</list>
</property>
</bean>
<import resource="classpath:wsclient.xml" />
</beans>
config.properties如下
wsurl=http://localhost:8080/spring
接着建一个测试controller,这里是TestController,同样建在controller包下,内容如下
package controller;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import dto.CustomerDTO;
import ws.TestWebService;
/**
* 客户端测试用的controller
* @author fengzhuo
* @date 2018/11/28
*/
@Controller
@RequestMapping("/test.abc")
public class TestController {
@Resource
public TestWebService testWebService;
/**
* 测试
*/
@RequestMapping(params="action=testWsClient")
public void testWsClient(){
CustomerDTO customerDTO = new CustomerDTO();
customerDTO.setUname("lisi");
String msg = testWebService.sayHello(customerDTO);
System.out.println(msg);
}
}
最后启动客户端和服务端服务,访问这个controller中的测试方法看控制台输出就好。
服务端工程照着前一篇ssi搭建,改为用maven工程就可以,方便起见下面给出所用工程的文件
先是工程目录
controller内容
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* 测试用的controller
* @author fengzhuo
* @date 2018/11/28
*/
@Controller
@RequestMapping("/maven.abc")
public class MavenController {
/**
* @author fengzhuo
* @date 2018/11/28
* @param
* @return ModelAndView
*/
@RequestMapping(params = "action=toIndex")
public ModelAndView toIndex(){
ModelAndView mav = new ModelAndView("index");
return mav;
}
}
dto内容(好像没用上)
package dto;
import java.util.Date;
/**
* 用户实体类
* @author fengzhuo
* @date 2018/11/28
*/
public class PersonDTO {
/**
*用户主键id
*/
private int id;
/**
* 用户姓名
*/
private String name;
/**
* 用户密码
*/
private String password;
/**
* 用户真实姓名
*/
private String real_ame;
/**
* 状态码
*/
private Integer status;
/**
* 客户家庭住址
*/
private String address;
/**
* 用户创建日期
*/
private Date created_date;
/**
* 用户邮箱
*/
private String email;
/**
* get/set方法
* @return
*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getReal_ame() {
return real_ame;
}
public void setReal_ame(String real_ame) {
this.real_ame = real_ame;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getCreated_date() {
return created_date;
}
public void setCreated_date(Date created_date) {
this.created_date = created_date;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "PersonDTO [id=" + id + ", name=" + name + ", password=" + password + ", real_ame=" + real_ame
+ ", status=" + status + ", address=" + address + ", created_date=" + created_date + ", email=" + email
+ "]";
}
}
实现类内容
package ws.impl;
import org.springframework.stereotype.Service;
import dto.CustomerDTO;
import ws.TestWebService;
/**
* 测试时需要注入的类
* @author fengzhuo
* @date 2018/11/28
*/
@Service
public class TestWebServiceImpl implements TestWebService {
/**
* 测试所用方法
* @author fengzhuo
* @date 2018/11/28
* @param CustomerDTO
* @return String
*/
public String sayHello(CustomerDTO customerDTO) {
return "hello "+customerDTO.getUname();
}
}
db.properties内容(也没用上)
#dat
dat.driver=com.mysql.jdbc.Driver
dat.url=jdbc:mysql://localhost:3306/ibatisdemo?autoReconnect=true&useUnicode=true&characterEncoding=utf8
dat.username=root
dat.password=root
#uat
uat.driver=com.mysql.jdbc.Driver
uat.url=jdbc:mysql://localhost:3306/ibatisdemo?autoReconnect=true&useUnicode=true&characterEncoding=utf8
uat.username=root
uat.password=root
mvc.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- SpringMVC配置 -->
<!-- 通过component-scan 让Spring扫描org.swinglife.controller下的所有的类,让Spring的代码注解生效 -->
<context:component-scan base-package="controller"></context:component-scan>
<!-- 配置SpringMVC的视图渲染器, 让其前缀为:/ 后缀为.jsp 将视图渲染到/page/<method返回值>.jsp中 -->
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/" p:suffix=".jsp">
</beans:bean>
</beans:beans>
person.xml内容(也么用上)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Person">
<!-- Use primitive wrapper type (e.g. Integer) as parameter and allow results to
be auto-mapped results to Person object (Java Bean) properties -->
<!-- 通过id查询 -->
<select id="getPerson" parameterClass="int" resultClass="dto.PersonDTO">
SELECT * FROM PF_CUSTOMER_NEW WHERE ID= #ID#
</select>
</sqlMap>
root-context.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:component-scan base-package="ws"></context:component-scan>
<!-- 读取属性配置文件 -->
<bean id="propertyManager" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.properties</value>
</list>
</property>
</bean>
<!-- 配置数据源,并使用属性配置文件中的数据 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${dat.driver}" />
<property name="url" value="${dat.url}" />
<property name="username" value="${dat.username}" />
<property name="password" value="${dat.password}" />
</bean>
<!-- 配置ibatis,生成操作对象bean。SqlMapClientTemplate是SqlMapClient的封装类 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SQLMapConfig.xml" />
<property name="dataSource"><ref bean="dataSource" /></property>
</bean>
<bean id="sqlMapClientTemplate1" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<!-- 导入cxf的bean定义文件 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 配置webSevice -->
<jaxws:endpoint
id="testWS"
implementor="#testWebServiceImpl"
address="/Test"
implementorClass="ws.TestWebService"
/>
<!-- <jaxws:endpoint id="helloService"
implementor="#helloServiceImpl"
implementorClass="service.HelloService"
address="/hello">
</jaxws:endpoint> -->
<!-- <bean id="HelloWorldImpl" class="org.andy.cxf.impl.HelloWorldImpl" /> -->
<!-- org.andy.cxf.HelloWorld 是接口的路径-->
<!-- <jaxws:server serviceClass="service.HelloService"
address="/hello">
<jaxws:serviceBean>
<ref bean="helloServiceImpl" />
</jaxws:serviceBean>
</jaxws:server> -->
</beans>
SQLMapConfig.xml内容(同样没用上)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="true"
/>
<sqlMap resource="person.xml" />
</sqlMapConfig>
那个index.jsp里面随便写点啥都行,就是用来测试springmvc是否配置成功的
最后的pom.xml文件,跟客户端的基本一样,头部自动生成的部分保留就好