SpringMVC的基本使用
@controller标记一个类是控制器类
@RequestMapping 进行路由映射可以是类也可以是方法,路由的/可以不加,但建议加上
1)简单的映射返回一个hello
@RequestMapping("/m1")public String m1() { return "hello";} |
---|
2)可以通过方法中的参数获取对应键值对,/*请求的参数如果放在body里会自动的填充到参数对象里,在url就需要@RequestParam来映射.需要注意的是get请求无法接收body里的参数,只能接收url里的(也算是规范程序员的一种方式了).这是错的我给注释掉了*/
@RequestMapping("/m2")public String m2(String name, Integer age){ return "name: " + name + " age: " + age;} |
---|
3)需要注意的是当参数类型为基本类型的时候必须要传这个参数,否则会报错
@RequestMapping("/m3")public String m3(String name, int age){ return "name: " + name + " age: " + age;} |
---|
4)建议使用类来做参数,修改代码就不用修改参数,只需要去类里添加属性。而且类里要提供对应的Setter方法(我尝试不加setter方法,无法获取到传递的参数,而值提供setter去可以获得)。如果权限是private则还要提供getter方法,不过不是必须的。
@RequestMapping("/m4")public String m4(Person person){ return "name: " + person.name + " age: " + person.age;} |
---|
可以使用这个注解让我们在传参的时候key是name而不是username。但注意后面的required默认是true,意思是这个是个必传参数,而改成false后就不是必传参数了。
@RequestMapping("/m5")public String m5(@RequestParam(value = "name",required = false) String username,Integer age) { return "name: " + username + " age: " + age;} |
---|
6)我们也可以传一个数组,在传参的时候用,分隔value也可以当做多个键值对来传
@RequestMapping("/m6")public String m6(String[] names) { return Arrays.toString(names) + "len: " + names.length;} |
---|
7)传一个集合和数组的传参没什么区别就是在参数前要加一个注解
@RequestMapping("/m7")public List<String> m7(@RequestParam(required = false) List<String> names) { return names;} |
---|
8)在body中存放json数据可以通过这个注解来标志一下,我们的键值对就可以写在body里了
@RequestMapping("/m8")public String m8(@RequestBody Person person) { return person.toString();} |
---|
9) 可以通过这种方式来获取URL中的信息@PathVariable后面的括号是指定路由中的这个键值对给后面的变量,不加就默认跟着相同的变量名,如果是没有就会报错。
@RequestMapping("/m9/{name}/{age}")public String m9(@PathVariable("age") Integer age,@PathVariable("name") String name) { return name + " " + age;} |
---|
10)可以通过@RequestPart注解传一个文件,键值对的形式,键名要与参数对应。
@RequestMapping("/m10")public String m9(@RequestPart MultipartFile file) { return "file" + file.getOriginalFilename();} |
---|
11)有两种方式获取cookie,一种是使用servlet的方法,可以获取全部的cookie,一种是用注解获取对应的cookie
@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); return cookies[0].getName() + " " + cookies[0].getValue();}@RequestMapping("/getCookie2")public String getCookie2(@CookieValue String name) { return name;} |
---|
有三种方法获取session也是servlet和Springmvc的两种
@RequestMapping("/getSession")public String getSession(HttpServletRequest request) { HttpSession session = request.getSession(); String name = (String) session.getAttribute("name"); return name;}@RequestMapping("/getSession2")public String getSession2(@SessionAttribute(required = false) String name) { return name;}@RequestMapping("/getSession3")public String getSession2(HttpSession session) { String name = (String)session.getAttribute("name"); return name;} |
---|
13)两种获取header的方法
@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request) { String usa = request.getHeader("User-Agent"); return usa;}@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String usa) { return usa;} |
---|
14)@RequestBody可以修饰方法和类表面返回的是数据,@RestController和@Controller都只能修饰类前者返回的是数据后者返回的是页面
@RequestMapping("/return")@Controllerpublic class Return { @RequestMapping("/index") public String index() { return "/index.html"; } @ResponseBody @RequestMapping("/index2") public String index2() { return "/index.html"; }} |
---|
15)当返回的是对象(除了String)的时候会转换成Json格式
@ResponseBody@RequestMapping("/ReturnJson")public Person ReturnJson() { Person person = new Person(); person.age = 18; person.name = "zhansgan"; return person;} |
---|
16)设置响应的状态码
@ResponseBody@RequestMapping("/setStatus")public String setStatus(HttpServletResponse response) { response.setStatus(401); return "ss";} |
---|
设置响应的状态码
@ResponseBody@RequestMapping("/myHeader")public String myHeader(HttpServletResponse response) { response.setHeader("myHeader","myHeader"); return "ss";} |
---|
@RequestParam
把参数设置为必传参数,也可以设置不传参数的时候的默认值
这样设置就是非必传
这样设置前端传来的参数名就得是id