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。