WebService之CXF框架

本文主要包括以下内容

  1. ant工具的使用
  2. 利用cxf实现webservice
  3. cxf与spring整合
  4. ajax访问webservice

ant 工具

1、为什么要用到ant这个工具呢?

Ant做为一种工具已经广泛被使用,并且历史悠久。
使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear),
也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。
由于ant是用xml语言写成的文件,并取默认名为build.xml文件。
所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。

ant 工具后面跟的是任务的名称

  • ant server 运行了Server类,发布了一个webservice

  • ant client 调用已经发布的webservice

  • ant clean 清除已经生成的class 文件

  • ant war 将java 项目打成一个war 包

  • ant deploy -Dtomcat=true 把打成的war 拷贝到tomcat 的webapp 下面去。

  • ant undeploy -Dtomcat=true; 卸载tomcat 下面的项目..

CXF发布服务与调用服务

用cxf 框架提供的类发布一个服务

方法一

使用cxf 提供 ServerFactoryBean 来发布webservice
被发布的类当中可以不需要标注webservice 注解,类当中可以不包含有效的方法,
如果没有包含有效的方法.它会提供一个空的服务.

//创建发布服务的类...
ServerFactoryBean bean=new ServerFactoryBean();
bean.setAddress("http://192.168.9.100:8080/server");//服务对外的访问地址
bean.setServiceClass(CxfWebService.class);//设置服务类的接口类型,如果没有接口则为当前类..
bean.setServiceBean(new CxfWebService());//设置服务类的实现
bean.create();//发布服务

有接口的情况

package com.zj.server;import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;import cn.itcast.webservice.userService.UserService;
import cn.itcast.webservice.userService.UserServiceImpl;/*** * 使用cxf 提供的类 JaxWsServerFactoryBean 来发布一个带接口的webservice ...* * @ 作者 zhuwu@itcast.cn**/
public class PublishUserService {/*** @param args*/public static void main(String[] args) {//创建发布服务的 类...JaxWsServerFactoryBean  bean=new JaxWsServerFactoryBean();//设置对外的访问地址bean.setAddress("http://10.129.69.114:7418/userService");bean.setServiceClass(UserService.class);//设置接口类型...bean.setServiceBean(new UserServiceImpl());//设置接口的实现类...//我们可以在发布服务的时候添加消息拦截器//拦截客户端往服务端 发送的请求的消息bean.getInInterceptors().add(new LoggingInInterceptor());//拦截服务端往客户端返回的消息...bean.getOutInterceptors().add(new LoggingOutInterceptor());bean.create();}}

第二种发布方式

使用cxf 框架提供的类 jaxWsServerFactoryBean 发布webService
jaxWsServerFactoryBean 是 ServerFactoryBean 的子类... jaxWsServerFactoryBean bean=new jaxWsServerFactoryBean();
bean.setAddress("http://192.168.9.100:8080/server");//服务对外的访问地址
bean.setServiceClass(CxfWebService.class);//设置服务类的接口类型,如果没有接口则为当前类..
bean.setServiceBean(new CxfWebService());//设置服务类的实现
bean.create();//发布服务

客户端:

方法一
用cxf 框架提供的类调用服务.. (需要依赖一个接口,通过wsimport 生成的代码当中获取…)

//创建调用webservice 服务的类...
ClientProxyFactoryBean bean=new ClientProxyFactoryBean();
bean.setAddress("http://192.168.9.100:8080/server");//设置访问地址...
bean.setServiceClass(CxfWebServicePortType.class);//设置服务的接口...
//创建接口类型...
CxfWebServicePortType cxfWebServicePortType=(CxfWebServicePortType) bean.create();
cxfWebServicePortType.sayHello();

方法二

使用cxf 提供类 JaxWsProxyFactoryBean 来调用 webservice 的服务端…….

JaxWsProxyFactoryBean 是  ClientProxyFactoryBean  的子类...
//创建调用服务的类...
JaxWsProxyFactoryBean bean=new JaxWsProxyFactoryBean();
//设置访问地址
bean.setAddress("http://192.168.9.100:7418/userService");
//设置接口类型...
bean.setServiceClass(UserService.class);
UserService us=(UserService) bean.create();String data=us.getUserById(1);System.out.println(data);

调用原则: 总结.

服务端: 客户端
ServerFactoryBean ————ClientProxyFactoryBean
JaxWsServerFactoryBean—————-JaxWsProxyFactoryBean

JaxWsServerFactoryBean 可以发布soap1.2 版本的协议….发布服务的时候,
我们最好被发布的服务类要面向接口编程..

命令:wsdl2java

