这两天把SpringMVC与前台JSON数据交互大概的了解了下,现在做下总结,以方便后期复习
SpringMVC与前台交互,我大概理了一下,分为以下几种:
1:前台直接发送表单,后台接收
2:前台直接发送拼接好的json数据,后台接收
3:前台直接将表单转json,后台接收,并返回给前台
现在我们来一一说明
第一,前台直接发送表单,这个最简单
如下面这个表单
<form id="formid" action="getjson/getjson.do" method="post"> 姓名:<input id="username" name="username" type="text" /><br /> 密码:<input id="password" name="password" type="password" /> <br /> <input type="submit" value="提交表单" /> <input type="reset" value="重置" /> </form>后台接收参数(之前已有说明,此处不再详述接收参数的方法),如下代码片段
// 直接表单发送 @RequestMapping(value = "/getjson") public ModelAndView getuser(@RequestParam(value = "username") String username, @RequestParam(value = "password") String password) { 省略其他,只看方法参数我们这里的方法参数使用了RequestParam标注,用这个注解标注,有唯一一个好处就是,如果为空会返回404
当然可以不用注解。
第二:前台直接发送拼接好的json数据,后台接收
请看如下代码片段:
js代码部分完整代码
<script type="text/javascript"> function upjson1(){ $.ajax({ url:"getjson/getjson1.do", async:false, dataType:"text", type:"get", data:{"username":$("#username").val(),"password":$("#password").val()}, contentType:"application/json", success:function(data){ alert(data); }, error:function(){ alert("失败"); } }); } }表单部分:
<form id="formid"> 姓名:<input id="username" name="username" type="text" /><br /> 密码:<input id="password" name="password" type="password" /> <br /> <input type="button" onClick="upjson1();" value="提交json1" /> <input type="reset" value="重置" /> </form>后台接收的方式,除了第一种方式来接收,还可以有第二种方式来接收(用javabean来接收json字符串),如代码所示:
@RequestMapping(value = "/getjson1") public ModelAndView getuser1(listuser users) { Map<String, String> map = new HashMap<String, String>(); map.put("username", users.getUsername()); map.put("pw", users.getPassword()); return new ModelAndView("/getJSON", "result", map); } 以下代码为完整的listuser类 public class listuser { private String username; private String password; 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; } }只需要表单的name与javabean中的字段一致即可,返回到的前台视图页面是可以正常获取到数据的,您可以测试下
第三:前台直接将表单转json,后台接收,并返回给前台
第三比较麻烦,这里的应用场景是:一个表格表单,您需要将表单的每一行数据发送到后台进行处理,比如每一行表示一个产品信息,你需要发送到后台进行处理
此处本例,就直接将表单的每一行发送后台给listuser
首先看看我们前台的代码是这样的:
js部分完整代码:
<script type="text/javascript"> function upjson2(){ var formobj = $("#formid").serializeArray(); var formjson = JSON.stringify(formobj); alert(formjson); $.ajax({ url:"getjson/getjson2.do", async:false, dataType:"html", type:"POST", data:{"formjson":formjson}, contentType:"application/x-www-form-urlencoded", success:function(data){ alert(data); alert("成功"); }, error:function(){ alert("失败"); } }); } </script>表单部分的代码:
<form id="formid" action="getjson/getjson.do" method="post"> 姓名:<input id="username" name="username" type="text" /><br /> 密码:<input id="password" name="password" type="password" /> <br /> <input type="button" onClick="upjson1();" value="提交json1" /> <input type="reset" value="重置" /> </form>这里我解释一下,上面的js代码表示将form表单转换为了json数组,再将json数组转换为了json字符串,然后将这个字符串发送到后台进行处理
必须转换为json字符串,再发送到服务器,而不是直接发送json对象,发送json对象,服务器是不认识的哦。
并且我们设置了 contentType:"application/x-www-form-urlencoded"
这里必须设置,在SpringMVC里,如果采用post方式提交数据的话,就必须加上这句,否则后台是接收不到参数的
后台返回给前台的是一个json字符串
这里需要注意的问题是:
1,这里自动转换为json数组并且转换为json字符串,你会发现,他的结构是[{"name":"username","value":"姓名"},{"name":"password","value":"密码"}]
并不是我们想要的[{username:username,password:password}]
这里可以有两种方法来解决,一种是前端js转换,一种是后台json转换。我这里是使用的后台转换:
后端代码如下:
@RequestMapping(value = "/getjson2") public @ResponseBody String getuser2(@RequestParam String formjson) { listuser user = new listuser(); //将字符串转换为json数组 JSONArray jsonarray = JSON.parseArray(formjson); String username = (String) ((Map<?, ?>) jsonarray.get(0)).get("value"); String password = (String) ((Map<?, ?>) jsonarray.get(1)).get("value"); user.setUsername(username); user.setPassword(password); System.out.println(user.getPassword()); System.out.println(user.getUsername()); //如果不需要反序列化 //可以用@JSONField(serialize=false)标注字段即可 //或直接用jdk的transient 标注字段 String json = JSON.toJSONString(user,SerializerFeature.WriteMapNullValue); System.out.println(json); return json; }以上代码用的是阿里巴巴的fastjson来处理json数据的
我们将json字符串转换成了map,获得map的key 和 value 把相应的值给user
然后通过反序列化,将javabean转换成了json字符串
本例中打印的json的结果,格式如下:
{"password":"fdfdf","username":"奋斗奋斗"}
我们需要将这个字符串返回给前台使用
所以我们需要在方法上使用@ResponseBody来注解,或者直接在返回类型的前面添加都可以
这里我们就遇到了第二个问题
2,第二个问题就是json中文字符传递到前台乱码
如我们前台返回success,打印data,如果有中文,这里会出现乱码。
所以我们需要配置一下,通常我们是直接配置
<mvc:annotation-driven>
只需要指定supportedMediaTypes他的值是 text/html;charset=UTF-8
SpringMVC完整的解决json中文乱码的配置如下:
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>当然还有一种方法就是在RequestMapping 里面添加produces属性,如下代码所示:
@RequestMapping(value = "/getjson2",produces = {"application/json;charset=UTF-8"})
相比较而言,还是直接配置xml要简洁方便得多吧。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情