`

Spring整合CXF,发布RSETful 风格WebService

 
阅读更多

这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述了。如果你对Spring整合CXF WebService不了解,具体你可以参看这两篇文章:

http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html

http://www.cnblogs.com/hoojo/archive/2012/07/13/2590593.html

如果你不了解restful风格的WebService,你可以参考:

http://www.oracle.com/technetwork/articles/javase/index-137171.html

SpringMVC对RESTful的支持:

http://www.cnblogs.com/hoojo/archive/2011/06/10/2077422.html

使用 Jersey框架,搭建RESTful WebService(这个也比较简单)

http://www.ibm.com/developerworks/cn/web/wa-aj-tomcat/

官方文档:http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e8

其中,比较常用的RESTful框架就有Jersey、Spring REST、CXF RESTful,这些都可以很好的整合Spring框架,发布也相当的简单。且简单、易用、易上手,文档也比较丰富。

 

开发环境:

System:Windows

JavaEE Server:tomcat6

JavaSDK: jdk6+

IDE:eclipse、MyEclipse 6.6

 

开发依赖库:

JDK6、 JavaEE5、CXF-2.3.3、Spring 3.0.4

Email:hoojo_@126.com

Blog:http://blog.csdn.net/IBM_hoojo

http://hoojo.cnblogs.com/

http://hoojo.blogjava.net

 

下面我们就接着http://www.cnblogs.com/hoojo/archive/2011/03/30/1999563.html这篇文章,开始我们CXF RESTful WebService的旅程,enjoy~!^_*

 

准备工作

首先,你需要添加相关的jar包

image

其中,jsr331-api-1.1.1.jar是必须的,利用CXF发布REST服务得用到它,在cxf的lib库中可以找到这个jar。

下载地址:http://www.apache.org/dyn/closer.cgi?path=/cxf/2.3.11/apache-cxf-2.3.11.zip

其它的jar包都是非必须的!

JavaEntity

package com.hoo.entity;
<!--CRLF-->
 
<!--CRLF-->
import java.util.Map;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> MapBean 封装Map集合元素
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate 2012-7-20 下午01:22:31
<!--CRLF-->
 * @file MapBean.java
<!--CRLF-->
 * @package com.hoo.entity
<!--CRLF-->
 * @project CXFWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
@XmlRootElement
<!--CRLF-->
public class MapBean {
<!--CRLF-->
    private Map<String, User> map;
<!--CRLF-->
    
<!--CRLF-->
    //@XmlElement(type = User.class)
<!--CRLF-->
    public Map<String, User> getMap() {
<!--CRLF-->
        return map;
<!--CRLF-->
    }
<!--CRLF-->
    public void setMap(Map<String, User> map) {
<!--CRLF-->
        this.map = map;
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

 

package com.hoo.entity;
<!--CRLF-->
 
<!--CRLF-->
import java.util.HashMap;
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> Users Entity
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate 2011-3-18 上午09:27:31
<!--CRLF-->
 * @file Users.java
<!--CRLF-->
 * @package com.hoo.entity
<!--CRLF-->
 * @project CXFWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
@XmlRootElement(name = "UserInfos")
<!--CRLF-->
public class Users {
<!--CRLF-->
    private List<User> users;
<!--CRLF-->
    
<!--CRLF-->
    private User[] userArr;
<!--CRLF-->
    
<!--CRLF-->
    private HashMap<String, User> maps;
<!--CRLF-->
    
<!--CRLF-->
    
<!--CRLF-->
   // getter/setter
<!--CRLF-->
}
<!--CRLF-->
package com.hoo.entity;
<!--CRLF-->
 
<!--CRLF-->
import java.io.Serializable;
<!--CRLF-->
import javax.xml.bind.annotation.XmlRootElement;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b>User Entity
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate Dec 16, 2010 10:20:02 PM
<!--CRLF-->
 * @file User.java
<!--CRLF-->
 * @package com.hoo.entity
<!--CRLF-->
 * @project AxisWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
@XmlRootElement(name = "UserInfo")
<!--CRLF-->
public class User implements Serializable {
<!--CRLF-->
    private static final long serialVersionUID = 677484458789332877L;
<!--CRLF-->
    private int id;
<!--CRLF-->
    private String name;
<!--CRLF-->
    private String email;
<!--CRLF-->
    private String address;
<!--CRLF-->
    
<!--CRLF-->
    //getter/setter
<!--CRLF-->
    
<!--CRLF-->
    @Override
<!--CRLF-->
    public String toString() {
<!--CRLF-->
        return this.id + "#" + this.name + "#" + this.email + "#" + this.address;
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

一、定义你的WebService的接口RESTSample.java,代码如下

package com.hoo.service;
<!--CRLF-->
 
<!--CRLF-->
import java.io.IOException;
<!--CRLF-->
import javax.servlet.http.HttpServletRequest;
<!--CRLF-->
import javax.servlet.http.HttpServletResponse;
<!--CRLF-->
import javax.ws.rs.Consumes;
<!--CRLF-->
import javax.ws.rs.DELETE;
<!--CRLF-->
import javax.ws.rs.GET;
<!--CRLF-->
import javax.ws.rs.POST;
<!--CRLF-->
import javax.ws.rs.PUT;
<!--CRLF-->
import javax.ws.rs.Path;
<!--CRLF-->
import javax.ws.rs.PathParam;
<!--CRLF-->
import javax.ws.rs.Produces;
<!--CRLF-->
import javax.ws.rs.core.Context;
<!--CRLF-->
import javax.ws.rs.core.MediaType;
<!--CRLF-->
 
<!--CRLF-->
import com.hoo.entity.MapBean;
<!--CRLF-->
import com.hoo.entity.User;
<!--CRLF-->
import com.hoo.entity.Users;
<!--CRLF-->
 
<!--CRLF-->
 
<!--CRLF-->
/*
<!--CRLF-->
     注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。 
<!--CRLF-->
    @Path:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/RESTful/rest/hello。 
<!--CRLF-->
    @GET:这意味着以下方法可以响应 HTTP GET 方法。 
<!--CRLF-->
    @Produces:以纯文本方式定义响应内容 MIME 类型。
<!--CRLF-->

<!--CRLF-->
    @Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。 
<!--CRLF-->
    @Path("{contact}"):这是 @Path 注释,与根路径 “/contacts” 结合形成子资源的 URI。 
<!--CRLF-->
    @PathParam("contact"):该注释将参数注入方法参数的路径,在本例中就是联系人 id。其他可用的注释有 @FormParam、@QueryParam 等。 
<!--CRLF-->
    @Produces:响应支持多个 MIME 类型。在本例和上一个示例中,APPLICATION/XML 将是默认的 MIME 类型。
<!--CRLF-->
 */
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> CXF RESTful风格WebService
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate 2012-7-20 下午01:23:04
<!--CRLF-->
 * @file RESTSampleSource.java
<!--CRLF-->
 * @package com.hoo.service
<!--CRLF-->
 * @project CXFWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
@Path(value = "/sample")
<!--CRLF-->
public interface RESTSample {
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Produces(MediaType.TEXT_PLAIN)
<!--CRLF-->
    public String doGet();
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Produces(MediaType.TEXT_PLAIN)
<!--CRLF-->
    @Path("/request/{param}")
<!--CRLF-->
    public String doRequest(@PathParam("param") String param, 
<!--CRLF-->
            @Context HttpServletRequest servletRequest, @Context HttpServletResponse servletResponse);
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/bean/{id}")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
    public User getBean(@PathParam("id") int id);
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/list")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
<!--CRLF-->
    public Users getList();
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/map")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
    public MapBean getMap();
<!--CRLF-->
    
<!--CRLF-->
    /*
<!--CRLF-->
        @Consumes:声明该方法使用 HTML FORM。 
<!--CRLF-->
        @FormParam:注入该方法的 HTML 属性确定的表单输入。 
<!--CRLF-->
        @Response.created(uri).build(): 构建新的 URI 用于新创建的联系人(/contacts/{id})并设置响应代码(201/created)。
<!--CRLF-->
        您可以使用 http://localhost:8080/Jersey/rest/contacts/<id> 访问新联系人
<!--CRLF-->
     */
<!--CRLF-->
    @POST
<!--CRLF-->
    @Path("/postData")
<!--CRLF-->
    public User postData(User user) throws IOException;
<!--CRLF-->
    
<!--CRLF-->
    @PUT
<!--CRLF-->
    @Path("/putData/{id}")
<!--CRLF-->
    @Consumes(MediaType.APPLICATION_XML)
<!--CRLF-->
    public User putData(@PathParam("id") int id, User user);
<!--CRLF-->
    
<!--CRLF-->
    @DELETE
<!--CRLF-->
    @Path("/removeData/{id}")
<!--CRLF-->
    public void deleteData(@PathParam("id") int id);
<!--CRLF-->
}
<!--CRLF-->

 

二、RESTSample接口的实现,这里我们只是简单的实现下,并不是涉及实际的具体业务

package com.hoo.service;
<!--CRLF-->
 
<!--CRLF-->
import java.io.IOException;
<!--CRLF-->
import java.util.ArrayList;
<!--CRLF-->
import java.util.HashMap;
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import java.util.Map;
<!--CRLF-->
import javax.servlet.http.HttpServletRequest;
<!--CRLF-->
import javax.servlet.http.HttpServletResponse;
<!--CRLF-->
import javax.ws.rs.DELETE;
<!--CRLF-->
import javax.ws.rs.GET;
<!--CRLF-->
import javax.ws.rs.POST;
<!--CRLF-->
import javax.ws.rs.PUT;
<!--CRLF-->
import javax.ws.rs.Path;
<!--CRLF-->
import javax.ws.rs.PathParam;
<!--CRLF-->
import javax.ws.rs.Produces;
<!--CRLF-->
import javax.ws.rs.core.Context;
<!--CRLF-->
import javax.ws.rs.core.MediaType;
<!--CRLF-->
import javax.ws.rs.core.Request;
<!--CRLF-->
import javax.ws.rs.core.UriInfo;
<!--CRLF-->
import com.hoo.entity.MapBean;
<!--CRLF-->
import com.hoo.entity.User;
<!--CRLF-->
import com.hoo.entity.Users;
<!--CRLF-->
 
<!--CRLF-->
 
<!--CRLF-->
/*
<!--CRLF-->
     注释(Annotation):在 javax.ws.rs.* 中定义,是 JAX-RS (JSR 311) 规范的一部分。 
<!--CRLF-->
    @Path:定义资源基 URI。由上下文根和主机名组成,资源标识符类似于 http://localhost:8080/RESTful/rest/hello。 
<!--CRLF-->
    @GET:这意味着以下方法可以响应 HTTP GET 方法。 
<!--CRLF-->
    @Produces:以纯文本方式定义响应内容 MIME 类型。
<!--CRLF-->

<!--CRLF-->
    @Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。 
<!--CRLF-->
    @Path("{contact}"):这是 @Path 注释,与根路径 “/contacts” 结合形成子资源的 URI。 
<!--CRLF-->
    @PathParam("contact"):该注释将参数注入方法参数的路径,在本例中就是联系人 id。其他可用的注释有 @FormParam、@QueryParam 等。 
<!--CRLF-->
    @Produces:响应支持多个 MIME 类型。在本例和上一个示例中,APPLICATION/XML 将是默认的 MIME 类型。
<!--CRLF-->
 */
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> CXF RESTful风格WebService
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate 2012-7-20 下午01:23:04
<!--CRLF-->
 * @file RESTSampleSource.java
<!--CRLF-->
 * @package com.hoo.service
<!--CRLF-->
 * @project CXFWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
@Path(value = "/sample")
<!--CRLF-->
public class RESTSampleSource implements RESTSample {
<!--CRLF-->
    
<!--CRLF-->
    @Context
<!--CRLF-->
    private UriInfo uriInfo;
<!--CRLF-->
    
<!--CRLF-->
    @Context
<!--CRLF-->
    private Request request;
<!--CRLF-->
 
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Produces(MediaType.TEXT_PLAIN)
<!--CRLF-->
    public String doGet() {
<!--CRLF-->
        return "this is get rest request";
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Produces(MediaType.TEXT_PLAIN)
<!--CRLF-->
    @Path("/request/{param}")
<!--CRLF-->
    public String doRequest(@PathParam("param") String param, 
<!--CRLF-->
            @Context HttpServletRequest servletRequest, @Context HttpServletResponse servletResponse) {
<!--CRLF-->
        System.out.println(servletRequest);
<!--CRLF-->
        System.out.println(servletResponse);
<!--CRLF-->
        System.out.println(servletRequest.getParameter("param"));
<!--CRLF-->
        System.out.println(servletRequest.getContentType());
<!--CRLF-->
        System.out.println(servletResponse.getCharacterEncoding());
<!--CRLF-->
        System.out.println(servletResponse.getContentType());
<!--CRLF-->
        return "success";
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/bean/{id}")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
    public User getBean(@PathParam("id") int id) {
<!--CRLF-->
        System.out.println("####getBean#####");
<!--CRLF-->
        System.out.println("id:" + id);
<!--CRLF-->
        System.out.println("Method:" + request.getMethod());
<!--CRLF-->
        System.out.println("uri:" + uriInfo.getPath());
<!--CRLF-->
        System.out.println(uriInfo.getPathParameters());
<!--CRLF-->
        
<!--CRLF-->
        User user = new User();
<!--CRLF-->
        user.setId(id);
<!--CRLF-->
        user.setName("JojO");
<!--CRLF-->
        return user;
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/list")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
<!--CRLF-->
    public Users getList() {
<!--CRLF-->
        System.out.println("####getList#####");
<!--CRLF-->
        System.out.println("Method:" + request.getMethod());
<!--CRLF-->
        System.out.println("uri:" + uriInfo.getPath());
<!--CRLF-->
        System.out.println(uriInfo.getPathParameters());
<!--CRLF-->
        
<!--CRLF-->
        List<User> list = new ArrayList<User>();
<!--CRLF-->
        User user = null;
<!--CRLF-->
        for (int i = 0; i < 4;i ++) {
<!--CRLF-->
            user = new User();
<!--CRLF-->
            user.setId(i);
<!--CRLF-->
            user.setName("JojO-" + i);
<!--CRLF-->
            list.add(user);
<!--CRLF-->
        }
<!--CRLF-->
        Users users = new Users();
<!--CRLF-->
        users.setUsers(list);
<!--CRLF-->
        return users;
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @GET
<!--CRLF-->
    @Path("/map")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
    public MapBean getMap() {
<!--CRLF-->
        System.out.println("####getMap#####");
<!--CRLF-->
        System.out.println("Method:" + request.getMethod());
<!--CRLF-->
        System.out.println("uri:" + uriInfo.getPath());
<!--CRLF-->
        System.out.println(uriInfo.getPathParameters());
<!--CRLF-->
        
<!--CRLF-->
        Map<String, User> map = new HashMap<String, User>();
<!--CRLF-->
        User user = null;
<!--CRLF-->
        for (int i = 0; i < 4;i ++) {
<!--CRLF-->
            user = new User();
<!--CRLF-->
            user.setId(i);
<!--CRLF-->
            user.setName("JojO-" + i);
<!--CRLF-->
            map.put("key-" + i, user);
<!--CRLF-->
        }
<!--CRLF-->
        MapBean bean = new MapBean();
<!--CRLF-->
        bean.setMap(map);
<!--CRLF-->
        return bean;
<!--CRLF-->
    }    
<!--CRLF-->
    
<!--CRLF-->
    /*
<!--CRLF-->
        @Consumes:声明该方法使用 HTML FORM。 
<!--CRLF-->
        @FormParam:注入该方法的 HTML 属性确定的表单输入。 
<!--CRLF-->
        @Response.created(uri).build(): 构建新的 URI 用于新创建的联系人(/contacts/{id})并设置响应代码(201/created)。
<!--CRLF-->
        您可以使用 http://localhost:8080/Jersey/rest/contacts/<id> 访问新联系人
<!--CRLF-->
     */
<!--CRLF-->
    @POST
<!--CRLF-->
    @Path("/postData")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
    public User postData(User user) throws IOException {
<!--CRLF-->
        System.out.println(user);
<!--CRLF-->
        user.setName("jojo##12321321");
<!--CRLF-->
        return user;
<!--CRLF-->
    } 
<!--CRLF-->
    
<!--CRLF-->
    @PUT
<!--CRLF-->
    @Path("/putData/{id}")
<!--CRLF-->
    @Produces({ MediaType.APPLICATION_XML })
<!--CRLF-->
    public User putData(@PathParam("id") int id, User user) {
<!--CRLF-->
        System.out.println("#####putData#####");
<!--CRLF-->
        System.out.println(user);
<!--CRLF-->
        user.setId(id);
<!--CRLF-->
        user.setAddress("hoojo#gz");
<!--CRLF-->
        user.setEmail("hoojo_@126.com");
<!--CRLF-->
        user.setName("hoojo");
<!--CRLF-->
        System.out.println(user);
<!--CRLF-->
        return user;
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @DELETE
<!--CRLF-->
    @Path("/removeData/{id}")
<!--CRLF-->
    public void deleteData(@PathParam("id") int id) {
<!--CRLF-->
        System.out.println("#######deleteData#######" + id);
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->
三、配置我们的WebService,修改applicationContext-server.xml。这里主要是添加jaxrs标签的支持,修改头部文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--CRLF-->
<beans xmlns="http://www.springframework.org/schema/beans"
<!--CRLF-->
    xmlns:context="http://www.springframework.org/schema/context"
<!--CRLF-->
    xmlns:jaxws="http://cxf.apache.org/jaxws"
<!--CRLF-->
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
<!--CRLF-->
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--CRLF-->
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
<!--CRLF-->
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
<!--CRLF-->
    http://www.springframework.org/schema/context
<!--CRLF-->
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
<!--CRLF-->
    http://cxf.apache.org/jaxws 
<!--CRLF-->
    http://cxf.apache.org/schemas/jaxws.xsd
<!--CRLF-->
    http://cxf.apache.org/jaxrs
<!--CRLF-->
    http://cxf.apache.org/schemas/jaxrs.xsd">
<!--CRLF-->
特别注意上面加粗带下划线的部分,这是新增加的配置。我们发布restful WebService需要用到它。
然后在配置文件中添加如下配置
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<!--CRLF-->
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<!--CRLF-->
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<!--CRLF-->
<bean id="restSample" class="com.hoo.service.RESTSampleSource"/>
<!--CRLF-->
<!-- 这里的地址很重要,客户端需要通过这个地址来访问WebService -->
<!--CRLF-->
<jaxrs:server id="restServiceContainer" address="/rest">
<!--CRLF-->
    <jaxrs:serviceBeans>
<!--CRLF-->
        <ref bean="restSample" />
<!--CRLF-->
    </jaxrs:serviceBeans>
<!--CRLF-->
    <jaxrs:extensionMappings>
<!--CRLF-->
        <entry key="json" value="application/json" />
<!--CRLF-->
        <entry key="xml" value="application/xml" />
<!--CRLF-->
    </jaxrs:extensionMappings>
<!--CRLF-->
    <jaxrs:languageMappings>
<!--CRLF-->
           <entry key="en" value="en-gb"/>  
<!--CRLF-->
    </jaxrs:languageMappings>
<!--CRLF-->
</jaxrs:server>
<!--CRLF-->

 

 

这样服务器端就完成了CXF RESTful WebService的发布,启动你的tomcat。然后在浏览器中服务地址:http://localhost:8000/CXFWebService/ (其实这里请求的是CXFServlet,你可以看看上一篇Spring整合CXF文章的web.xml的配置)

你就可以看到我们这里刚刚发布的RESTSample rest的WebService

image 

你也可以看看里面的xml,也就是WebService的wsdl文件内容。我们找一个GET方式的WebService的方法,在浏览器中调用一下试试

http://localhost:8000/CXFWebService/rest/sample/bean/123

这个url对应到下面这个方法

@GET
<!--CRLF-->
@Path("/bean/{id}")
<!--CRLF-->
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
<!--CRLF-->
public User getBean(@PathParam("id") int id)
<!--CRLF-->

结果如下

image

一篇xml文档内容。

 

四、编写客户端代码,调用RESTful WebService

package com.hoo.client;
<!--CRLF-->
 
<!--CRLF-->
import java.io.IOException;
<!--CRLF-->
import javax.ws.rs.core.MediaType;
<!--CRLF-->
import org.apache.cxf.jaxrs.client.WebClient;
<!--CRLF-->
import org.junit.After;
<!--CRLF-->
import org.junit.Before;
<!--CRLF-->
import org.junit.Test;
<!--CRLF-->
import org.springframework.context.ApplicationContext;
<!--CRLF-->
import org.springframework.context.support.ClassPathXmlApplicationContext;
<!--CRLF-->
import com.hoo.entity.MapBean;
<!--CRLF-->
import com.hoo.entity.User;
<!--CRLF-->
import com.hoo.entity.Users;
<!--CRLF-->
import com.hoo.service.RESTSample;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> RESTful风格WebService
<!--CRLF-->
 * @author hoojo
<!--CRLF-->
 * @createDate 2012-7-20 下午03:31:03
<!--CRLF-->
 * @file RSETServiceClient.java
<!--CRLF-->
 * @package com.hoo.client
<!--CRLF-->
 * @project CXFWebService
<!--CRLF-->
 * @blog http://blog.csdn.net/IBM_hoojo
<!--CRLF-->
 * @email hoojo_@126.com
<!--CRLF-->
 * @version 1.0
<!--CRLF-->
 */
<!--CRLF-->
public class RSETServiceClient {
<!--CRLF-->
 
<!--CRLF-->
    private static WebClient client;
<!--CRLF-->
    
<!--CRLF-->
    @Before
<!--CRLF-->
    public void init() {
<!--CRLF-->
        // 手动创建webClient对象,注意这里的地址是发布的那个/rest地址
<!--CRLF-->
        //String url = "http://localhost:8000/CXFWebService/rest/";
<!--CRLF-->
        //client = WebClient.create(url);
<!--CRLF-->
 
<!--CRLF-->
        // 从Spring Ioc容器中拿webClient对象
<!--CRLF-->
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
<!--CRLF-->
        client = ctx.getBean("webClient", WebClient.class);
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @After
<!--CRLF-->
    public void destory(){
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testGet() {
<!--CRLF-->
        System.out.println(client.path("sample").accept(MediaType.TEXT_PLAIN).get(String.class));
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testRequest() {
<!--CRLF-->
        System.out.println(client.path("sample/request/234234").accept(MediaType.TEXT_PLAIN).get(String.class));
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testBean() {
<!--CRLF-->
        User user = client.path("sample/bean/{id}", 25).accept(MediaType.APPLICATION_XML).get(User.class);
<!--CRLF-->
        System.out.println(user);
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testList() {
<!--CRLF-->
        System.out.println(client.path("sample/list").accept(MediaType.APPLICATION_XML).get(Users.class).getUsers());
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testMap() {
<!--CRLF-->
        System.out.println(client.path("sample/map").accept(MediaType.APPLICATION_XML).get(MapBean.class).getMap());
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testDeleteData() {
<!--CRLF-->
        client.path("sample/removeData/23").delete();
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testPostData() {
<!--CRLF-->
        User user = new User();
<!--CRLF-->
        user.setId(21432134);
<!--CRLF-->
        user.setAddress("hoojo#gz");
<!--CRLF-->
        user.setEmail("hoojo_@126.com");
<!--CRLF-->
        user.setName("hoojo");
<!--CRLF-->
        System.out.println(client.path("sample/postData").accept(MediaType.APPLICATION_XML).post(user, User.class));
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Test
<!--CRLF-->
    public void testPutData() {
<!--CRLF-->
        User user = new User();
<!--CRLF-->
        user.setId(21432134);
<!--CRLF-->
        System.out.println(client.path("sample/putData/1").accept(MediaType.APPLICATION_XML).put(user).getEntity());
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->
如果你喜欢用Spring的方式,还需要在applicationContext-client.xml中增加如下配置
<?xml version="1.0" encoding="UTF-8"?>
<!--CRLF-->
<beans xmlns="http://www.springframework.org/schema/beans"
<!--CRLF-->
    xmlns:context="http://www.springframework.org/schema/context"
<!--CRLF-->
    xmlns:jaxws="http://cxf.apache.org/jaxws"
<!--CRLF-->
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--CRLF-->
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
<!--CRLF-->
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
<!--CRLF-->
    http://www.springframework.org/schema/context
<!--CRLF-->
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
<!--CRLF-->
    http://cxf.apache.org/jaxws 
<!--CRLF-->
    http://cxf.apache.org/schemas/jaxws.xsd">
<!--CRLF-->
    
<!--CRLF-->
    <bean id="webClient" class="org.apache.cxf.jaxrs.client.WebClient" factory-method="create">
<!--CRLF-->
        <constructor-arg type="java.lang.String" value="http://localhost:8000/CXFWebService/rest/" />
<!--CRLF-->
    </bean>
<!--CRLF-->
    
<!--CRLF-->
</beans>
<!--CRLF-->

 

这种是利用WebClient对象来调用WebService,还有一种方法也可以调用WebService,代码如下:

// 手动创建
<!--CRLF-->
//RESTSample sample = JAXRSClientFactory.create("http://localhost:8000/CXFWebService/rest", RESTSample.class);
<!--CRLF-->
 
<!--CRLF-->
// 从Spring Ioc容器中拿webClient对象
<!--CRLF-->
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");
<!--CRLF-->
RESTSample sample = ctx.getBean("restSampleBean", RESTSample.class);
<!--CRLF-->
 
<!--CRLF-->
System.out.println(sample);
<!--CRLF-->
 
<!--CRLF-->
System.out.println(sample.doGet());
<!--CRLF-->
//System.out.println(sample.doRequest("haha", null, null));
<!--CRLF-->
System.out.println(sample.getBean(22));
<!--CRLF-->
System.out.println(sample.getList());
<!--CRLF-->
System.out.println(sample.getMap().getMap());
<!--CRLF-->
User user = new User();
<!--CRLF-->
user.setId(21432134);
<!--CRLF-->
user.setAddress("hoojo#gz");
<!--CRLF-->
user.setEmail("hoojo_@126.com");
<!--CRLF-->
user.setName("hoojo");
<!--CRLF-->
System.out.println(sample.postData(user));
<!--CRLF-->
System.out.println(sample.putData(111, user));
<!--CRLF-->
sample.deleteData(2);
<!--CRLF-->

这种方式相对比WebClient要简单,直接使用接口中的方法即可。同样如果你要整合到Spring可以在applicationContext-client.xml中增加配置如下:

<bean id="restSampleBean" class="org.apache.cxf.jaxrs.client.JAXRSClientFactory" factory-method="create">
<!--CRLF-->
    <constructor-arg type="java.lang.String" value="http://localhost:8000/CXFWebService/rest/" />
<!--CRLF-->
    <constructor-arg type="java.lang.Class" value="com.hoo.service.RESTSample" />
<!--CRLF-->
</bean>
<!--CRLF-->

 

执行以上方法可以看到控制台打印结果如下:

client console
<!--CRLF-->
org.apache.cxf.jaxrs.client.ClientProxyImpl@1cf7491
<!--CRLF-->
this is get rest request
<!--CRLF-->
22#JojO#null#null
<!--CRLF-->
com.hoo.entity.Users@16eb6bc
<!--CRLF-->
{key-0=0#JojO-0#null#null, key-1=1#JojO-1#null#null, key-2=2#JojO-2#null#null, key-3=3#JojO-3#null#null}
<!--CRLF-->
21432134#jojo##12321321#hoojo_@126.com#hoojo#gz
<!--CRLF-->
111#hoojo#hoojo_@126.com#hoojo#gz
<!--CRLF-->
 
<!--CRLF-->
server console
<!--CRLF-->
####getBean#####
<!--CRLF-->
id:22
<!--CRLF-->
Method:GET
<!--CRLF-->
uri:sample/bean/22
<!--CRLF-->
{id=[22]}
<!--CRLF-->
####getList#####
<!--CRLF-->
Method:GET
<!--CRLF-->
uri:sample/list
<!--CRLF-->
{}
<!--CRLF-->
####getMap#####
<!--CRLF-->
Method:GET
<!--CRLF-->
uri:sample/map
<!--CRLF-->
{}
<!--CRLF-->
21432134#hoojo#hoojo_@126.com#hoojo#gz
<!--CRLF-->
#####putData#####
<!--CRLF-->
21432134#hoojo#hoojo_@126.com#hoojo#gz
<!--CRLF-->
111#hoojo#hoojo_@126.com#hoojo#gz
<!--CRLF-->
#######deleteData#######2
<!--CRLF-->

 

 

就这样,整合restful WebService成功。

分享到:
评论

相关推荐

    MATLAB实现的语音信号加密解密系统设计与应用 - GUI界面交互与相位扰动加密技术

    内容概要:本文详细介绍了基于MATLAB的语音信号加密解密系统的开发过程及其关键技术。系统主要分为三大模块:录音、加密和解密。录音功能利用audiorecorder对象进行音频采集,支持多种采样率设置。加密算法采用了相位扰动方法,通过傅里叶变换将语音信号转换到频域,添加随机相位偏移并用密码作为随机种子确保唯一性和安全性。解密过程则是逆向操作,通过正确的密码恢复原始相位。此外,系统还包括了一个友好的图形用户界面(GUI),方便用户操作和查看波形变化。文中还探讨了一些实际应用中的挑战,如硬件兼容性和误码容忍度等问题。 适用人群:适用于对语音信号处理、信息安全以及MATLAB编程感兴趣的科研人员和技术爱好者。 使用场景及目标:本系统可用于保护隐私通话、防止窃听等场合,旨在提供一种简单易用且高效的语音加密解决方案。它不仅能够满足日常生活中对于私人对话安全性的需求,也为相关领域的研究提供了有价值的参考资料。 其他说明:作者分享了许多开发过程中遇到的问题及解决办法,强调了细节处理的重要性。例如,针对不同设备间的采样率差异进行了适配调整;为了提高用户体验,加入了密码记忆功能和支持中文密码等功能。

    YTCB2509 非接触式转速测量仪 20250323

    题目:非接触式转速测量仪 主控:STM32 显示屏:Oled 电机驱动:L298 电机(带编码器可测速的三线电机) 按键(增速或者减速等)

    基于MATLAB的含齿轮啮合误差激励的轴系动力学建模与Newmark-β法实现

    内容概要:本文详细介绍了如何利用MATLAB实现含齿轮啮合误差激励的轴系动力学模型。首先,文章解释了为什么传统欧拉梁理论在轴系建模时存在局限性,并引入了Timoshenko梁单元来考虑剪切变形和转动惯量。接着,重点讲解了Newmark-β法的具体实现步骤,包括预处理系数矩阵、迭代公式的推导以及如何处理时变刚度和误差激励。此外,还提供了关于稀疏矩阵优化、频谱分析等方面的实用技巧。最后,通过具体案例演示了整个仿真的流程和注意事项。 适合人群:机械工程领域的研究人员和技术人员,尤其是那些从事齿轮传动系统振动分析工作的专业人士。 使用场景及目标:适用于需要精确模拟齿轮传动轴系动态特性的场合,如汽车变速箱、风力发电机等设备的设计与故障诊断。主要目标是提高仿真精度,缩短计算时间,从而更好地指导实际工程应用。 其他说明:文中不仅给出了详细的数学推导和代码实现,还分享了许多宝贵的实践经验,如如何避免常见的数值不稳定性和调试技巧等。这使得读者不仅能学到理论知识,还能掌握解决实际问题的方法。

    增材制造中元胞自动机模拟枝晶生长及CET转变的Matlab实现

    内容概要:本文详细介绍了如何使用元胞自动机(Cellular Automaton, CA)和Matlab来模拟增材制造过程中微观组织的生长,尤其是枝晶生长及其从柱状晶到等轴晶的转变(CET)。首先解释了元胞自动机的基本概念,即通过定义网格和状态转移规则来模拟微观结构的变化。接着给出了具体的Matlab代码实现步骤,包括初始化、生长规则制定、枝晶生长模拟以及CET转变的模拟方法。文中还探讨了温度梯度、晶核密度等参数对CET转变的影响,并提供了优化后的高效算法版本。最后强调了此类仿真的重要性和应用价值,如帮助预测和优化增材制造产品的微观结构和性能。 适合人群:从事材料科学、增材制造领域的研究人员和技术人员,以及对元胞自动机和材料微观结构建模感兴趣的学习者。 使用场景及目标:①用于研究和教学,帮助理解和掌握增材制造过程中微观组织演变规律;②辅助工业生产中的工艺参数选择,提高产品质量;③为后续更复杂的多物理场耦合仿真提供基础。 其他说明:随文附带完整的源代码和相关文献资料,便于读者深入学习和扩展研究。

    房地产 -阿那亚生活式品牌社群运营 -读懂生活式品牌的社群运营 .pptx

    房地产 -阿那亚生活式品牌社群运营 -读懂生活式品牌的社群运营 .pptx

    基于自抗扰控制的预测函数控制(PFC)在永磁同步电机(PMSM)中的高效应用

    内容概要:本文详细介绍了基于自抗扰控制的预测函数控制(PFC)在永磁同步电机(PMSM)中的应用。首先阐述了PFC的基本概念及其相对于其他模型预测控制的优势,特别是其在快速响应和鲁棒性方面的表现。接着,文章深入探讨了三个关键技术:1.5延时补偿、全电压前馈补偿和扩展状态观测器(ESO)。1.5延时补偿通过线性外推解决计算延时问题;全电压前馈补偿利用电压信息提前调整控制输入,增强响应速度;ESO则用于实时观测并补偿系统中的不确定因素。此外,文中还提供了具体的代码示例,展示了这些技术的实际应用效果。最终,实验结果显示,采用PFC结合自抗扰控制的方法可以显著改善PMSM的速度控制性能,特别是在应对负载扰动方面。 适合人群:从事电机控制领域的工程师和技术研究人员,尤其是关注永磁同步电机控制的从业者。 使用场景及目标:适用于需要对永磁同步电机进行精确、快速响应控制的应用场景,如工业机器人、自动化生产线等。主要目标是提高电机控制系统的稳定性、响应速度和抗干扰能力。 其他说明:文章不仅理论讲解详尽,还附有大量实用的代码片段,便于读者理解和实践。同时提醒读者在实际应用中需要注意参数调整和系统噪声的影响。

    ### 中国企业级SaaS上市公司2023-2024年财务绩效回顾及未来展望、前言

    内容概要:本文聚焦中国企业级SaaS上市公司2023-2024年的财务绩效,通过详尽的数据分析和行业趋势展望,揭示了该领域的发展现状与未来方向。文章指出,尽管收入和毛利持续增长,但整体毛利率偏低,销售费用率高企,研发投入大,盈利艰难,资产周转效率下降,现金流承压等问题普遍存在。针对这些问题,提出了提升客户价值、深耕行业、延伸商业价值、审视并购可能性、盈利模式多样化、抓住AIGC(生成式人工智能)机遇、把握出海机遇以及积极利用资本市场等策略建议。未来,企业级SaaS市场将围绕中小企业需求、细分领域产品爆发式增长及行业生态协同化发展。 适用人群:对中国企业级SaaS市场感兴趣的投资者、企业管理者、行业分析师以及相关从业人员。 使用场景及目标:①帮助投资者评估企业级SaaS上市公司的投资价值;②为企业管理者提供战略规划和运营管理的参考;③为行业分析师提供详实的数据支持和趋势预测;④为从业人员提供职业发展和技能提升的方向。 其他说明:本文基于2024年10月底的财务数据,结合安永的研究分析,提供了对企业级SaaS市场的深入洞察。文中还强调了SaaS企业在数字化转型中的重要作用,并呼吁行业内企业积极应对挑战,把握发展机遇。

    Comsol仿真技术在聚合物电解质膜燃料电池堆热管理中的应用与优化

    内容概要:本文详细探讨了使用Comsol进行聚合物电解质膜(PEM)燃料电池堆的热管理建模。首先强调了保持燃料电池堆温度均匀性的关键意义,因为温度不均会影响电池性能。接着介绍了由五个电池单元组成的模型结构及其与冷却剂的交互方式。文中具体讲解了多个关键物理量的求解方法,如温度、电极和电解质相电位、反应物质的质量传递以及流体的压力和速度。此外,还讨论了如何通过调整冷却液入口温度、选择合适的湍流模型、优化电化学反应和传质的耦合、合理划分网格以及采用分阶段求解策略来改进仿真效果。最后,作者分享了一些实用的经验和技术细节,例如在冷却液中加入荧光粒子示踪剂进行实验验证,以及针对不同参数做出相应的调整以确保模型的准确性。 适合人群:从事燃料电池研究的技术人员、工程师以及相关领域的科研工作者。 使用场景及目标:适用于需要深入了解和掌握PEM燃料电池堆热管理系统设计与优化的人群。主要目的是帮助他们更好地理解和运用Comsol软件来进行复杂的多物理场耦合仿真,从而提高燃料电池堆的工作效率并延长使用寿命。 其他说明:文章不仅提供了理论知识,还包括了许多具体的实施步骤和技巧,有助于读者快速上手并在实践中不断积累经验。

    基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档(毕业设计&课程设计&项目开发)

    基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于Vue+javaScript实现的电动汽车充电桩管理系统+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档

    python-3.11.12-arm64.exe

    windwos环境下python 3.11系列ARM64位安装包,仅推荐个人学习、开发、娱乐或者测试环境下使用。

    基于COMSOL的石墨烯可见光宽带完美吸收器的设计与仿真

    内容概要:本文详细介绍了利用COMSOL软件设计和仿真的石墨烯可见光宽带完美吸收器。首先,文章解释了石墨烯在可见光波段的独特性质及其应用潜力,接着深入探讨了结构设计的关键要素,如双层光子晶体结构、介质层厚度选择以及金纳米棒的周期性排列。文中还提供了具体的代码片段用于设置材料参数、网格划分和边界条件,并强调了参数优化和后处理的重要性。最终展示了仿真结果,包括吸收率曲线和平坦的宽带吸收特性。 适合人群:从事光电子器件研究的科研人员和技术开发者,尤其是熟悉COMSOL仿真平台的用户。 使用场景及目标:适用于希望深入了解石墨烯在可见光波段的应用并掌握相关建模技巧的研究者。目标是通过理论分析和实验验证相结合的方式,探索提高光吸收效率的新方法。 其他说明:文中提到的一些具体数值和代码片段对于实际建模非常有价值,同时也指出了常见错误和注意事项,帮助读者避开潜在陷阱。此外,作者分享了一些个人经验,使内容更加生动实用。

    (源码)基于Arduino的HID按键项目.zip

    # 基于Arduino的HID按键项目 ## 项目简介 HID按键项目是一个基于Arduino的自动键盘替代工具,旨在通过单一按键实现Windows或其他类似操作系统的登录请求自动填写登录凭证。该项目提供了针对不同Arduino或兼容板的多种版本,适用于安全验证、快捷登录等场景。 ## 项目的主要特性和功能 1. 自动填写登录凭证通过一键操作,自动填写用户名和密码,简化登录流程。 2. 多版本支持支持ATTiny85板和Arduino Micro板等多种硬件平台,用户可根据需求选择合适的版本。 3. 开源与免费项目遵循GPL2.0only开源协议,用户可以自由获取和使用。 ## 安装使用步骤 2. 准备硬件根据所选版本准备相应的Arduino或兼容板(如ATTiny85板或Arduino Micro板),并确保硬件正常工作并连接电脑。

    2000-2023年 企业资源配置效率

    企业资源配置效率是指在一定的技术水平条件下,企业如何将其拥有的资源(如资金、人力、物资等)在各产出主体或生产环节中进行分配,以产生最大的效益。 企业资源配置效率的提高对于企业的生产发展具有至关重要的作用。因此,企业应该注重优化资源配置,提高资源配置效率,以实现企业的可持续发展和竞争优势的提升。 企业资源配置效率指标1:残差小于等于的全部取0 企业资源配置效率指标2:残差取绝对值 数据 代码、年份、e、Overinvest、Ineff

    (源码)基于OpenHarmony和BES2600WM芯片的多模态V200ZR开发板.zip

    # 基于OpenHarmony和BES2600WM芯片的多模态V200ZR开发板 ## 项目简介 本项目是基于恒玄科技BES2600WM芯片和OpenHarmony操作系统的多模态V200ZR开发板。该开发板由湖南欧智通科技有限公司出品,集成了四核ARM处理器、双频WiFi、双模蓝牙等功能,适用于各种AIoT多模态VUI + GUI交互硬件场景。 ## 项目的主要特性和功能 ### 硬件特性 CPU: 双核Cortex M33 Star(最高300MHz) + 双核Cortex A7(最高1GHz) RAM: 最大2MB SRAM + 40MB PSRAM ROM: 最大32MB Nor Flash,支持XIP 网络: 支持WiFi4 2.4G5G双频,BT5.2,BT classic,LE Audio,SIG mesh 显示: 支持MIPI DSI及CSI,2D graphics engine

    (源码)基于 JavaScript 和 Vite 框架的客户端信息获取系统.zip

    # 基于 JavaScript 和 Vite 框架的客户端信息获取系统 ## 项目简介 InfoJs 是一个基于 JavaScript 和 Vite 构建的系统项目,其核心目标是让开发者能够方便快捷地获取客户端信息。借助简单的配置与使用方式,开发者可轻松获取如浏览器信息、设备信息、运行环境等关键数据。 ## 项目的主要特性和功能 1. 简单易用只需进行简单的配置和导入操作,就能在项目中获取丰富的客户端信息。 2. 高效性能采用 Vite 作为构建工具,实现快速开发和热更新。 3. 丰富的 API提供涵盖浏览器信息、设备信息、运行环境等多种类型的 API,满足不同的开发需求。 4. 可扩展性支持自定义插件和扩展,方便开发者根据个性化需求进行定制。 ## 安装使用步骤 ### 一、安装依赖 可通过 npm 或 yarn 安装 InfoJs 库和相关插件 shell npm install sudongyuinfojs save

    光子学领域中手性BIC十字结构的Python与Lumerical联合仿真及自定义设计

    内容概要:本文详细介绍了手性BIC(连续域束缚态)十字结构的设计与仿真方法。首先,通过Python代码生成十字结构的基本参数,确保对称性破缺以产生BIC效应。接着,在Lumerical FDTD环境中进行电磁场仿真,重点探讨了不同材料(如SiN、GaAs)对手性响应的影响,并展示了如何通过调整结构参数(如臂长、宽度、高度)来优化圆二色性(CD)响应。此外,文章还讨论了电场分布的可视化及其与BIC模式的关系,以及如何利用遗传算法和反向设计方法进一步优化结构性能。 适合人群:从事光子学研究的专业人士,特别是对纳米光子器件设计感兴趣的科研人员和技术开发者。 使用场景及目标:适用于希望深入了解手性BIC结构设计原理的研究人员,旨在帮助他们掌握从理论到实践的具体步骤,包括参数选择、仿真工具使用、数据分析等方面的知识。 其他说明:文中提供了大量具体的代码示例,涵盖Python、Matlab和Lumerical等多种编程环境,便于读者直接应用于自己的研究项目中。同时,文章强调了实验过程中需要注意的实际问题,如材料选择、仿真参数设置等,有助于提高仿真的准确性和可靠性。

    Plecs平台下VSG并联控制中动态虚拟复阻抗技术的应用与优化

    内容概要:本文深入探讨了在Plecs平台上实现虚拟同步发电机(VSG)并联控制时所面临的挑战及其解决方案,尤其是针对线路阻抗差异导致的功率分配不均和系统振荡问题。文章介绍了动态虚拟复阻抗技术的基本原理,通过PI调节器实时调整虚拟阻抗值来平衡无功功率分配,并提供了详细的代码实现和调试经验。此外,还讨论了控制周期设置、相位补偿以及参数整定等方面的技术细节,强调了动态虚拟阻抗对于提高系统稳定性和鲁棒性的显著效果。 适合人群:从事微电网研究和技术开发的专业人士,尤其是对VSG并联控制感兴趣的科研人员和工程师。 使用场景及目标:适用于需要解决VSG并联运行中功率分配不均和系统不稳定的问题,旨在通过动态虚拟复阻抗技术优化并联系统性能,确保系统的高效稳定运行。 其他说明:文中提供的代码片段和调试技巧有助于读者更好地理解和应用这一先进技术。建议结合相关文献进一步深入研究,以获得更好的理论支持和技术指导。

    基于GOOSE算法优化CEEMDAN参数的非平稳信号分解与分析

    内容概要:本文详细介绍了利用鹅优化算法(GOOSE)优化完全集成经验模态分解(CEEMDAN)的关键参数,以提高非平稳信号分解的质量。首先,通过数据预处理步骤如Butterworth滤波和归一化处理,确保输入信号的质量。然后,构建GOOSE优化器,采用样本熵或其他熵指标作为适应度函数,自动搜索最佳的噪声标准差和噪声重复次数。接下来,进行CEEMDAN分解,并通过多种可视化手段(如三维希尔伯特谱、瀑布图等)展示分解结果。最后,通过误差分析验证分解效果,结果显示模态混叠现象减少了约23%,特别是在机械振动信号分析中表现优异。 适合人群:从事信号处理、机器学习以及数据分析的研究人员和技术人员,尤其是对非平稳信号处理感兴趣的读者。 使用场景及目标:适用于需要精确分解非平稳信号的应用场景,如机械故障诊断、生物医学信号处理等领域。主要目标是通过优化CEEMDAN参数,减少模态混叠,提高信号特征提取的准确性。 其他说明:文中提供了详细的代码实现和优化技巧,帮助读者更好地理解和应用这一方法。同时,强调了在实际应用中需要注意的一些细节,如参数范围的选择、可视化工具的使用等。

    React函数式简易Pc项目代码

    下载解压后,需先npm i下载依赖包

Global site tag (gtag.js) - Google Analytics