SpringMVC


SpringMVC

1、回顾MVC

MVC:模型、视图、控制器

2、回顾Servlet

3、SpringMVC

SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架

特点:

  1. 轻量级,简单易学
  2. 高效,基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简介灵活

中心控制器

Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring2.5开始,使用Java5或以上版本的用户可以才用基于注解的Controller声明方式。

SpringMVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求以及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类)。

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求

  2. HandlerMapping为处理器映射。DispatcherServlet调用

    HandlerMapping根据请求url查找Handler

  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等

  5. HandlerAdapter表示处理器适配器,按照特定的规则去执行Handler

  6. Handler让具体的Controller执行

  7. Controller将具体的执行信息返回给HandlerAdapter。如ModelAndView

  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet

  9. DispatcherServlet将调用视图解析器来解析HandlerAdapter传递的逻辑视图名。

  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet

  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图

  12. 最终视图呈现给用户

示例: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

重定向和转发

  • 有视图解析器,直接写名字

  • 无视图解析器,须手动组装名字

接收请求参数及数据回显

  1. ```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

    ![](https://github.com/ZDogEgg/Pics-Images-for-Blog/raw/main/Snipaste_2021-08-22_14-19-36.png)

    2. ```java
    @GetMapping("/test2")
    public String test2(@RequestParam("username") String name, Model model) {
    System.out.println("get");
    model.addAttribute("msg", name);
    return "hello";
    }

  2. ```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函数


文章作者: ZDogEgg
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZDogEgg !