springMVC基础知识
1.@Controller
标注在类定义前,表示该类为一个控制器。
该注解有一个value参数,表示该控制器的名称。
比较典型的用法是配合@RequestMapping注解一起使用。
@Controller @RequestMapping(value="/index") public class HelloControler { ...... }
@Controller public class HelloControler { ...... }
2.@RequestMapping
可标注在类定义和方法定义前,表示处理的HTTP请求路径。
该注解有7个参数,分别是:
consumes:表示处理请求的提交内容类型(Content-Type),如:application/json、text/html等。
@Controller @RequestMapping(value="/index",consumes="application/json") public class HelloControler { @RequestMapping("/hello") public String Hello() { return "success"; } }
返回的success字符串是一个视图名称,需要配置视图解析器完成相应视图解析。
注:提交内容类型不一致时,则会抛出Unsupported Media Type异常(type=Unsupported Media Type, status=415)
headers:表示处理请求的header的内容需要符合指定条件,如:session、host、Accept-Encoding等
method:表示处理请求的提交方式,如:get、post、put、delete等。
name:名称
params:表示处理请求的提交参数需要包含指定参数。
path:表示处理的HTTP请求路径,是value的别名。
produces:返回结果的类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
3.@PathVariable
使用路径占位符映射到形参,获取请求路径中的值。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello/{name}/{class}") @ResponseBody public String Hello(@PathVariable(name="name") String userName,@PathVariable(name="class") String userClass) { System.out.println(userName + "," + userClass); return "success"; } }
4.@RequestParam
将http请求参数的值映射到形参中,如果参数未传值,可设置默认值。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") @ResponseBody public String Hello(@RequestParam(name="name",defaultValue="abc") String userName, @RequestParam(name="class",defaultValue="abc") String userClass) { System.out.println(userName + "," + userClass); return "success"; } }
注:若请求参数的名称和形参的名称是一致时,可以不需要写@RequestParam,控制器默认通过名称进行映射。形参可以是一个对象,对象的属性名和请求参数一致时,控制器也可以进行映射而不需要写@RequestParam。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") @ResponseBody public String Hello(User user) { System.out.println(user.getName() + "," + user.getCls()); return "success"; } }
5.@RequestHeader
将http请求中header的数据项值映射到形参中。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") @ResponseBody public String Hello(@RequestHeader(name="host",defaultValue="127.0.0.1") String host) { System.out.println("host:" + host); return "success"; } }
6.@CookieValue
将http请求中cookie的数据项值映射到形参中。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") @ResponseBody public String Hello(@CookieValue(name="SESSION") String session) { System.out.println("session:" + session); return "success"; } }
7.向request域共享数据
有5种方式,分别是servletAPI、ModelAndView、Model、ModelMap、Map,其中后三种在控制器处理时,都转换为BindingAwareModelMap类对象。
(1)通过servletAPI向request域共享数据。形参使用HttpServletRequest,控制器自动给形参赋值。
在success视图中可以获取到name的值。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public String Hello(HttpServletRequest request) { request.setAttribute("name", "zhangsan"); return "success"; } }
(2)使用ModelAndView向Request域共享数据
返回一个ModelAndView对象,控制器将结果交给相应的视图处理。
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public ModelAndView Hello() { ModelAndView mv = new ModelAndView(); mv.setViewName("success"); mv.addObject("name", "zhangsan"); return mv ; } }
(3)使用Model向Request域共享数据
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public String Hello(Model model) { model.addAttribute("name", "zhangsan"); return "success" ; } }
(4)使用Map向Request域共享数据
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public String Hello(Map<String,Object> map) { map.put("name", "zhangsan"); return "success"; } }
(5)使用ModelMap向request域共享数据
@Controller @RequestMapping(value="/index") public class HelloControler {
@RequestMapping(value="/hello") public String Hello(ModelMap modelMap) { modelMap.addAttribute("name", "zhangsan"); return "success" ; } }
8.向session域共享数据
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public String Hello(HttpServletRequest request) { HttpSession session = request.getSession(); session.setAttribute("name", "zhangsan"); return "success"; } }
9.向application域共享数据
@Controller @RequestMapping(value="/index") public class HelloControler { @RequestMapping(value="/hello") public String Hello(HttpServletRequest request) { ServletContext sc = request.getServletContext(); sc.setAttribute("name", "zhangsan"); return "success"; } }
10.InternalResourceView
SpringMVC中默认的转发视图是InternalResourceView,控制器方法中使用"forward:"前缀的视图,默认转发到InternalResourceView解析处理。