MicroBoy 2020-06-17
1.DispatcherServlet
全名是org.springframework.web.servlet.DispatcherServlet,在web配置一下就好了
2.Controller
控制器类上需要 实现Controller接口或者 使用@Controller注解
注解是org.springframework.stereotype.Controller(配置文件加上context命名空间、开启扫描包)
接口是org.springframework.web.servlet.mvc.Controller
3.ViewResolver
视图解析器,在springmvc-config.xml里配置,一般通过设置前后缀来显示请求访问路径,功能实现RequestMapping搭配,默认当前路径为WebContent,配置例如
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 设置前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 设置后缀 --> <property name="suffix" value=".jsp" /> </bean>
还有一个order属性,用正整数表示优先级,越小优先级越大,多个视图解析器可以判断优先级,第一个找不到会找第二个,以此类推。
<property name="order" value="1"/>
注解
请求映射,为控制器指定可以处理哪些URL请求
在上面的视图解析器的基础上,测试效果。
(1)标注在方法上,例如
package com.mvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class FirstController { @RequestMapping("/firstController") public String test() { System.out.println("facai1"); return "index"; } }
效果是:访问http://localhost:8080/MVC_02/firstController会调用test()方法,在控制台输出facai1,并且跳转到/MVC_02/WEB-INF/jsp/index.jsp。这里的[index]是test()方法返回的,与视图解析器的前缀[/WEB-INF/jsp/]后缀[.jsp]拼接而成请求路径。
(2)标注在类上,例如
package com.mvc.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @RequestMapping("/hello") @Controller public class FirstController { @RequestMapping("/firstController") public String test() { System.out.println("facai1"); return "index"; } }
效果是:访问http://localhost:8080/MVC_02/hello/firstController会调用test()方法,在控制台输出facai1,并且跳转到/MVC_02/WEB-INF/jsp/index.jsp。就是在方法的注解前多加一个路径,请求是通过方法处理,而不是类,所以方法上的注解必须要有,类上注解可以有。
(3)注解的属性
value:请求路径。
method:设置请求方法,只有客户端发送请求方式和method一样,才能处理,请求方式有GET,POST,PUT,DELETE,写法例如method=RequestMethod.GET。
params:用来设置客户端传到服务器的数据,支持表达式,可以是数组。写法例如params={"username","!phone","age=12","sex!=2"},表示传递的数据中,需要有username属性,不能有phone属性,age属性必须为12,sex必须不为2,否则无法处理这个请求。
headers:设置请求头信息,所发送的请求的请求头信息一定要和header属性中设置的一样。
(4)组合注解
@GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping
化简了原来的注解的method属性,例如
@RequestMapping(value="/test",method=RequestMethod.POST)等同
@PostMapping(value="/test")
(5)支持Ant风格风格
三种匹配符号,[*]表示0-多个任意字符,[?]表示任意单个字符,[**]表示任意多层目录,写法例如
@RequestMapping(value="/*/ant??/**/test")
(6)支持Restful风格(占位符方式的路径)
以前:localhost:8080/MCV_02/Rest?id=1001&name=admin
现在:localhost:8080/MCV_02/Rest/1001/admin
@RequestMapping("/Rest/{id}/{name}") public String testRest(@PathVariable("id") Integer id,@PathVariable("name")String name) { System.out.println("test_Restful"); return "success"; }
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象进行绑定。加上@ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。