WebService学习(二)
前言
相信通过上一篇介绍就会对WebService有一个大致的理解,今天主要搭建一个可以用在实际项目中的WebService框架。框架主要用到的是spring+mybatis,用MySQL数据库,数据库和表以及用到的数据自己建我就不说了,发布服务用的是jdk自带的jaxws(没有用cxf是因为依赖的包太多了)。
具体步骤
先看一下整个项目的工程目录
1.第一步新建一个动态web工程,添加依赖的包(包含spring、mybatis等等)。如下图
2.第二步整合spring。在web.xml中加入spring容器加载。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
spring配置文件applicationContext.xml如下
<?xml version="1.0" encoding="GBK"?>
<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:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:websocket="http://www.springframework.org/schema/websocket" xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:core="http://jax-ws.dev.java.net/spring/core" xsi:schemaLocation="http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 自动扫描注解的bean -->
<context:component-scan base-package="com.mycompany"></context:component-scan>
<!-- 加载静态文件 -->
<context:property-placeholder location="classpath:db.properties"/><!-- 加载配置文件 -->
<!-- 配置数据源 c3p0数据连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 指定连接池中保留的最大连接数. Default:15-->
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
<!-- 指定连接池中保留的最小连接数-->
<property name="minPoolSize" value="${jdbc.minPoolSize}"/>
<!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3-->
<property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0-->
<property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3-->
<property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>
<!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。 但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0-->
<property name="maxStatements" value="${jdbc.maxStatements}"/>
<!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->
<property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
</bean>
<!-- mybaits 配置 begin-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:/mappings/*.xml"/>
<property name="configLocation" value="classpath:sqlMapConfig.xml" />
</bean>
<!-- 扫描basePackage下所有的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mycompany.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- mybaits 配置 end-->
<!-- webservice jax-ws -->
<!-- baseAddress 的value地址以及端口号是自定义的,端口号不要为已使用过的 -->
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://10.4.125.84:8099/"/>
</bean>
</beans>
配置文件中各个bean的作用都加了注释,就不在重复了,下边附上数据库配置文件db.properties
#mysql database settings
jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?
jdbc.username=root
jdbc.password=ABcd1234@
#c3p0 setting
jdbc.initialPoolSize=20
jdbc.maxPoolSize=100
jdbc.minPoolSize=10
jdbc.maxIdleTime=600
jdbc.acquireIncrement=5
jdbc.maxStatements=5
jdbc.idleConnectionTestPeriod=60
3.接下来整合mybatis。在上一步中spring配置文件已经将mybatis整合进去了,下面附上mybatis配置文件sqlMapConfig.xml,如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--<properties resource="webService.properties"/>-->
<settings>
<setting name="callSettersOnNulls" value="true"/>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
<setting name="multipleResultSetsEnabled" value="true"/>
<!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
<setting name="useGeneratedKeys" value="false"/>
<!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
<setting name="autoMappingBehavior" value="PARTIAL"/>
<!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 使用驼峰命名法转换字段。 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
<setting name="localCacheScope" value="SESSION"/>
<!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<typeAlias alias="HashMaps" type="java.util.HashMap" />
</typeAliases>
</configuration>
4.一般开发都需要记录日志,加入log4j日记文件log4j.properties,如下
log4j.rootLogger=INFO,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %p [%c] -%m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=../logs/webservice.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %p [%c] -%m%n
log4j.logger.com.ibatis=info
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=info
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=info
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=info
log4j.logger.java.sql.Statement=info
log4j.logger.java.sql.PreparedStatement=info,stdout
5.完成以上步骤,基本上框架就搭建好了,下面写个测试类,实现的功能是通过员工id查询员工姓名。
HelloWorldService.java代码如下
package com.mycompany.service;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(targetNamespace="http://service.mycompany.com/")
@SOAPBinding(style=Style.RPC)
public interface HelloWorldService {
@WebResult(name="String")
@WebMethod
public String sayHello(@WebParam(name = "id") int id);
}
HelloWorldServiceImpl.java代码如下
package com.mycompany.service;
import javax.annotation.Resource;
import javax.jws.WebService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mycompany.dao.HelloWorldDao;
@Service
@WebService(serviceName="HelloWorldService",targetNamespace="http://service.mycompany.com/",endpointInterface="com.mycompany.service.HelloWorldService")
public class HelloWorldServiceImpl implements HelloWorldService {
@Resource
private HelloWorldDao helloWorldDao;
private static Logger logger = Logger.getLogger(HelloWorldServiceImpl.class);
@Override
public String sayHello(int id) {
logger.info("----接口查询开始----");
String name = helloWorldDao.getName(id);
logger.info("----接口查询结束----");
return "Hello," + name;
}
}
HelloWorldDao .java代码如下
package com.mycompany.dao;
public interface HelloWorldDao {
public String getName(int id);
}
hello-mapper.xml代码如下
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mycompany.dao.HelloWorldDao">
<select id="getName" parameterType="int" resultType="string">
select name from user where id = #{id}
</select>
</mapper>
6.以上全部做完,一个简单的WebService就算是完成了,我们在test包下建一个测试类TestService.java ,代码如下
package com.mycompany.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mycompany.service.HelloWorldServiceImpl;
public class TestService {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
HelloWorldServiceImpl helloWorldService = app.getBean(HelloWorldServiceImpl.class);
String name = helloWorldService.sayHello(56040);
System.out.println(name);
}
}
通过运行Main方法可以知道自己写的接口是否正确。
7.以上都没有问题就将项目用tomcat启动,注意在spring配置文件中配置了启动文本项目的自己电脑的ip和端口,如下
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://10.4.125.84:8099/"/>
</bean>
注意一定是自己电脑的ip,而不是localhost,端口也是没有被占用的端口。
8.如果项目顺利启动没有报错,就可以在浏览器里输入地址http://10.4.125.84:8099/HelloWorldService?wsdl
如果看到如下图所示
那么一个WebService项目就完成了
9.关于如何生成客户端代码,情况上一篇博客中推荐的第一篇博客。
还没有评论,来说两句吧...