Spring之Controller
1、@Controller
以返回字符串的形式返回
@Controller
@RequestMapping("test")
public class TestController {
@Autowired
UserService userService;
@RequestMapping("selectAllUsername")
public String t1(Model model){
List<String> stringList = userService.selectAllUsername();
model.addAttribute("msg",stringList);
return "test";
}
@RequestMapping("selectUsernameByUid")
public String t2(@RequestParam("uid") int uid, Model model){
String username = userService.selectUsernameByUid(uid);
model.addAttribute("msg",username);
return "test";
}
}
请求test/selectAllUsername
或test/selectUsernameByUid
就能访问到
以ModelAndView返回:
@RequestMapping("selectAllUser")
public ModelAndView t3(){
ModelAndView modelAndView = new ModelAndView();
List<User> userList = userService.selectAllUser();
modelAndView.addObject("msg",userList);
modelAndView.setViewName("test");
return modelAndView;
}
新建一个ModelAndView对象,然后把数据用ModelAndView的addObject方法存到msg里,再用ModelAndView的setViewName的方法设置返回的页面最后再返回ModelAndView对象。
以字符串形式返回:
@RequestMapping("selectAllUser")
public String t3(Model model){
List<User> userList = userService.selectAllUser();
model.addAttribute("msg",userList);
return "test";
}
直接获得一个Model对象,然后用Model的addAttribute存到msg里,最后直接return一个我们需要显示的视图就行了,个人比较推荐第二种。
2、Post提交和Get提交
Get提交:@RequestMapping(value = "selectUsernameByUid",method = RequestMethod.GET)
等价于@GetMapping("selectUsernameByUid")
同理Post提交:@RequestMapping(value = "selectUsernameByUid",method = RequestMethod.POST)
等价于@PostMapping("selectUsernameByUid")
建议直接写@PostMapping
或者@GetMapping
3、Restful风格
平时我们的地址栏传参是用的selectUsernameByUid?uid=1&username=wqk
用的是?
和&
符号传递参数,但是为了安全性和迷惑性,基本上都是使用的Restful
风格的地址栏请求方式:比如百度百科:
就是用的Restful风格传参,那么在控制器层怎么实现呢:
@RequestMapping("selectUsernameByUid/{uid}")
public String t2(@PathVariable("uid") int uid, Model model){
String username = userService.selectUsernameByUid(uid);
model.addAttribute("msg",username);
return "test";
}
只需要在@RequestMapping注解里加个/{参数},然后再在需要在前端接收的参数那里加个
@PathVariable就可以实现了,看效果:
直接用selectUsernameByUid/1
就能请求了,而不是selectUsernameByUid?uid=1
4、返回JSON
JSON是一种数据交换格式类似键值对
[
{
"sid":10001,
"text":"南粉北面"
}
]
JSON的话就是真正意义上的前后端分离了,前端只需要向后端发起请求然后后端返回JSON,前端然后用JavaScript将JSON进行处理就行了。
需要用到JSON的话我们就需要导入关于JSON的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
一个是Jackson,另一个阿里巴巴的fastjson
同时我们还需要在spring-mvc.xml文件里导入
<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>
对JSON数据进行乱码处理,不然返回给前端的中文基本是乱码。
这样我们就可以在控制器里返回JSON了
@Controller
@RequestMapping("json")
public class JsonController {
@Autowired
UserService userService;
@RequestMapping("j1")
@ResponseBody
public String j1(){
List<User> userList = userService.selectAllUser();
String string = JSON.toJSONString(userList);
return string;
}
}
要想实现只返回JSON对象(实质就是字符串的一种特殊形式)的话就必须给方法上加上@Controller
和@ResponseBody
注解,那么就可以用return直接返回字符串给前端了。
还有另外一种方式也可以实现,同时也比较推荐这种:
@RestController
@RequestMapping("json")
public class JsonController {
@Autowired
UserService userService;
@RequestMapping("j1")
public String j1(){
List<User> userList = userService.selectAllUser();
String string = JSON.toJSONString(userList);
return string;
}
}
直接加上@RestController
注解就行了。
@Controller
+@ResponseBody
<==>@RestController
我们现在完全不需要关心返回某个视图了,因为前端只需要向我后端提交某个请求,然后给前端返回数据就行了。真正做到了前后端分离。
JSON.toJSONString(Object o)//把对象转换成JSON对象
5、获取HttpServletRequest对象
在Spring的控制器里其实也可以获得Session对象:
@RequestMapping("t4")
public String t4(HttpServletRequest request, HttpServletResponse response){
String uid = request.getParameter("uid");
HttpSession session = request.getSession();
response.sendRedirect("test");
return "test";
}
我们只需要像以前的Servlet一样,获取到HttpServletRequest,然后用request.getParameter就可以像以前一样获取参数了,也可以用getSession获取到session对象,同时还可以使用response.sendRedirect方法进行重定向。这里就跟以前完全一摸一样,因为其实Controller控制器本身还是一个Servlet而已。