在纯WEB项目中发布一个WebService

本文详细介绍了如何在纯WEB项目中发布一个WebService,包括使用Ant生成WAR包,通过MyEclipse创建并配置CXFServlet,编写服务,与Spring整合,以及使用Web Service Explorer进行测试。讲解了从配置XML到实际调用的全过程。
摘要由CSDN通过智能技术生成

1,使用ant clean命令可以撤销ant做过的一切事情。

比如我们可以通过这种方式撤销通过ant解析的build.xml文件。进入到指定目录执行即可。

 

2,通过ant生成web工程

在有build.xml的目录,命令行执行ant war就可以生成war包,将war包拷贝到tomcat的webapps目录下,启动tomcat,就生成了工程文件。

有时生成的工程是没有Index页面的,通过查看web.xml文件可以知道对外访问路径。

 

3,在MyEclipse中通过WEB项目发布一个WebService

(1)新建一个WEB工程,导入需要的jar包。


(2)在web.xml中配置cxf的核心servlet,CXFServlet。

其servlet配置内容从cxf解压目录的etc/web.xml中拷贝。

 <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/cxf/*</url-pattern>
  </servlet-mapping>

CXFServlet类会默认读取一个叫做cxf-servlet.xml的配置文件,通过查看源码,可以知道,读取的这个配置文件要位于WEB-INF下。


从cxf的解压目录的sample实例中拷贝一个到我们的项目中。


发现这个一个spring配置文件,将里面的注释全部删除,<beans>标签中的内容也全部删除。

发布这个web工程,到浏览器中访问。


这样就说明发布成功了,只是现在我们还没有发布服务。

 

(3)编写服务

注意:不可以通过endpoint的方式发布,因为endpoint是java的发布方式,现在要从tomcat上发布,而且要与spring结合,所以要用其他的方式发布。

Cxf-servlet.xml配置文件中使用的sample命名空间,我们不能使用sample命名空间,

查看CXFServlet的源码,发现它在里面设置了总线:


Wac是webApplicationContext的子类对象,调用getBean方法,查看配置文件:


打开这个jar包,里面的


这个目录中,找到cxf.xml文件。

这个文件中有如下配置:


说明CXFServlet类读取这个配置文件。所以说cxf2.5会自动读取这个配置文件。

在早期的不会自动读取,需要在cxf-servlet.xml中引入配置文件。


必须使用jaxws ,jaxrs命名空间发布。不能使用sample。

这两个命名空间可以在cxf核心jar中找到。


在这里!

打开,在里面搜索jaxws,第一个结果就是。

将这个搜索结果配置到cxf-servlet.xml中:


配置好以后还没有提示,需要引入.xsd约束文件。

在cxf解压目录下搜索*.xsd,得到两个文件,将这两个文件导入到Myeclipse中:



编写cxf-servlet.xml配置文件:

	<jaxws:server address="/hello">
		<jaxws:serviceBean>
			<bean class="cn.itcast.ws.HelloWorld"></bean>
		</jaxws:serviceBean>
	</jaxws:server>

发布的是HelloWorld,编写HelloWorld。

@WebService
public class HelloWorld {
	public String sayHello(String nm) {
		System.out.println("hello ws!!!");
		return "Hi," + nm;
	}
}

通过MyEclipse的webservice explorer工具访问。

调用成功。

 

(4)将服务进一步与spring整合。

首先将cxf-servlet.xml复制一份到src下,改名为ws-bean.xml,并将cxf-servlet.xml中<beans>中的所有内容删除掉。在web.xml中配置读取配置文件路径为ws-bean.xml的路径,并配置spring的拦截器,否则无法获取ApplicationContext对象。

  <!-- 配置文件的读取路径 参数 -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>
  		classpath:ws-bean.xml
  	</param-value>
  </context-param>
  
  <!-- 配置spring的监听器。 -->
  <listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
  </listener>

配置ws-bean.xml文件,单独为服务类设置一个<bean>。并在cxf的服务中引用这个<bean>,也可以实现发布服务。同时设置了这个服务类的请求和相应的监听。

    <!-- spring的方式配置bean,以便于在java程序中获取bean -->
	<bean id="hello" class="cn.itcast.ws.HelloWorld"></bean>
	<jaxws:server address="/hello">
		<jaxws:serviceBean>
			<ref bean="hello" />
		</jaxws:serviceBean>
		
		<!-- 配置请求拦截器 -->
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
		</jaxws:inInterceptors>
		
		<!-- 配置响应拦截器 -->
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
		</jaxws:outInterceptors>
	</jaxws:server>

编写一个servlet,获取spring的ApplicationContext对象,通过这个对象获取服务类的bean,调用服务类的方法。

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		//获取spring的ApplicationContext容器。
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
		System.out.println(ac);
		HelloWorld hw =  ac.getBean("hello",HelloWorld.class);
		hw.sayHello("xzm");
}

Servlet在web.xml中的配置:

  <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>OneServlet</servlet-name>
    <servlet-class>cn.itcast.servlet.OneServlet</servlet-class>
  </servlet>

  <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/cxf/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>OneServlet</servlet-name>
    <url-pattern>/servlet/OneServlet</url-pattern>
  </servlet-mapping>

访问http://localhost:8080/cxfweb/cxf

依然可以访问!

在浏览器访问servlet。

http://localhost:8080/cxfweb/servlet/OneServlet

可以看到在控制台打印:

可以发现监听器并没有起作用,为什么呢?

因为我们访问的是servlet,而不是webservice,只有访问webservice才可以拦截到。

我们可以通过Myeclipse的web service explorer访问webservice。


控制台打印如下信息:

ID: 3      第一次访问先握手

Address:http://localhost:8080/cxfweb/cxf/hello?wsdl

Http-Method: GET

Content-Type:

Headers: {Accept=[text/html, image/gif,image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null],host=[localhost:8080], user-agent=[Java/1.6.0_13]}

--------------------------------------

十月08, 2013 11:54:42 上午org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld

INFO: Inbound Message

----------------------------

ID: 4         发送请求

Address:http://localhost:8080/cxfweb/cxf/hello

Encoding: UTF-8

Http-Method: POST

Content-Type: text/xml;charset=utf-8

Headers:{Accept=[application/soap+xml, application/dime, multipart/related, text/*],cache-control=[no-cache], connection=[close], Content-Length=[351],content-type=[text/xml; charset=utf-8], host=[localhost:8080],pragma=[no-cache], SOAPAction=[""], user-agent=[IBM Web ServicesExplorer]}

Payload: <soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:q0="http://ws.itcast.cn/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

   <q0:sayHello>

     <arg0>对发生的发生地方</arg0>

   </q0:sayHello>

 </soapenv:Body>

</soapenv:Envelope>

 

--------------------------------------

hello ws!!!

十月08, 2013 11:54:42 上午org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld

INFO: Outbound Message

---------------------------

ID: 4      响应信息

Encoding: UTF-8

Content-Type: text/xml

Headers: {}

Payload: <soap:Envelopexmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:sayHelloResponsexmlns:ns1="http://ws.itcast.cn/"><return>Hi,对发生的发生地方</return></ns1:sayHelloResponse></soap:Body></soap:Envelope>

--------------------------------------

至此,完成了在纯WEB应用中发布一个webservice。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值