测试环境是Spring3+JQuery,相互通信用的都是JSON.
没想到因为这个JSON白白搭了好几天时间,网上找的资料真不靠谱,大部分精力都是折在怎么把客户端的数据转换成JSON回传给服务端上了。
先说下服务端的配置,spring3+jackson很给力,按照标准配置就可以,JSON无论发送还是接收都一样的
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="放你controllers的包名" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/" p:suffix=".jsp" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</beans>
controller的地方服务端向客户端传递json方式如下
@RequestMapping("/xxx.do")
@ResponseBody
public Object executeXXX(HttpSession session)
当然,括号里的参数有没有都可以,HttpServletRequest req还是HttpServletResponse resp都随你兴趣,也没什么顺序影响。返回值时只要把正常的java对象返回就行了,spring+jackson自动会把它转换成json格式,客户端的接收会是这个样子
$.post("/xxxx.do",function(data){
var result = eval(data);
if(result!=null){
if(result.status=='ok'){
alert('ok');
}else if(result.status='none'){
alert(result.message);
}else if(result.status='error'){
alert(result.message);
}
}
});
返回部分是在function(data){...}内的,给result就是json又转换成对象了,这里我放一下这个对象的java定义,容易理解
public class ResultStatus implements Serializable{
private String status;
private String message;
...
}
关键问题是从客户端把json发送给服务端怎么搞,网上给的好多例子都不靠谱,老子还是试出来的。
首先这个$.postJSON就没实现,也许有人成功了,不知道怎么配出来的,其实根本不用换,当客户端发送json数据到服务端时,仍然使用$.post。当然有说法是$.postJSON发送的是application/json,$.post发送的是 application/x-www-form-urlencoded,直接无视了。都他娘的不响应啊,用神马postJSON。
另外一个问题就是服务端,接收参数前需要加@RequestBody吗?我测试的结果是no。也许某种配置应该加,狮屎胜于熊便,加了这个注解,整个方法体都不能被触发。不排除修改某处配置可以实现,不管你找没找到,反正我没找到。网上的教程太坑爹了,全都是不全的,有全的,拿来试验又失败。哎
放个json发送的参数的例子
$.post("/xxxxx.do",{name:"abc",age:123},function(data){
...
});
服务器接收端
@RequestMapping("/xxxxx.do")
public void executeXXXXX(User user){
System.out.println(user.getName());
}
这里的User是自定义类型
public class User{
private String name;
private int age;
...
}
大功告成