web service013——发布restful风格的webservice,并使用客户端接收接收(基于RESTful的jax-rs使用的是http协议,可以传输json数据或xml数据)
Posted 江州益彤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web service013——发布restful风格的webservice,并使用客户端接收接收(基于RESTful的jax-rs使用的是http协议,可以传输json数据或xml数据)相关的知识,希望对你有一定的参考价值。
一、创建动态web工程,并导入jar包到lib目录下,add build bath
二、创建bean(Person .java),用于接受和返回数据
package com.dgut.bean;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "person") // 被发布的类转换成的根元素
public class Person {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
三、创建实现类(personServiceImpl .java)
package com.dgut.personService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import com.dgut.bean.Person;
@Path(value = "/person/{id}") // 该类的访问地址
//id是请求路径的参数
public class personServiceImpl {
@GET // 访问方式
@Path(value = "getPersonById") // 该方法的访问地址
@Produces("application/json") // 返回json数据格式
public Person getPersonById(@PathParam("id") int id, @QueryParam("name") String name) {
// @PathParam路径参数,对应上面的id
// @QueryParam查询参数
Person person = new Person();
person.setId(id);
person.setName("王二毛");
return person;
}
@GET // 访问方式
@Path(value = "getPersonByName") // 该方法的访问地址
@Produces("application/xml") // 返回xml数据格式
public Person getPersonByName(@PathParam("id") int id, @QueryParam("name") String name) {
// @PathParam路径参数
// @QueryParam查询参数
Person person = new Person();
person.setId(id);
person.setName("王二毛");
return person;
}
}
四、配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>CxfSpringWeb</display-name>
<!--
一、发布和访问流程
1、当访问http://localhost:8080/CxfSpringWeb/ws时,进入到CXFServlet;
通过servlet的init方法引入配置文件cxf-servlet.xml(这是spring的配置文件);
CXFServlet调用spring的核心代码取解析cxf-servlet.xml文件,获取到对应的配置信息;
然后调用JaxWsServerFactoryBean来发布webservice
通过反射机制获得.calss,从而可以发布对应方法
二、第一次访问servlet很慢
1、原因是servlet的生命周期,servlet第一次访问时需要初始化
配置文件cxf-servlet.xml在第一次访问时采取解析
2、解决方法
配置文件cxf-servlet.xml是spring的配置文件。可以通过的spring的listener取解析
(服务器已启动就去加载)
-->
<!-- ==================解决访问慢================ -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/cxf-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- =============================================-->
<servlet>
<!-- 配置cxf -->
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<!-- spring的配置文件,在这里配置第一次访问很忙,不采用 -->
<!--<init-param>
<param-name>config-location</param-name>
<param-value>/WEB-INF/cxf-servlet.xml</param-value>
</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>
<!-- 解决Servlet with a name javax.ws.rs.core.Application is not available问题-->
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
五、配置cxf-servlet.xml(注意:这里使用的时jaxrs,而不是jaxws)
<?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:soap="http://cxf.apache.org/bindings/soap"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"
>
<!-- 解决访问慢的问题 -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<!-- rusrful风格 -->
<bean id="personServiceId" class="com.dgut.personService.personServiceImpl"></bean>
<jaxrs:server id="personServiceBean" address="/personService">
<jaxrs:serviceBeans>
<ref bean="personServiceId"/>
</jaxrs:serviceBeans>
</jaxrs:server>
</beans>
六、运行index.jsp文件,通过地址栏进行访问,以验证
6.1、json风格
6.2、xml风格
七、客户端接收并解析json数据
7.1、创建Java工程,并导入需要的jar包
7.2、创建Java测试文件(test01.java)
package com.dgut.test01;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import net.sf.json.JSONObject;
public class test01 {
public static void main(String[] args) throws Exception {
/**
* 用到的架包有: json-lib-2.4-jdk15.jar commons-lang-2.6.jar ezmorph-1.0.6.jar
* commons-logging-1.1.1.jar commons-collections-3.2.1.jar
* commons-beanutils-1.8.3.jar
*/
// 外接口路径
String urlStr = "http://localhost:8080/CxfSpringWeb/ws/personService/person/1/getPersonById";
// 链接URL
URL url = new URL(urlStr);
// 返回结果集
StringBuffer document = new StringBuffer();
// 创建链接
URLConnection conn = url.openConnection();
// 读取返回结果集
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
document.append(line);
}
reader.close();
System.out.println(document);
JSONObject json = JSONObject.fromObject(document.toString());
// 查看json格式
System.out.println(json.toString());
// 获取json中某个对象
JSONObject obj = (JSONObject) json.get("person");
System.out.println(obj.toString());
// 获取对象中某个属性的值
String val = obj.getString("name");
System.out.println(val);
}
}
7.3、运行test01.java文件进行测试
以上是关于web service013——发布restful风格的webservice,并使用客户端接收接收(基于RESTful的jax-rs使用的是http协议,可以传输json数据或xml数据)的主要内容,如果未能解决你的问题,请参考以下文章
APEX_WEB_SERVICE.MAKE_REST_REQUEST 导致 ORA-29248:使用无法识别的 WRL 打开钱包
Amazon Simple Notification Service 是 RESTFUL Web 服务吗?
RESTFUL web service spring,XML而不是JSON?
Java Web Service REST 正确设计最佳实践
Building a Reactive RESTful Web Service - 用 SpringBoot WebFlux 构建reactive restful web服务