最近公司来了几个新员工,让我给他们做一些培训。其中就包括Spring MVC。由于自己接触的也不多,所以也常常会碰到一些问题。现在把这些问题记录下来,以免以后遇到问题的时候又找不到解决办法。
由于我让他们做了一个简版的微博系统,也就出现了对听众的“取消”和“立即收听”的操作,而这一下操作必须使用ajax实现,才能保证页面的局部刷新效果。而这就涉及到了json数据的返回值问题。
说明:代码是在新员工编写的代码上进行修改的,有些地方可能会有些冗余,但是不影响效果,仅供参考。
操作步骤如下:
1、在项目中引入使用json需要的两个jar包:
jackson-core-lgpl-1.8.5.jar和jackson-mapper-asl-1.8.5.jar
2、在Controller的相应方法上加上@ResponseBody,该方法的返回值可以为POJO对象,也可以为Map。
使用Map的实现代码如下:
@RequestMapping(value = "/deleteListen",method = RequestMethod.POST)
@ResponseBody
public Map<String, String> deleteListen(HttpServletRequest request,String microblogid, String operatorType){
User user = (User) request.getSession().getAttribute("user");
String listenid = user.getMicroblogid();
Map<String, String> map = new HashMap<String, String>();
try{
if("cancel".equals(operatorType)){// 取消操作
// 从LISTEN表中删除
listenService.deleteListen(listenid, microblogid);
// 操作状态变为"立即收听"
map.put("operatorState", "立即收听");
// 收听状态变为""
map.put("tuneState", "");
}else{// 立即收听操作
// 添加收听人到LISTEN表中
listenService.save1Listen(listenid, microblogid);
// 操作状态变为"取消"
map.put("operatorState", "取消");
// 被收听的人收听了当前用户
if(listenService.isListen(microblogid, listenid)){
// 收听状态变为"已互听"
map.put("tuneState", "已互听");
}else{
// 收听状态变为"已收听"
map.put("tuneState", "已收听");
}
}
map.put("result", "success");
}catch (Exception e) {
map.put("result", "fail");
}
return map;
}
使用POJO类的代码如下:
@RequestMapping(value = "/deleteListen",method = RequestMethod.POST)
@ResponseBody
public Operator deleteListen(HttpServletRequest request,String microblogid, String operatorType){
User user = (User) request.getSession().getAttribute("user");
String listenid = user.getMicroblogid();
Operator operator = new Operator();
try{
if("cancel".equals(operatorType)){// 取消操作
// 从LISTEN表中删除
listenService.deleteListen(listenid, microblogid);
// 操作状态变为"立即收听"
operator.setOperatorState("立即收听");
// 收听状态变为""
operator.setTuneState("");
}else{// 立即收听操作
// 添加收听人到LISTEN表中
listenService.save1Listen(listenid, microblogid);
// 操作状态变为"取消"
operator.setOperatorState("取消");
// 被收听的人收听了当前用户
if(listenService.isListen(microblogid, listenid)){
// 收听状态变为"已互听"
operator.setTuneState("已互听");
}else{
// 收听状态变为"已收听"
operator.setTuneState("已收听");
}
}
operator.setResult("success");
}catch (Exception e) {
operator.setResult("fail");
}
return operator;
}
3、页面中ajax的调用方法如下:
function operator(obj, microblogid){ var date = new Date(); var operatorType = $(obj).text(); if(operatorType == "取消"){ operatorType = "cancel"; }else{ operatorType = "tune"; } $.ajax({ url: "<%=path%>/deleteListen", type : "post", dataType : "json", data : "microblogid=" + microblogid + "&operatorType=" + operatorType + "&date=" + date, success : function(result) { if(result.result == "success"){ $(obj).text(result.operatorState); $(obj).parent().prev().find("a").text(result.tuneState); }else{ alert("操作失败"); } }, error : function() { alert("访问失败"); } }); }
页面部分的内容如下:
<c:forEach var="userandlisten" items="${tunelist}" varStatus="count">
<tr>
<td align="right"><a href="selectBroadcast?microblogid=${userandlisten.listenid }">${userandlisten.username}</a> </td>
<td align="right" width="80">${userandlisten.remark} </td>
<td align="left"><a href="remarkName?listenid=${userandlisten.listenid }" id="remark">${userandlisten.addremark}</a></td>
<td align="right"><a href="listenState?listenid=${userandlisten.listenid }">${userandlisten.describe}</a></td>
<td align="left"> <a href="javascript:void(0);" οnclick="operator(this, '${userandlisten.listenid }');">取消</a></td>
</tr>
</c:forEach>
需要注意的是:
我并没有在spring的配置文件中加入类似下面的配置,之前在网上查找资料的时候好多人多说需要加上这个配置,但是我没加也是好用的:
<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">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
但是,我的spring3-servlet.xml中有如下配置:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
这样就OK啦。
相关jar包也上传一下吧。