restful和spring整合
此项目是在IDEA中创建的MAVEN的web项目
服务端:↓ 步骤一:在pom.xml中添加如下依赖
org.apache.cxf cxf-rt-frontend-jaxrs 3.0.1 org.apache.cxf cxf-rt-transports-http-jetty 3.0.1 org.apache.cxf cxf-rt-rs-client 3.0.1 org.apache.cxf cxf-rt-rs-extension-providers 3.0.1 org.codehaus.jettison jettison 1.3.7 com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.9.6 org.springframework spring-web 5.0.8.RELEASE org.springframework spring-context-support 5.0.8.RELEASE
步骤二:创建会用到的实体类(记得给该实体类加@注解) 此案例该实体类命名为:Users
package com.qf.Users;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {private int userid;private String username;private String password;public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Users{" +"userid=" + userid +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
步骤三:创建接口。接口当中包含请求地址,返回什么数据类型 此案例该接口命名为:
package com.qf.dao;import com.qf.Users.Users;import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;@Produces("*/*")//规定了服务器返回给客户端的数据格式。此地*/*代表格式不限制
public interface UsersDao {@Path("/insert")@POST//post提交(即新增)数据public int insertUsers(Users users);@Path("/update")@PUT//PUT更新数据public int updateUsers(Users users);@Path("/delete/{uid}")//{uid}表示占位,前端请求地址中传过来的参数由uid获取。此时restful风格就体现出来了,前台传值格式为delete/1,1是传过来的参数@DELETE//DELETE删除数据public int deleteUsers(@PathParam("uid") int userid);//@PathParam("uid") 代表将uid和userid绑定@Path("/getbyid/{id}")//restful这个占位符记得加{}大括号。客户端访问该方法的正确地址是:http://localhost:8080/users/getbyid/{id},即发布地址/请求地址/参数 的格式才能访问到@GET//GET取(查询)数据@Produces(MediaType.APPLICATION_JSON)//单独指定该方法返回值转换成json对象,表示以json格式返回给客户端。MediaType类有好几种数据格式,只需点一下就会提示。public Users findbyid(@PathParam("id") int userid);@Path("/getall")@GET@Produces(MediaType.APPLICATION_JSON)public List findall();
}
步骤四:创建的实现类,该类写请求地址具体的处理方法 此案例该实现类命名为为:
package com.qf.dao.impl;import com.qf.Users.Users;
import com.qf.dao.UsersDao;import java.util.ArrayList;
import java.util.List;public class UsersDaoImpl implements UsersDao{//给数据库新增一条数据public int insertUsers(Users users) {System.out.println("insertUsers="+users);return 11;}//修改一条数据public int updateUsers(Users users) {System.out.println("updateUsers="+users);return 22;}//给数据库删除一条数据public int deleteUsers(int userid) {System.out.println("deleteUsers="+userid);return 33;}//从数据库中根据id查询一条数据public Users findbyid(int userid) {System.out.println("findbyid="+userid);Users users=new Users();users.setUserid(110);users.setUsername("张三");users.setPassword("abc");return users;}//查询数据库中的所有数据public List findall() {List list=new ArrayList();System.out.println("findall");for (int i = 0; i < 5; i++) {Users users=new Users();users.setUserid(110);users.setUsername("张三");users.setPassword("abc");list.add(users);}return list;}
}
步骤五:在文件夹下创建xml配置文件,配置如下命名空间
xmlns:jaxrs=“”
案例中我将该xml文件命名为:cxf.xml
步骤六:配置WEB-INF下的web.xml文件
Archetype Created Web Application contextConfigLocation classpath:cxf.xml org.springframework.web.context.ContextLoaderListener aa org.apache.cxf.transport.servlet.CXFServlet aa /testcxf/*
服务端案例结构图:
客户端:↓
该案例服务端命名为:
步骤一:在pom.xml中添加依赖
javax.servlet javax.servlet-api 3.1.0 provided org.springframework spring-webmvc 5.0.8.RELEASE org.springframework spring-context 5.0.8.RELEASE org.springframework spring-context-support 5.0.8.RELEASE org.springframework spring-web 5.0.8.RELEASE javax.servlet jstl 1.2 org.apache.cxf cxf-rt-rs-client 3.0.1 org.apache.cxf cxf-rt-rs-extension-providers 3.0.1 org.codehaus.jettison jettison 1.3.7 com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.9.6
步骤二:创建将服务端创建的实体类(即Users)复制给客户端,因为后面要用。
package com.qf.entity;//原来的费restful的客户端的代码都是由wsimport -s等命令自动生成的,但restful风格只是公司内部应用,因此还不普及,这个实体类只能从服务端复制过来
import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement//实体类注解,标记当前要转换的格式。@XmlRootElement是基于restful风格的webService,客户端和服务器端之间通讯可以使用xml数据,json数据,@XmlRootElement用来指定对象序列化为xml或json数据时的根节点名称,也可以指定名字@XmlRootElement(name="")。如果指定名字,客户端和服务端的name值要相同。
public class Users {private int userid;private String username;private String password;public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Users{" +"userid=" + userid +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}
步骤三:在下创建xml,用于创建对象,建立与服务端的联系。
步骤四:在web.xml加载下创建的xml配置文件
Archetype Created Web Application aa org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:client.xml aa /*
步骤五:在里建立网页请求地址处理方法(注意是网页,不是服务端)
package com.qf.contller;import com.qf.entity.Users;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;public class UsersController {@Resourceprivate WebClient webClient;//这是我们在client.xml文件创建的并bean对象,用@Resources注入。@RequestMapping("/getusers")//此方法处理网页中传来的getusers请求。也就是说最终是用http://localhost:8080/testcxf/testrestful/getusers?userid=11这种方式访问的public String get(int userid){//从服务端获得用户信息Users users = webClient.path("/getbyid" + userid)//webClient.path()是在client创建的webClient的bean对象原有的基础上拼上请求地址要携带的参数,即服务端请求地址对应的处理方法的参数。.get(Users.class);//Users是服务端查询方法 的返回值类型。System.out.println(users);return "success";//执行成功后要跳转去的网页}
}
客户端案例结构图:
==注意:此案例似乎只有两个才能成功,因为启动一方,另一方的就会被占用,即使端口号不一样