请教一个关于cxf做服务端时,cxf webservice服务端发布地址的问题

WebService CXF 获取客户端的IP地址
最近这几天在做一个用户同步,具体就是当权限系统中添加用户后,把该用户的信息同步到论坛系统中去,服务器端发布webservice采用的是cxf框架,这时候一个业务需求就是能获取到客户端的ip,并将这字段存到数据库中,用于论坛统计。
package com.bkbt.forum.
import java.io.R import java.io.StringR import java.util.D import java.util.L
import javax.annotation.R import javax.jws.WebS import javax.servlet.http.HttpServletR import javax.xml.ws.WebServiceC import javax.xml.ws.handler.MessageC
import mons.logging.L import mons.logging.LogF import org.apache.cxf.transport.http.AbstractHTTPD import org.dom4j.D import org.dom4j.E import org.dom4j.io.SAXR
import cn.jsprun.dao.UserD import cn.jsprun.domain.M import cn.jsprun.utils.BeanF import cn. import cn.jsprun.utils.Md5T
@WebService public class UserServiceImpl implements UserService { private Log log = LogFactory.getLog(UserServiceImpl.class); private UserDao userDao = (UserDao) BeanFactory.getBean(“userDao”); @Resource(name = “org.apache.cxf.jaxws.context.WebServiceContextImpl”) private WebServiceC
public void addUser(String xml) { try { SAXReader saxReader = new SAXReader(); Reader reader = new StringReader(xml); Document doc = saxReader.read(reader); Element root = doc.getRootElement(); List&Element& list = root.elements(); Members member = new Members(); int salt = Common.rand(9999); member.setUsername(list.get(0).getText()); member.setPassword(Md5Token.getInstance().getLongToken(Md5Token.getInstance().getLongToken(list.get(1).getText())+salt)); member.setEmail(list.get(2).getText()); member.setSalt(String.valueOf(salt)); int groupId = 10; short id = (short)groupId; Short Id = member.setGroupid(Id); member.setRegip(this.getClientIpCxf()); member.setRegdate(Integer.valueOf(String.valueOf(new Date().getTime()).substring(0, 10))); member.setLastip(this.getClientIpCxf()); member.setLastvisit(Integer.valueOf(String.valueOf(new Date().getTime()).substring(0, 10))); member.setPmsound(Byte.valueOf(+)); member.setShowemail(Byte.valueOf(+)); member.setNewsletter(Byte.valueOf(+)); member.setTimeoffset(&#″); member.setLastactivity(Integer.valueOf(String.valueOf(new Date().getTime()).substring(0, 10))); userDao.saveMember(member); } catch (Exception e) {
public String getClientIpCxf() { MessageContext ctx = context.getMessageContext(); HttpServletRequest request = (HttpServletRequest) ctx.get(AbstractHTTPDestination.HTTP_REQUEST); String ip=request.getRemoteAddr();
你可能对这些文章感兴趣.
Copyright & 2013 &&java面试题四步完成WebService服务端与客户端的调用 -
- ITeye技术网站
博客分类:
&& 内部系统之间数据传输使用RMI方式比较方便,但外部系统之间由于系统兼容性原因,使用WebService是较流行的方式。这两天特意整理了一下WebService发布、调用的方式,把实例贴出来。
&&
&& 1.服务端配置:使用CXF + Spring方式。
&& 配置web.xml,添加cxfservler,
&&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/*&/url-pattern&
&/servlet-mapping&
原因是webservice服务是运行在web容器中的,接收外部的http请求。所以配置一个servler,这里由cxf进行包装。
&&& 2.编写具体发布服务逻辑,并使用Spring进行配置
&&&
@WebService
public interface ISpeakService {
public String speak(String userName, Date date);
@WebService(endpointInterface = "com.sfexpress.ISpeakService")
public class SpeakServiceImpl implements ISpeakService {
public String speak(String userName, Date date){
return "Hello " + userName + ", today is " + date.toString();
配置spring beans.xml文件,发布服务端的逻辑,并配置外接访问地址为:/SpeakService
&&
&import resource="classpath:META-INF/cxf/cxf.xml" /&
&import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&
&import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&
&jaxws:endpoint id="speakService"
implementor="com.sfexpress.SpeakServiceImpl"
address="/SpeakService" /&
3.导出服务端生成的wsdl文件,访问http://localhost:8180/SpeakService?wsdl,把网页内容保存成speak.wsdl文件。wsdl是接口描述文件,通过XML进行定义,客户端需要把wsdl文件提前解析为java文件,这样在客户端就可以像rmi方式一样调用。
转换工具使用apache-cxf-2.6.16, 具体命令:wsdl2java -p com -d D:\data\sss d:\data\sss\speak.wsdl 取出生成的ISpeakService.java类。
4.新建java工程并创建一个客户端调用主类。
拷贝刚才生成的ISpeakService.java至客户端工程。
主类中按下面方式调用即可。
public static void main(String[] args) throws DatatypeConfigurationException {
// 创建WebService客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(ISpeakService.class);
// 设置WebService地址
factory.setAddress("http://localhost:8180/SpeakService?wsdl");
XMLGregorianCalendar
date = DatatypeFactory.newInstance().newXMLGregorianCalendar();
date.setYear(2014);
date.setMonth(11);
date.setDay(12);
ISpeakService greetingService = (ISpeakService) factory.create();
System.out.println("message context is:"
+ greetingService.speak("beck", date));
下载次数: 144
浏览 10281
beck5859509
浏览: 61923 次
来自: 深圳
好久木有更新了咧,wei 哥说你还是在这边办公额?
wangxuehui 写道文章写的不错,希望多写写哈哈,一起学 ...
文章写的不错,希望多写写
wangxuehui 写道即&p的值0x7fff654 ...
即&p的值0x7fff65485a00修改为abc h ...34893人阅读
Java(127)
Web/JS(10)
一、CXF的介绍Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。二、CXF的准备条件所需要的jar包:& xmlbeans-2.4.0.jar& wss4j-1.5.9.jar& jetty-server-7.1.6.v.jar& jetty-util-7.1.6.v.jar& geronimo-ws-metadata_2.0_spec-1.1.3.jar& geronimo-activation_1.1_spec-1.1.jar& geronimo-servlet_3.0_spec-1.0.jar& velocity-1.6.4.jar& jaxb-xjc-2.2.1.1.jar& xml-resolver-1.2.jar& wsdl4j-1.6.2.jar& cxf-2.3.0.jar& XmlSchema-1.4.7.jar& jaxb-api-2.2.1.jar& jaxb-impl-2.2.1.1.jar& neethi-2.0.4.jar& geronimo-annotation_1.0_spec-1.1.1.jar& geronimo-stax-api_1.0_spec-1.0.1.jar下载地址:&& (取自己需要的jar包)三、创建webservice服务端1、先将jar包放入lib目录2、在web.xml中配置CXF框架的核心servlet[html] &&&&&&&&&&CXFServlet&&&&&&&&org.apache.cxf.transport.servlet.CXFServlet&&&&&&&&1&&&&&&&&&&&&&&&&CXFServlet&&&&&&&&/services/*&&&&&& &!-- CXF --&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/services/*&/url-pattern&
&/servlet-mapping&3、在applicationContext.xml中导入xml,并且发布webservice服务。[html] &version=&1.0&&encoding=&UTF-8&&&&&&&&&xmlns=&http://www.springframework.org/schema/beans&&&&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&&&&&&xmlns:p=&http://www.springframework.org/schema/p&&&&&&&xmlns:tx=&http://www.springframework.org/schema/tx&&&&&&&xmlns:aop=&http://www.springframework.org/schema/aop&&&&&&&xmlns:jaxws=&http://cxf.apache.org/jaxws&&&&&&&&&xmlns:jaxrs=&http://cxf.apache.org/jaxrs&&&&&&&&&xsi:schemaLocation=&http://www.springframework.org/schema/beans&&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/tx&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/aop&&&&&&&&&&&&&&&&&&&&&&&&&&http://www.springframework.org/schema/aop/spring-aop-2.5.xsd&&&&&&&&&&&&&&&&&&&&&&&&&&http://cxf.apache.org/jaxws&&&&&&&&&&&&&&&&&&&&&&&&&&&&http://cxf.apache.org/schemas/jaxws.xsd&&&&&&&&&&&&&&&&&&&&&&&&&&&&http://cxf.apache.org/jaxrs&&&&&&&&&&&&&&&&&&&&&&&&&&&&http://cxf.apache.org/schemas/jaxrs.xsd&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&default-autowire=&byName&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&resource=&classpath:META-INF/cxf/cxf.xml&&&&&&&&&resource=&classpath:META-INF/cxf/cxf-extension-soap.xml&&&&&&&&&resource=&classpath:META-INF/cxf/cxf-servlet.xml&&&&&&&&&&&&&&&&&&&&&&&&&&&id=&facelookWebService&&class=&com.facelook.webservice.server.FacelookWebServiceImpl&&&&&&&&&id=&facelookWebService1&&address=&/facelookWebService&&implementorClass=&com.facelook.webservice.server.FacelookWebServiceImpl&&&&&&&&&&&&ref=&facelookWebService&&&&&&&&&&&&&&?xml version=&1.0& encoding=&UTF-8&?&
xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:p=&http://www.springframework.org/schema/p&
xmlns:tx=&http://www.springframework.org/schema/tx&
xmlns:aop=&http://www.springframework.org/schema/aop&
xmlns:jaxws=&http://cxf.apache.org/jaxws&
xmlns:jaxrs=&http://cxf.apache.org/jaxrs&
xsi:schemaLocation=&http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd
default-autowire=&byName&
&import resource=&classpath:META-INF/cxf/cxf.xml& /&
&import resource=&classpath:META-INF/cxf/cxf-extension-soap.xml& /&
&import resource=&classpath:META-INF/cxf/cxf-servlet.xml& /&
&!-- &jaxws:endpoint id=&facelookWebService& address=&/facelookWebService& implementor=&com.facelook.webservice.server.FacelookWebServiceImpl&&&/jaxws:endpoint& --&
&!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 --&
&bean id=&facelookWebService& class=&com.facelook.webservice.server.FacelookWebServiceImpl&/&
&jaxws:endpoint id=&facelookWebService1& address=&/facelookWebService& implementorClass=&com.facelook.webservice.server.FacelookWebServiceImpl&&
&jaxws:implementor ref=&facelookWebService&/&
&/jaxws:endpoint&
4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。[java] @WebService&&public&interface&FacelookWebService&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&public&String&getAlbumList(@WebParam(name=&xmlStr&)&String&xmlStr);&&}&&&&&&@WebService&&&&public&class&FacelookWebServiceImpl&implements&FacelookWebService{&&&&&&&&@Autowired&&&&&&private&AlbumService&albumS&&&&&&&&&&&&@Override&&&&&&public&String&getAlbumList(String&xmlStr)&{&&&&&&&&&&try&{&&&&&&&&&&&&&&List&Album&&albumList&=&getAlbumPage(xmlStr);&&&&&&&&&&&&&&JSONArray&jsonArray&=&JSONArray.fromObject(albumList);&&&&&&&&&&&&&&return&jsonArray.toString();&&&&&&&&&&}&catch&(Exception&e)&{&&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&&}&&&&&&&&&&return&null;&&&&&&}&&}&&&@WebService
public interface FacelookWebService {
* 根据传递的条件获取相册信息
* xml的格式规范
* &?xml version=\&1.0\& encoding=\&UTF-8\&?&
* &facelook&
&condition&
&name&&/name&
&description&&/description&
&pageno&&/pageno&
&pagesize&&/pagesize&
&/condition&
* &/facelook&
* 这里的WebParam必须指定,否则调用的时候返回null
public String getAlbumList(@WebParam(name=&xmlStr&) String xmlStr);
@WebService
//这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName=&facelookWebService&,endpointInterface=&com.facelook.webservice.server.FacelookWebService&)
public class FacelookWebServiceImpl implements FacelookWebService{
&& &@Autowired
&& &private AlbumService albumS
&& &@Override
&& &public String getAlbumList(String xmlStr) {
&& &&& &try {
&& &&& &&& &List&Album& albumList = getAlbumPage(xmlStr);
&& &&& &&& &JSONArray jsonArray = JSONArray.fromObject(albumList);
&& &&& &&& &return jsonArray.toString();
&& &&& &} catch (Exception e) {
&& &&& &&& &e.printStackTrace();
这样子,基本上就可以了。 5、保存代码,发布项目,启动tomact。在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl& 即可看到发布的服务端的明细。显示如下:这就表示CXF发布的webservice服务端成功了。6、通过客户端调用服务端webservice。axis的客户端访问:[java] public&static&void&main(String[]&args)&throws&ServiceException,&RemoteException,&MalformedURLException&{&&&&&&String&xmlStr&=&&&?xml&version=\&1.0\&&encoding=\&UTF-8\&?&&&&&&&&&&&&&&&&&+&&&&&&&&facelook&&&&&&&&&&&&&&&&&+&&&&&&&&&&&condition&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&name&家&/name&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&description&&/description&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&pageno&&/pageno&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&pagesize&&/pagesize&&&&&&&&&&&&&&&&&+&&&&&&&&&&&/condition&&&&&&&&&&&&&&&&&+&&&&&&&&/facelook&&;&&&&&&&&&&&&&&Service&service&=&new&Service();&&&&&&&&Call&call&=&(Call)&service.createCall();&&&&&&&&call.setTargetEndpointAddress(&http://localhost:8080/facelook/services/facelookWebService?wsdl&);&&&&&&&&QName&qName&=&new&QName(&http://server./&,&&getAlbumList&);&&&&&&&&call.setOperationName(qName);&&&&&&&&call.setUseSOAPAction(true);&&&&&&&&&&&&&&&&call.addParameter(&xmlStr&,&XMLType.XSD_STRING,&ParameterMode.IN);&&&&&&&&call.setReturnType(XMLType.XSD_STRING);&&&&&&&&String&result&=&(String)&call.invoke(new&Object[]&{&xmlStr&});&&&&&&&&System.out.println(result);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&& public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {
String xmlStr = &&?xml version=\&1.0\& encoding=\&UTF-8\&?&&
&facelook&&
&condition&&
&name&家&/name&&
&description&&/description&&
&pageno&&/pageno&&
&pagesize&&/pagesize&&
&/condition&&
&/facelook&&;
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(&http://localhost:8080/facelook/services/facelookWebService?wsdl&);
QName qName = new QName(&http://server./&, &getAlbumList&);
call.setOperationName(qName);
call.setUseSOAPAction(true);
//这下面两行一定要加上,否则接收在服务器端收不到。
call.addParameter(&xmlStr&, XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
String result = (String) call.invoke(new Object[] { xmlStr });
System.out.println(result);
//将返回的字符串转换成list集合
//JSONArray array = JSONArray.fromObject(result);
//List&Album& list = JSONArray.toList(array,Album.class);
}CXF客户端访问:[java] public&static&void&main(String[]&args)&throws&Exception&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&JaxWsDynamicClientFactory&dcf&=&JaxWsDynamicClientFactory.newInstance();&&&&&&&&&&org.apache.cxf.endpoint.Client&client&=&dcf.createClient(&http://localhost:8080/facelook/services/facelookWebService?wsdl&);&&&&&&&&&&&&&&&&&&&&QName&name=new&QName(&http://server./&,&getAlbumList&);&&&&&&&&&&&&&&&&&&&&String&xmlStr&=&&&?xml&version=\&1.0\&&encoding=\&UTF-8\&?&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&facelook&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&condition&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&name&家&/name&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&description&&/description&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&pageno&&/pageno&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&&&&&pagesize&&/pagesize&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&&&&/condition&&&&&&&&&&&&&&&&&&&&&+&&&&&&&&/facelook&&;&&&&&&&&&&&&&&&&&&&&Object[]&objects=client.invoke(name,xmlStr);&&&&&&&&&&&&&&&&&&&&&System.out.println(objects[0].toString());&&}&&public static void main(String[] args) throws Exception {
//这个是用cxf 客户端访问cxf部署的webservice服务
//千万记住,访问cxf的webservice必须加上namespace ,否则通不过
//现在又另外一个问题,传递过去的参数服务端接收不到
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient(&http://localhost:8080/facelook/services/facelookWebService?wsdl&);
//url为调用webService的wsdl地址
QName name=new QName(&http://server./&,&getAlbumList&);
//namespace是命名空间,methodName是方法名
String xmlStr = &&?xml version=\&1.0\& encoding=\&UTF-8\&?&&
&facelook&&
&condition&&
&name&家&/name&&
&description&&/description&&
&pageno&&/pageno&&
&pagesize&&/pagesize&&
&/condition&&
&/facelook&&;
//paramvalue为参数值
Object[] objects=client.invoke(name,xmlStr);
//调用web Service//输出调用结果
System.out.println(objects[0].toString());
在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1308239次
积分:14490
积分:14490
排名:第718名
原创:188篇
转载:181篇
评论:353条
(2)(1)(3)(3)(1)(1)(2)(1)(1)(1)(1)(1)(3)(5)(4)(1)(1)(2)(2)(1)(1)(2)(3)(3)(1)(1)(1)(1)(1)(3)(3)(2)(3)(3)(3)(2)(1)(3)(2)(1)(6)(7)(3)(5)(2)(5)(4)(2)(2)(1)(3)(1)(1)(1)(2)(1)(2)(1)(3)(2)(3)(1)(4)(6)(7)(4)(3)(12)(6)(13)(19)(6)(16)(13)(9)(3)(2)(4)(4)(6)(8)(2)(6)(8)(1)(6)(1)(1)(9)(12)(1)(12)(28)(8)(1)(1)}

我要回帖

更多关于 cxf webservice 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信