WebService学习(二)

浅浅的花香味﹌ 2022-06-09 07:07 304阅读 0赞

前言

相信通过上一篇介绍就会对WebService有一个大致的理解,今天主要搭建一个可以用在实际项目中的WebService框架。框架主要用到的是spring+mybatis,用MySQL数据库,数据库和表以及用到的数据自己建我就不说了,发布服务用的是jdk自带的jaxws(没有用cxf是因为依赖的包太多了)。

具体步骤

先看一下整个项目的工程目录
这里写图片描述
1.第一步新建一个动态web工程,添加依赖的包(包含spring、mybatis等等)。如下图
这里写图片描述
2.第二步整合spring。在web.xml中加入spring容器加载。

  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>
  4. <context-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:applicationContext.xml</param-value>
  7. </context-param>

spring配置文件applicationContext.xml如下

  1. <?xml version="1.0" encoding="GBK"?>
  2. <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">
  3. <!-- 自动扫描注解的bean -->
  4. <context:component-scan base-package="com.mycompany"></context:component-scan>
  5. <!-- 加载静态文件 -->
  6. <context:property-placeholder location="classpath:db.properties"/><!-- 加载配置文件 -->
  7. <!-- 配置数据源 c3p0数据连接池-->
  8. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  9. <property name="driverClass" value="${jdbc.driver}"/>
  10. <property name="jdbcUrl" value="${jdbc.url}"/>
  11. <property name="user" value="${jdbc.username}"/>
  12. <property name="password" value="${jdbc.password}"/>
  13. <!-- 指定连接池中保留的最大连接数. Default:15-->
  14. <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
  15. <!-- 指定连接池中保留的最小连接数-->
  16. <property name="minPoolSize" value="${jdbc.minPoolSize}"/>
  17. <!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3-->
  18. <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
  19. <!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0-->
  20. <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>
  21. <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3-->
  22. <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>
  23. <!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。 但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0-->
  24. <property name="maxStatements" value="${jdbc.maxStatements}"/>
  25. <!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->
  26. <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
  27. </bean>
  28. <!-- mybaits 配置 begin-->
  29. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  30. <property name="dataSource" ref="dataSource" />
  31. <property name="mapperLocations" value="classpath:/mappings/*.xml"/>
  32. <property name="configLocation" value="classpath:sqlMapConfig.xml" />
  33. </bean>
  34. <!-- 扫描basePackage下所有的接口 -->
  35. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  36. <property name="basePackage" value="com.mycompany.dao"/>
  37. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  38. </bean>
  39. <!-- mybaits 配置 end-->
  40. <!-- webservice jax-ws -->
  41. <!-- baseAddress 的value地址以及端口号是自定义的,端口号不要为已使用过的 -->
  42. <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
  43. <property name="baseAddress" value="http://10.4.125.84:8099/"/>
  44. </bean>
  45. </beans>

配置文件中各个bean的作用都加了注释,就不在重复了,下边附上数据库配置文件db.properties

  1. #mysql database settings
  2. jdbc.type=mysql
  3. jdbc.driver=com.mysql.jdbc.Driver
  4. jdbc.url=jdbc:mysql://localhost:3306/test?
  5. jdbc.username=root
  6. jdbc.password=ABcd1234@
  7. #c3p0 setting
  8. jdbc.initialPoolSize=20
  9. jdbc.maxPoolSize=100
  10. jdbc.minPoolSize=10
  11. jdbc.maxIdleTime=600
  12. jdbc.acquireIncrement=5
  13. jdbc.maxStatements=5
  14. jdbc.idleConnectionTestPeriod=60

3.接下来整合mybatis。在上一步中spring配置文件已经将mybatis整合进去了,下面附上mybatis配置文件sqlMapConfig.xml,如下

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <!--<properties resource="webService.properties"/>-->
  5. <settings>
  6. <setting name="callSettersOnNulls" value="true"/>
  7. <!-- 使全局的映射器启用或禁用缓存。 -->
  8. <setting name="cacheEnabled" value="true"/>
  9. <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
  10. <setting name="lazyLoadingEnabled" value="true"/>
  11. <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
  12. <setting name="aggressiveLazyLoading" value="true"/>
  13. <!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
  14. <setting name="multipleResultSetsEnabled" value="true"/>
  15. <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
  16. <setting name="useColumnLabel" value="true"/>
  17. <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
  18. <setting name="useGeneratedKeys" value="false"/>
  19. <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
  20. <setting name="autoMappingBehavior" value="PARTIAL"/>
  21. <!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
  22. <setting name="defaultExecutorType" value="SIMPLE"/>
  23. <!-- 使用驼峰命名法转换字段。 -->
  24. <setting name="mapUnderscoreToCamelCase" value="true"/>
  25. <!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
  26. <setting name="localCacheScope" value="SESSION"/>
  27. <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
  28. <setting name="jdbcTypeForNull" value="NULL"/>
  29. </settings>
  30. <typeAliases>
  31. <typeAlias alias="HashMaps" type="java.util.HashMap" />
  32. </typeAliases>
  33. </configuration>

