在一个WEB或者是后台服务项目里,对项目中所有的前后端数据交互定义一个统一的格式是非常必要的。无论是前端是Html还是各种手机APP,拥有了一套统一的交互标准后后端服务都能无缝对接前端。
在这里我们可以简单的定义一个数据交互格式:
import java.util.HashMap;
import java.util.Map;
public abstract class PAction {
private Map<String,Object> getMap(){
Map<String,Object> map = new HashMap<String,Object>();
map.put("errMsg", "");
map.put("state", "");
map.put("data", "");
return map;
}
protected Map<String,Object> returnTure(Object data){
Map<String,Object> map = this.getMap();
map.put("state","true");
map.put("data",data);
return map;
}
protected Map<String,Object> returnTure(){
Map<String,Object> map = this.getMap();
map.put("state","true");
return map;
}
protected Map<String,Object> returnFalse(String msg){
Map<String,Object> map = this.getMap();
map.put("state","false");
map.put("errMsg", msg);
return map;
}
}
返回的数据格式为一个Map类型,包含了以下3个元素:
state--定义交互是否成功,true或者falsedata--要传递给前端实际的数据
errMsg--如果此次交互失败(即:state="false”),则将错误信息存放到该处。
下面我们基于springMVC编写一个实际的Controller
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.pervcom.domain.Admin;
import com.pervcom.sys.dao.LoginDao;
@Controller
@RequestMapping("/login.action")
public class LoginAction extends PAction {
@Autowired
private LoginDao loginDao;
@RequestMapping(params = "operate=login")
public @ResponseBody Object login(Admin param,HttpServletRequest request) {
Admin admin = this.loginDao.adminInfo(param);
if(admin!=null){
HttpSession session = request.getSession(true);
session.setAttribute("loginNo",admin.getLoginNo());
session.setAttribute("adminInfo",admin);
return this.returnTure();
}else
return this.returnFalse("用户名或密码错误");
}
@RequestMapping(params = "operate=loginout")
public String loginout(HttpServletRequest request) {
HttpSession session = request.getSession(true);
session.invalidate();
return "redirect:/login.html";
}
}
在这个Controller里使用了注解@ResponseBody来将这个Map类型的数据格式转变成json格式传递给前端。这样也方便前端对数据进行解析。
当然,要让springMVC帮你把数据变成json还需要对springMVC进行配置:
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean id="handleAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingStringHttpMessageConverter" />
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
最后我们以html为例,看看在html里如何接收并处理数据:
<SCRIPT language=javascript type=text/javascript>
function submit(){
var loginNo = $("#loginNo").val();
var password = $("#password").val();
if(loginNo=="" || password==""){
alert("请输入用户名或密码");
return;
}
$.ajax({
type:"post",
url:"/mik0001.action?operate=login",
data:"loginNo="+loginNo+"&password="+password,
success:function(obj){
if(obj.state=="true"){
location.href="/mik0001.action?operate=index";
}else{
alrt(obj.errMsg);
}
}
});
}
</SCRIPT>