一)参数类型
@RequestMapping("hello4") @ResponseBody public ModelAndView Hello4(// Servlet的三个参数 HttpServletRequest request, HttpServletResponse response, HttpSession session,// 传入接本数据类型和引用数据类型,注意要和前端同名 String name, People people,// 和前端不同命的解决办法 @RequestParam("address1")String address,// 前段没有传值,设置默认值 @RequestParam(defaultValue = "27") int age,// 设置这个值一定要有,没有就报错 @RequestParam(required = true) String email,// 接前端传过来的复选框的值 @RequestParam("likes")Listlist,// 前端写法// // // 另外再写一个实体类,属性就是前端传值的名// public class Test {// private People people; Test test,// 前端写法// // // 另外要写一个实体类,属性就是前端传值的list集合// public class Test {// private People people;// private List peoples; Test test1,// 其实model和ModelAndView还有session都产不多用法,只是返回一个数据参见下边的代码 Model model ) throws ServletException, IOException { ModelAndView hello = new ModelAndView("main"); Model model1 = model.addAttribute("name", "xupeilei"); return hello; }
restful风格:
@RequestMapping("hello1/{name}/{age}") public ModelAndView Hello1(@PathVariable String name,@PathVariable String age) { System.out.println(name+" "+age); System.out.println("hello springMVC控制器"); ModelAndView hello = new ModelAndView("main"); return hello; }
参数绑定到实体类:
有时间在写
自定义参数绑定
有事件在写
二)返回值类型及重定向和转发(默认方式都是请求转发)
理解重定向和转发:
重定向:
相当于是浏览器发出请求,返回一个url浏览器再去请求这个url,这时浏览器是知道他请求到哪里去了,所以地址栏可以看到url的改变
转发:
服务器的行为,浏览器发出请求之后,服务器可能又去请求了其他的资源最终只返回一个数据或者模型,这时浏览器并不知道服务器到底做了什么,他只能显示他请求的url;
@RequestMapping:会去找视图解析器
String
@RequestMapping("hello2") public String hello2(){// 转发// return "forward:/html/err.html";// return "forward:/hello1";// 重定向// return "redirect:/html/err.html"; return "redirect:/hello1";// 通过视图解析器// return "main"; }
ModelAndView:
@Controllerpublic class HelloController { @RequestMapping("hello1") public ModelAndView hello1(){ // 自定义视图解析器找到main.jsp// ModelAndView modelAndView = new ModelAndView("main"); // 服务器转发,// 跳转到err.html// ModelAndView modelAndView = new ModelAndView("forward:/html/err.html");// 跳转到其他controller(hello2)// ModelAndView modelAndView = new ModelAndView("forward:/hello2"); // 浏览器重定向,// 重定向到err.html// ModelAndView modelAndView = new ModelAndView("redirect:/html/err.html");// 重定向到其他controller(hello2) ModelAndView modelAndView = new ModelAndView("redirect:/hello2"); // 会使用自定义视图解析器,结果找不到报错404// ModelAndView modelAndView = new ModelAndView("hello2"); return modelAndView; }
void(没有返回值,只能重定向和转发)
@RequestMapping("hello3") public void hello3(HttpServletRequest request, HttpServletResponse response) throws IOException {// 重定向 request.getRequestDispatcher("/html/err.html");// request.getRequestDispatcher("/hello1");// 转发// response.sendRedirect("/html/err.html");// response.sendRedirect("/hello1"); }
@RequestMapping:
@ResponseBody:
String
void
ModelAndView
对象:(坑!大坑!!巨坑!!!超级坑!!!)(使用jackSon的时候要用高版本不然报错406,无法转换json格式)
@RequestMapping("/hello4") @ResponseBody public People hello4(HttpServletResponse response){ People p=new People(); p.setName("sss"); p.setAddress("www"); p.setAge(1); p.setEmail("ee"); return p; }
com.fasterxml.jackson.core jackson-annotations 2.9.6 com.fasterxml.jackson.core jackson-core 2.9.6 com.fasterxml.jackson.core jackson-databind 2.9.6
三)自定义视图解析器
表示在返回值的前边加上/路径和后边加上.jsp,表示所要找的jsp所在德位置,就不需要在controller中手写了,作用就是偷懒;
但是注意:自定义视图解析器controller中的返回值不能加前缀,加的话就走默认的视图解析器,
存在的意义:当我们需要转发的时候
看图:
图一: 图二:
看图一:因为前边没有加任何东西,并且我又自定义视图解析器,那他走的就是自定义视图解析器,回去找一个demo11.jsp的东西,但是会发现找不到报错404
看图二:因为前边加了forward:这时候自定义的视图解析器就失效了,走默认视图解析器,解析出来要转发到dome11,就不去找demo11.jsp了
四)请求方法限定
@RequestMapping(value = {"/hello123","/456",method = RequestMethod.POST)}
五)@ResponseBody注解
做了两件事情:
一:将返回值变成json字符串;
二:同时设置响应头为application/json
加上这个之后就不跳转了,以流的形式输出出去,也就不走视图解析器了,并且是直接填充到body中去了
String:
ModelAndView:
考虑一下返回值为ModelAndView 却得到一个json字符串的方式
Void:
对象:
六:拦截器