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.关于如何生成客户端代码,情况上一篇博客中推荐的第一篇博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章