  wsdl2java 是cxf 框架给我们提供的命令,这个命令的作用与wsimport 类似...

拦截器:

cxf 框架中提供了拦截器的机制,我们可以通过拦截器获取到客户端与服务端进行交互的时候的数据格式
    //创建发布服务的 类...JaxWsServerFactoryBean  bean=new JaxWsServerFactoryBean();//设置对外的访问地址bean.setAddress("http://192.168.9.100:7418/userService");bean.setServiceClass(UserService.class);//设置接口类型...bean.setServiceBean(new UserServiceImpl());//设置接口的实现类...//我们可以在发布服务的时候添加消息拦截器//拦截客户端往服务端 发送的请求的消息bean.getInInterceptors().add(new LoggingInInterceptor());//拦截服务端往客户端返回的消息...bean.getOutInterceptors().add(new LoggingOutInterceptor());bean.create();

cxf 与web 项目的整合

由于cxf的web项目已经集成了Spring所以,cxf的服务类都是在spring的配置文件中完成的。以下是步骤:

  • 第一步:建立一个web项目。
  • 第二步:准备所有jar包。将cxf_home\lib项目下的所有jar包全部copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。
  • 第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
  • 第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。

服务器实现了

发布一个不带接口的webservice

<!-- 1,id,2,服务对外的访问地址,3,提供服务的实现类..  -->
<jaxws:endpoint id="helloService" address="/helloService" implementor="cn.itcast.cxf.spring.HelloService"></jaxws:endpoint>

发布一个带接口的webservice

web.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- 通过服务器启动,解析spring 的配置,可以解决第一次访问org.apache.cxf.transport.servlet.CXFServlet去解析spring配置,导致第一次访问webservice 慢的问题...--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/cxf-servlet.xml</param-value></context-param><servlet><!-- 配置cxf --><servlet-name>cxf</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><init-param><!-- 配置Spring的配置文件 --><param-name>config-location</param-name><!-- 通过servlet 去解析此配置文件,会导致第一次访问很慢,这是一个spring 的配置文件,--><param-value>/WEB-INF/cxf-servlet.xml</param-value><!-- cxf 的启动原理,依托servlet 首先我们在浏览器上面敲地址栏,进入到org.apache.cxf.transport.servlet.CXFServlet执行init 方法  /WEB-INF/cxf-servlet.xml 配置文件//request String basePath=http://localhost:8080/cxfspringweb/ws/helloServiceJaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();bean.setAddress(basePath);//设置服务的访问地址bean.setServerClass(cn.itcast.cxf.spring.HelloService.class);//设置服务的接口bean.setServerBean(Class.for("cn.itcast.cxf.spring.HelloService").newInstance());//设置服务的接口实现类bean.create();//发布--></init-param></servlet><servlet-mapping><servlet-name>cxf</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

cxf-servlet.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><!-- 引入CXF Bean定义如下,早期的版本中使用 --><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" /><!-- 通过配置文件的方式发布一个不带接口的webservice --><!-- 1,id,2,服务对外的访问地址,3,提供服务的实现类..  --><jaxws:endpoint id="helloService" address="/helloService" implementor="cn.itcast.cxf.spring.HelloService"></jaxws:endpoint><!-- 通过此配置发布一个带接口的webservice  --><!-- 1,id2,服务对外的访问地址3,接口的类型--><jaxws:server id="makeCallService" address="/makeCallService" serviceClass="cn.itcast.cxf.spring.call.CallService"><jaxws:serviceBean><!-- 接口的实现类... --><bean class="cn.itcast.cxf.spring.call.CallServiceImpl"></bean></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></beans>

客户端调用

