问题:
RPC,所谓远程调用,就是由服务消费者发起请求调用服务提供者中的方法完成功能处理,然后服务提供者再将执行结果响应给服务消费者的一个过程。那么浏览器和服务器的交互方式,好像就是远程调用,那么我们能不能参照
浏览器和服务器交互的模式来实现项目之间的远程调用呢?
方案:
- 服务器消费者--->浏览器--->在服务消费者中声明类似浏览器发起请求和接收响应的代码。
- 服务器提供者--->MVC的web项目
实现:
HttpClient
使用:
1、服务提供者的代码就是正常的Web项目
2、服务器消费中导入HttpClient的jar包,然后编写相关代码完成rpc远程调用,参照源码
一.服务提供方代码
package com.bjsxt.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSON;
import com.bjsxt.pojo.Pet;
import com.bjsxt.service.PetService;
@Controller
public class PetCon {
@Resource
private PetService petServiceImpl;
/**
* 获取所有的宠物信息
*/
@RequestMapping("pet")
public String getPet(HttpServletRequest req){
List<Pet> pl = petServiceImpl.getPetInfoService();
req.setAttribute("pl", pl);
return "pet.jsp";
}
/**
* 获取所有的宠物信息
* @param pname
* @param color
* @return
*/
@ResponseBody
@RequestMapping("pet2")
public List<Pet> getPet(String pname,String color){
System.out.println("Pet2请求数据===="+pname+":"+color);
List<Pet> pl = petServiceImpl.getPetInfoService();
return pl;
}
/**
* 处理Ajax请求,返回所有的宠物信息,Jsop方式
* @param pname
* @param color
* @return
* callback({name:zhansgan,age:18})
*/
@ResponseBody
@RequestMapping(value="petAjax",produces="text/script;charset=UTF-8")
public String getPetAjax(String callback,String pname,String color){
System.out.println("getPetAjax请求数据==跨域=="+pname+":"+color);
List<Pet> pl = petServiceImpl.getPetInfoService();
//将数据转换为json字符串
String jsonString = JSON.toJSONString(pl);
return callback+"("+jsonString+")";
}
/**
* 获取所有的宠物信息,coresFilter方式
*/
@ResponseBody
@RequestMapping("petFilter")
public List<Pet> getPetFilter(String pname,String color){
System.out.println("Pet2请求数据===="+pname+":"+color);
List<Pet> pl = petServiceImpl.getPetInfoService();