4.一般开发都需要记录日志,加入log4j日记文件log4j.properties,如下

  1. log4j.rootLogger=INFO,stdout,R
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %p [%c] -%m%n
  5. log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
  6. log4j.appender.R.File=../logs/webservice.log
  7. log4j.appender.R.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %p [%c] -%m%n
  9. log4j.logger.com.ibatis=info
  10. log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=info
  11. log4j.logger.com.ibatis.common.jdbc.ScriptRunner=info
  12. log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=info
  13. log4j.logger.java.sql.Statement=info
  14. log4j.logger.java.sql.PreparedStatement=info,stdout

5.完成以上步骤,基本上框架就搭建好了,下面写个测试类,实现的功能是通过员工id查询员工姓名。

HelloWorldService.java代码如下

  1. package com.mycompany.service;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. @WebService(targetNamespace="http://service.mycompany.com/")
  5. @SOAPBinding(style=Style.RPC)
  6. public interface HelloWorldService {
  7. @WebResult(name="String")
  8. @WebMethod
  9. public String sayHello(@WebParam(name = "id") int id);
  10. }

HelloWorldServiceImpl.java代码如下

  1. package com.mycompany.service;
  2. import javax.annotation.Resource;
  3. import javax.jws.WebService;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import com.mycompany.dao.HelloWorldDao;
  8. @Service
  9. @WebService(serviceName="HelloWorldService",targetNamespace="http://service.mycompany.com/",endpointInterface="com.mycompany.service.HelloWorldService")
  10. public class HelloWorldServiceImpl implements HelloWorldService {
  11. @Resource
  12. private HelloWorldDao helloWorldDao;
  13. private static Logger logger = Logger.getLogger(HelloWorldServiceImpl.class);
  14. @Override
  15. public String sayHello(int id) {
  16. logger.info("----接口查询开始----");
  17. String name = helloWorldDao.getName(id);
  18. logger.info("----接口查询结束----");
  19. return "Hello," + name;
  20. }
  21. }

HelloWorldDao .java代码如下

  1. package com.mycompany.dao;
  2. public interface HelloWorldDao {
  3. public String getName(int id);
  4. }

hello-mapper.xml代码如下

  1. <?xml version="1.0" encoding="GBK"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.mycompany.dao.HelloWorldDao">
  4. <select id="getName" parameterType="int" resultType="string">
  5. select name from user where id = #{id}
  6. </select>
  7. </mapper>

6.以上全部做完,一个简单的WebService就算是完成了,我们在test包下建一个测试类TestService.java ,代码如下

  1. package com.mycompany.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.mycompany.service.HelloWorldServiceImpl;
  5. public class TestService {
  6. public static void main(String[] args) {
  7. ApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
  8. HelloWorldServiceImpl helloWorldService = app.getBean(HelloWorldServiceImpl.class);
  9. String name = helloWorldService.sayHello(56040);
  10. System.out.println(name);
  11. }
  12. }

通过运行Main方法可以知道自己写的接口是否正确。

7.以上都没有问题就将项目用tomcat启动,注意在spring配置文件中配置了启动文本项目的自己电脑的ip和端口,如下

  1. <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
  2. <property name="baseAddress" value="http://10.4.125.84:8099/"/>
  3. </bean>

注意一定是自己电脑的ip,而不是localhost,端口也是没有被占用的端口。

8.如果项目顺利启动没有报错,就可以在浏览器里输入地址
http://10.4.125.84:8099/HelloWorldService?wsdl
如果看到如下图所示
这里写图片描述
那么一个WebService项目就完成了

9.关于如何生成客户端代码,情况上一篇博客中推荐的第一篇博客。

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读