SpringMVC
1、回顾MVC
MVC:模型、视图、控制器
2、回顾Servlet
3、SpringMVC
SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架
特点:
- 轻量级,简单易学
- 高效,基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定优于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简介灵活
中心控制器
Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring2.5开始,使用Java5或以上版本的用户可以才用基于注解的Controller声明方式。
SpringMVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求以及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类)。
简要分析执行流程
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求
HandlerMapping为处理器映射。DispatcherServlet调用
HandlerMapping根据请求url查找Handler
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
HandlerAdapter表示处理器适配器,按照特定的规则去执行Handler
Handler让具体的Controller执行
Controller将具体的执行信息返回给HandlerAdapter。如ModelAndView
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
DispatcherServlet将调用视图解析器来解析HandlerAdapter传递的逻辑视图名。
视图解析器将解析的逻辑视图名传给DispatcherServlet
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图
最终视图呈现给用户

示例:https://www.cnblogs.com/mindzone/p/12832414.html
@Controller
1 2 3 4 5 6 7 8 9 10
| @Controller public class HelloController {
@RequestMapping("/hello") public String hello(Model model) { model.addAttribute("msg", "Hello,SpringController"); return "hello"; }
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.dogegg.controller"/> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
</beans>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
</web-app>
|
@RequestMapping
用于映射url到控制器或一个特定的处理程序方法。可用于类或方法上
RestFul风格
https://blog.csdn.net/a78270528/article/details/78469758
重定向和转发
有视图解析器,直接写名字
无视图解析器,须手动组装名字
接收请求参数及数据回显
```java
@GetMapping(“/test1”)
public String test1(String name, Model model) {
System.out.println("get");
model.addAttribute("msg", name);
return "hello";
}
1 2 3 4 5 6 7 8 9 10
| 
2. ```java @GetMapping("/test2") public String test2(@RequestParam("username") String name, Model model) { System.out.println("get"); model.addAttribute("msg", name); return "hello"; }
|

```java
@GetMapping(“/test3”)
public String test3(User user) {
System.out.println(user);
return "hello";
}
1 2 3 4 5 6 7
| ```java public class User { private int id; private String name; private int age; }
|

对比
- Model:只有几个方法用于存储数据,简化了新手的操作和理解
- ModelMap:继承了LinkedHashMap,除了实现了自身的一些方法,同样继承LinkedHashMap的方法和特性
- ModelAndView:可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转
乱码问题
1 2 3 4 5 6
| @PostMapping("/1") public String test1(String name, Model model) { model.addAttribute("msg",name); return "hello"; }
|
尝试解决问题
1 2 3 4 5 6
| @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); filterChain.doFilter(servletRequest,servletResponse); }
|
过滤器无效
解决问题:使用SpringMVC的过滤器
1 2 3 4 5 6 7 8 9 10 11 12
| <filter> <filter-name>encoding</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>encoding</filter-name> <url-pattern>/</url-pattern> </filter-mapping>
|
Ajax
异步无刷新请求
jQuery是一个库,有大量js函数