处理前端传递的数据
前端传递过来的参数名可能和接口的参数名一样也可能不一样,如果参数名一样的话就正常,而如果不一样的话就无法接收到前端传递的参数,这时就会出现null,如:
package com.wjh.controller;import com.wjh.po.User;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/*** @author wjh* @date 2021/7/20 22:38* @Package com.wjh.controller*/@Controller@RequestMapping("/user")public class UserController {@GetMapping("/t1")public String test1(String name, Model model) {model.addAttribute("msg", "hello--->" + name);return "hello";}}
访问地址:http://localhost:8080/SpringMVC01_war_exploded/user/t1?name=阿离
结果:
如果访问地址为:http://localhost:8080/SpringMVC01_war_exploded/user/t1?username=阿离
可以看到参数名不一致的话,后端接收到的参数值为null。我们可以使用@RequestParam注解解决这种问题,前端传递给后台的参数名必须是@RequestParam注解的值,如:“@RequestParam(“username”) String name”那么前端必须传递的参数名为username,不可以是name,也不可以是其它的参数名,否则会报如下错误:
如果前端传递的数据是一个表单,而后台需要的参数是一个对象,那么要求提交的表单域和对象的属性名一致,如果出现和属性名不一致的情况,那么这个属性的属性值就会为null,如:
package com.wjh.controller;
import com.wjh.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @author wjh
* @date 2021/7/20 22:38
* @Package com.wjh.controller
*/
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/t3")
public String test3(User user, Model model) {
model.addAttribute("msg", user.toString());
return "hello";
}
}
数据显示到前端
通过ModelAndView
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
通过ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap modelMap){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
modelMap.addAttribute("name",name);
System.out.println(name);
return "hello";
}
通过Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}
三种对象的简单区别:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
以后开发考虑的更多的是性能和优化,就不能单单仅限于此的了解。
JSON交互处理
- JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
- JSON采用完全独立于编程语言的文本格式来存储和表示数据。
- JSON简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- JSON易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。JavaScript 语法要求:
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:
{"name": "QinJiang"}
{"age": "3"}
{"sex": "男"}
注意区别js对象和json字符串:
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
在JavaScript中,提供了一个库进行json字符串和js对象之间的转化:
json—>js对象:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
js对象—>json
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
由于前端的js提供了库函数把json转化为js对象,那么后台只需要把后台的对象转化为json字符串就可以把后台的对象传递给前端了,我们一般使用的是jackson包把后台把对象转化为json字符串传递给前端,首先我们需要导入jackson依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
然后我们只需要把需要转化为json的对象丢给ObjectMapper即可,ObjectMapper会调用它的方法writeValueAsString来转化:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/t4")
@ResponseBody
public String test() throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
User user=new User(1,"阿离",18);
return objectMapper.writeValueAsString(user);
}
}
其中@ResponseBody的作用是使返回结果不经过视图解析器,而是直接返回给前端,如果某个控制器里面的所有方法都需要把返回结果直接返回给前端而不经过视图解析器的话,我们可以在类上标注@RestController注解来取代@Controller注解即可,就没必要每个接口都@ResponseBody注解。
除此之外,后台对象转化为json可能会出现乱码问题,而Spring MVC也为此提供了解决方法,我们只需要在配置文件springmvc-servlet.xml中添加如下代码块即可:
<!--解决java对象转化为json字符串乱码问题的配置 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
除了jackson包,阿里巴巴也开发了一个包用来转化json,先导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
package com.wjh.utils;
import com.alibaba.fastjson.JSON;
import com.wjh.po.User;
import java.util.ArrayList;
import java.util.List;
/**
* @author wjh
* @date 2021/7/21 12:50
* @Package com.wjh.utils
*/
public class FastJsonDemo {
public static void main(String[] args) {
//创建一个对象
User user1 = new User(1,"阿离1号", 18);
User user2 = new User(2,"阿离2号", 18);
User user3 = new User(3,"阿离3号", 18);
User user4 = new User(4,"阿离4号", 18);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
System.out.println("*******Java对象 转 JSON字符串*******");
String str1 = JSON.toJSONString(list);
System.out.println("JSON.toJSONString(list)==>"+str1);
String str2 = JSON.toJSONString(user1);
System.out.println("JSON.toJSONString(user1)==>"+str2);
System.out.println("\n****** JSON字符串 转 Java对象*******");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
}
}

