SpringMVC原理
1. 概述
1、客户端发送请求至前端控制器Dispatcherservlet
2、前端控制器根据请求调用处理器映射器(HandlerMapping)查找对应的处理器执行链(包含处理器和拦截器),并返回给前端控制器
3、前端控制器根据返回的控制器匹配器调用 处理器适配器(HandlerAdapter)执行器去执行对应的处理器.
4、控制器也就是具体的Controller执行对应的业务后返回modelandview,并由处理器接收并返回给前端控制器
5、前端控制器调用ViewResolver对modelandview进行解析定位试图资源
6、视图再讲数据模型进行渲染,然后返回view试图
6、将解析完成的view返回给客户端
自己只需要完成Controller 和View ,其他就是spring来完成
2. 代码示例
- 新建web项目;
- 导入springmvc的依赖
- 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>
- 写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>
- 写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. 基于注解的实现
- 新建web项目;
- 导入springmvc的依赖
- 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>
- 写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>
- 写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>