不断的学习,我们才能不断的前进
一个好的程序员是那种过单行线马路都要往两边看的人

SpringMVC原理

1. 概述

springmvc
1、客户端发送请求至前端控制器Dispatcherservlet
2、前端控制器根据请求调用处理器映射器(HandlerMapping)查找对应的处理器执行链(包含处理器和拦截器),并返回给前端控制器
3、前端控制器根据返回的控制器匹配器调用 处理器适配器(HandlerAdapter)执行器去执行对应的处理器.
4、控制器也就是具体的Controller执行对应的业务后返回modelandview,并由处理器接收并返回给前端控制器
5、前端控制器调用ViewResolver对modelandview进行解析定位试图资源
6、视图再讲数据模型进行渲染,然后返回view试图
6、将解析完成的view返回给客户端

自己只需要完成Controller 和View ,其他就是spring来完成

2. 代码示例

  1. 新建web项目;
  2. 导入springmvc的依赖
  3. web.xml文件中注册DispatcherServlet
<!--配置DispatcherServlet;这个是SpringMVC的核心氢气分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet 绑定spring的配置文件-->
        <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>
    <!--
        在SpringMVC中,/ 与/*
        /:会匹配所有的请求,不会匹配jsp页面
        /*:会匹配所有的请求,包括jsp页面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  1. 写springmvc的配置文件,并添加处理器映射器,处理器适配器,视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--视图解析器  模板引擎Thymeleaf Freemarker-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--BeanNameUrlHandlerMapping:bean-->
    <bean  id="/hello" class="com.ljh.controller.HelloController"/>

</beans>
  1. 写Controller,处理业务

/**
 * @Author laijinhan
 * @date 2020/10/2 4:12 下午
 */
public class HelloController implements Controller {
	public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

		ModelAndView modelAndView = new ModelAndView();

		//业务逻辑代码
		String res="HelloWorld!";
		modelAndView.addObject("msg",res);

		// 视图跳转
		modelAndView.setViewName("test");

		return modelAndView;

	}
}

可能存在的问题:发布的项目中没有jar包

3. 基于注解的实现

  1. 新建web项目;
  2. 导入springmvc的依赖
  3. web.xml文件中注册DispatcherServlet,跟前面一样
<!--配置DispatcherServlet;这个是SpringMVC的核心氢气分发器,前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet 绑定spring的配置文件-->
        <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>
    <!--
        在SpringMVC中,/ 与/*
        /:会匹配所有的请求,不会匹配jsp页面
        /*:会匹配所有的请求,包括jsp页面
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  1. 写springmvc的配置文件,只需要写视图解析器和注解支持
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--都是默认设置-->
    <!--自动扫描包-->
    <context:component-scan base-package="com.ljh.controller"/>
    <mvc:default-servlet-handler/>
    <!--
       支持mvc注解驱动,在spring中一般采用@RequestMapping注解来完成映射关系
       要想使RequestMapping生效,必须向上下文中注册DefaultAnnotationHandlerMapping
       和 AnnotationMethodHandlerAdapter实例,
       这两个实例分别在类级别和方法级别调用
       而annotation-driven配置b帮助我们自动的完成上面的实例注入
    -->
    <mvc:annotation-driven/>

    <!--视图解析器  模板引擎Thymeleaf Freemarker-->
    <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. 写Controller,处理业务
/**
 * @Author laijinhan
 * @date 2020/10/2 4:12 下午
 */

@Controller
public class HelloController {

	@RequestMapping("/hello") // 这里就相当于网页上请求的url
	public String hello(Model model){
		// 封装数据
		model.addAttribute("msg", "Hello SrpingMvcAnnotation");
		return "hello"; // 会被视图解析器处理
	}
}

基于注解的实现更方便,只需要写注解的支持和annotation-driven即可
基于实现Controller接口的话,一个类只能写一个方法。

注意可以不配置视图解析器,但是需要在controller里面,方法的返回结果时前面加上 /和路径。

处理乱码问题

配置web.xml文件

<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

目录