执行流程简要分析
如图
简要分析
- DispatcherServlet表示前置控制器,使整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接收并拦截请求。
- HandlerMapping为处理器映射,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url调用Handler
- HandlerExecution表示具体的Handler,主要作用是根据url查找控制器
- HandlerExecution将解析后的信息传递给DispatcherServlet,eg:解析控制器映射等
- HandlerAdapter处理器适配器,按照其特定的规则去执行Handler
- Handler让具体的Controller去执行
- Controller将具体的信息返回给HandlerAdapter,eg:ModelAndView
- HandlerAdapter将视图逻辑名和视图传递给DispatcherServlet
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传来的视图逻辑名
- 视图解析器将解析的逻辑视图名传给DispatcherServlet
- DispatcherServlet根据视图解析的视图结果,调用具体的视图
- 最终给用户
Controller配置小结
- 控制器负责负责提供访问应用程序的行为,通过接口或注解实现
- 控制器负责解析用户请求并将其转换为一个模型
- SpringMVC中一个控制器类可以包含多个方法
接口实现
@FunctionalInterface
public interface Controller {
@Nullable
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
缺点:
- 一个类只能写一个方法,多个方法只能定义多个类
实现接口是很老的办法,一般不使用
注解实现
<!-- 配置组件扫描 -->
<context:component-scan base-package="controller" />
@Component //组件
@Controller //控制器
@Service //服务层
@Repository //dao
@Controller
- 代表这个类会被Spring接管
- 被注解的类,中所有的方法,如果返回值是String,并且有具体的页面可以跳转,就会被视图解析器解析
@RequestMapping
- 用于映射URL到控制器上
- 可以用于Class上和方法上
RestFul风格
RestFul就是一个资源定位以及资源操作的风格。不是标准也不是协议,就是一种风格
功能
-
资源:互联网上所有的资源都可以抽象为资源
-
资源操作:使用POST、DELETE、PUT、GET,使用不同的方法对资源进行操作
-
可以通过请求方式来区别操作方法,与链接无关
参数获取
@RequestMapping("/add/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg", res);
return "test";
}
- 使用@PathVariable可以获取URL中的参数
指定请求类型
1.通过@RequestMapping中的method来指定POST、DELETE、PUT、GET等
@RequestMapping(value="/add/{a}/{b}",method = {RequestMethod.GET})
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg", res);
return "test";
}
2.直接通过注解指定
@GetMapping("/add/{a}/{b}") //get请求
@PostMapping("/add/{a}/{b}") //post请求
@DeleteMapping("/add/{a}/{b}") //delete请求
@PutMapping("/add/{a}/{b}") //put请求
public String test(@PathVariable int a, @PathVariable int b, Model model){
int res = a + b;
model.addAttribute("msg", res);
return "test";
}
跳转方式
1.ModelAndView 视图解析器
2.支持Servlet方式
- response.sendRedirect(); //Servlet重定向 地址栏会变化
- request.getRequestDispatcher("").forward(request,response); //Servlet转发
@RequestMapping("/add/{a}/{b}")
public String test2(HttpServletRequest request, HttpServletResponse response){
request.getSession();
response.sendRedirect("test"); //重定向
request.getRequestDispatcher("test").forward(request, response);//转发
return "test";
}
3.SpringMVC 封装的操作
- redirect
@RequestMapping("/test3")
public String test3(){
return "redirect:/index.jsp"
}
- forword
@RequestMapping("/test4")
public String test4(){
return "forward:/index.jsp"
}
接收参数与返回数据
接收参数
使用@RequestParam
@RequestMapping("/test5")
//localhost:8080/test5?param=test
public String test5( @RequestParam("param") String param,Model model){
model.addAttribute("res", param);
return "test";
}
使用@RequestBody可以接收一个对象,map、list、实体类
返回数据
- Model
- ModelAndView
- ModelMap 继承了LinkedList 具有LinkedList的所有功能
乱码问题
通过过滤器解决乱码问题,SpringMVC提供了支持
<!-- 解决中文乱码问题,使用过滤器 -->
<!--配置编码格式-->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
返回JSON数据
@ResponseBody
@RequestMapping("/json")
@ResponseBody //这个注解不会走视图解析器,他会直接返回一个字符串
public String test6(){
Map map = new HashMap<String,String>();
map.put("name", "白牛");
map.put("age", "21");
JSONObject obj = new JSONObject(map);
return obj.toString();
}
@RestController
@RestController //这个控制器下所有的方法只会返回字符串
public class HelloController {
}