  1. 用wsdl2java生成客户端代码
  2. 编写spring配置文件
  3. 调用

spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsdhttp://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd"><!-- 引入CXF Bean定义如下,早期的版本中使用 --><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" /><!-- 1,id,通过id 获取到bean 2,访问webservice 的服务的地址3,需要依赖接口类型--><jaxws:client id="itcast" address="http://localhost:8080/cxfspringweb/ws/makeCallService" serviceClass="cn.itcast.cxf.spring.call.CallService"></jaxws:client></beans>

调用

package cn.itcast.spring.client;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.itcast.cxf.spring.call.CallService;/*** * 通过配置文件的方式调用webservice,* 同时也需要依赖一个接口....* * @ 作者 zhuwu@itcast.cn**/
public class SpringClientInvoke {/*** @param args*/public static void main(String[] args) {//解析spring配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");//通过getBean 拿到接口 的实例对象...CallService callService=(CallService) context.getBean("itcast");boolean flag=callService.makeCaller("zj");System.out.println(flag);}}

ajax调用webService实现

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
System.out.println(basePath);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><script type="text/javascript" src="js/jquery-1.6.2.js"></script><script type="text/javascript">/**ajax  的xmlHttpRequest 对象可以发送一个http 请求我们可以把服务端需要的xml 格式的数据传送到服务端。模拟soap 请求。**/var itcast;itcast={sendMessage:function(){var data='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://call.spring.cxf.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">';data+='<soapenv:Body><q0:makeCaller><arg0>itcast</arg0></q0:makeCaller></soapenv:Body></soapenv:Envelope>';$.ajax({url: "ws/makeCallService",data:data,contentType:'text/xml;charset=utf-8',type:"POST",dataType:"xml",success: function(data, textStatus, jqXHR){var text=$(data).find("return").text();$(".message").html(text);// $(".message").show(3000);$(".message").slideDown(3000);}});},hide:function(){$(".message").slideUp(3000);}}</script></head><body><input type="button" value="显示" onclick="itcast.sendMessage()"/><input type="button" value="隐藏" onclick="itcast.hide()"/><div class="message" style="border-width: 4xp;border-style: solid;border-color: red;width: 400px;height: 400px;display: none;"></div></body>
</html>

使用JS访问WebService跨域

通过js来访问webservice有两种不同的形式
1、通过SOAP协议进行访问。
发送的全部是XML数据,且必须是POST请求。
2、通过HTTP的get/post方式进行访问。
此种情况又分成不同的形式,此种情况必要在cxf下发布。因为jdk1.6基本的发布不支持Http,soap1.2。
1、发送和接收XML数据。

JS一直存在跨域访问的问题

目前的jQuery不支持跨域访问。如果要进行访问必须使用jQuery的jsonp数据形式。
但原始的ajax可以通过get/post方式跨域访问http上的资源。
以下是通过jaxb发布的webservice。并通过js实现访问webService.

  • 第一步:书写一个webService,通过Endpoint端点服务发布。
  • 第二步:书写XMLHttpRequest的ajax对像。
  • 第三步:设法获取请求webService的XML数据和WebService返回的数据,以便于数据解析。
  • 第四步:书写代码

第一步:书写webService的服务:

这里写图片描述

第二步:创建XMLHttpRequest对像:

这里写图片描述

第三步:设法获取SOAP协议的文本,并在JS中做为发出的XML数据

这里写图片描述

CRUD-Server:

这里写图片描述

CRUD-Client:
这里写图片描述

这里写图片描述

总结

分布与接收webService的方法

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java之IO操作总结

所谓IO&#xff0c;也就是Input与Output的缩写。在java中&#xff0c;IO涉及的范围比较大&#xff0c;这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是&#xff1a; 字符流字节流 其中&#xff0c;字符流有两个抽象类&…

谷歌无人车离奇车祸曝光:人类安全员睡着后,误触关闭了自动驾驶

来源&#xff1a;量子位离奇&#xff0c;真离奇。一场已经被掩盖数月的谷歌无人车&#xff08;Waymo&#xff09;离奇车祸&#xff0c;刚刚被The Information曝光。车祸的发生地&#xff0c;就在距离谷歌加州山景城总部不远的高速公路上。那是一个六月的早晨。一辆Waymo无人车正…

强烈推荐:240多个jQuery插件

概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) &#xff0c;这是其它的 js 库所不及的&#xff0c;它兼容 CSS3&#xff0c;还兼容各种浏览器&#xff08;IE 6.0, FF 1.5, Safari 2.…

揭秘|超乎想象!未来50年将出现的九大黑科技……

来源&#xff1a;世界科技创新论坛Insititute for the Future是一家专门做预测的研究机构。该机构的首席研究总监Mark Frauenfelder详细描述了人类在未来能够用上&#xff0c;而今天却仍被认为不可能发生的事物。赶快一起来看看这些未来将出现的黑科技吧。1、大脑移植&#xff…

Android手绘效果实现

效果图 原理 大概介绍一下实现原理。首先你得有一张图&#xff08;废话~&#xff09;,接下来就是把这张图的轮廓提取出来&#xff0c;轮廓提取算法有很多&#xff0c;本人不是搞图像处理的&#xff0c;对图像处理感兴趣的童鞋可以查看相关资料。如果你有好的轮廓提取算法&…

干货|120页精华PPT详解工业机器人本体设计运算及仿真

来源&#xff1a;哈尔滨工业大学摘要&#xff1a;120页精华PPT详解工业机器人本体设计运算及仿真未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体…

环信SDK集成

利用环信SDK可以实现即时通讯&#xff0c;但在集成的过程中碰到了不少的坑。 注意 选择项目路径&#xff0c;这里以最新版环信demo为例 注意&#xff1a;环信的ChatDemoUI这个demo里边因为研发的同事为了照顾老版本的AndroidStudio使用者&#xff0c;已经用eclipse生成了bui…

协作机器人先驱宣布倒闭!累计融资10.3亿元,贝佐斯投资八轮

来源&#xff1a;量子位一家机器人领域的头部玩家&#xff0c;还不是说倒下就倒下了。上个月&#xff0c;协作机器人的先驱Rethink Robotics刚刚宣布出售第2500个机器人产品&#xff0c;而昨天&#xff0c;就又宣布关门大吉了。CEO Scott Eckert在接受外媒The Robot Report采访…

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA&#xff08;多尺度空洞注意力&#xff09;发表于今年的中科院一区(算是国内计算机领域的最高期刊了)&#xff0c;其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

贝索斯专访:亚马逊帝国大规模业务转型的秘诀

来源&#xff1a;机器之能摘要&#xff1a;这篇文章简明、清晰地揭示出这家似乎没有边界、无拘束公司成功「转身」背后的逻辑与秘诀。与美国的其它科技业巨头不同&#xff0c;亚马逊并没有一个总的企业园区。在其全球的 57.5 万名雇员中&#xff0c;有 4.5 万名员工和管理人员位…

2018及过去20年诺贝尔化学奖获奖者及其贡献!

来源&#xff1a;科学网摘要&#xff1a;2018及过去20年诺贝尔化学奖获奖者及其贡献&#xff01;2018年诺贝尔化学获的获得者为美国科学家Frances H. Arnold, George P. Smith和英国科学家George P.Winter&#xff0c;他们利用进化的力量为人类造福。获奖的内容分别是研究酶的定…

RxJava学习入门

RxJava是什么 一个词&#xff1a;异步。 RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”&#xff08;一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序…

解读2018年诺贝尔化学奖成果:用进化的力量解决化学问题

来源&#xff1a;新华网摘要&#xff1a;新华社斯德哥尔摩&#xff11;&#xff10;月&#xff13;日电 科普&#xff1a;用进化的力量解决化学问题——解读&#xff12;&#xff10;&#xff11;&#xff18;年诺贝尔化学奖成果地球的生命经过长期进化最终获得强大的适应力&am…

在win8下安装使用java及在win8下部署java环境变量-图文

为了反编译APK&#xff0c;不得不安装一些Androidfby、apktool1.4.1、dex2jar-0.0.9.9等&#xff0c;甚至连DW也安装了&#xff0c;但是我的电脑是win8X64的&#xff0c;也就是64位的win8系统&#xff0c;这就有点头疼了&#xff0c;出现了&#xff1a; 不是内部或外部命令&…

国际运营商智慧城市探索与实践

来源&#xff1a;中国信息通信研究院CAICT摘要&#xff1a;AT&T、SKT、沃达丰在智慧城市领域探索的经验。2008年11月&#xff0c;IBM提出“智慧地球” 理念引发产业界热议&#xff0c;2010年&#xff0c;该公司进一步提出“智慧城市”愿景作为“智慧地球”在城市运营中的具…

Retrofit学习入门

Retrofit的使用 设置权限与添加依赖 定义请求接口通过创建一个retrofit生成一个接口的实现类(动态代理)调用接口请求数据 设置权限与添加依赖 权限&#xff1a;首先确保在AndroidManifest.xml中请求了网络权限 &#xff1a; <uses-permission android:name"android…

autotools入门笔记(一)

GNU autotools作用&#xff1a;收集系统配置信息并自动生成Makefile文件。 GNU autotools主要包括三个工具&#xff1a;autoconf、automake、libtool&#xff0c;还有很多辅助的工具&#xff0c;包括&#xff1a;autoheader、aclocal、autoscan。 ● autoscan检测源文件生成con…

本田、大众宣布智能路口研究新进展 以安全为重点

编译&#xff1a;网易智能摘要&#xff1a;每年&#xff0c;在十字路口发生的交通事故约占交通事故死亡人数的20%&#xff0c;这就是为什么汽车制造商和供应商都下定决心要创造出智能的十字路口&#xff0c;利用尖端技术来减少&#xff08;或者最好是能够避免&#xff09;在十字…

智能连接:5G、AI和IoT的组合如何改变美洲

来源&#xff1a;199IT互联网数据中心摘要&#xff1a;GSMA发布了新报告“智能连接&#xff1a;5G、AI和IoT的组合如何改变美洲”&#xff0c;强调了该地区如何从这些科技中受益。GSMA Intelligence预测&#xff0c;到2025年全球5G连接数量将达到13亿&#xff0c;覆盖全球40%的…

刚刚,生物学横扫诺贝尔3大奖,两名女性获奖!化学奖授予试管中的“进化论”...

来源&#xff1a;Deeptech深科技北京时间 10 月 3 日下午 5 点 45 分&#xff0c;2018 诺贝尔化学奖揭晓——诺贝尔委员会宣布&#xff0c;将此奖项一半颁给女科学家Frances H. Arnold&#xff0c;另一半则由George P. Smith、 Gregory P. Winter两人共享。此次诺贝尔化学奖表彰…