spring mvc源码解析

Posted codefeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc源码解析相关的知识,希望对你有一定的参考价值。

首先简单了解spring mvc使用

首先搭建一个maven的web工程,最简单的mvc工程只需要依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.7.RELEASE</version>
        </dependency>

//注意配置作用域,防止和tomcat自带的jar冲突 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> //如果不适用jsp,可以不用配置这个 <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>

web.xml最简单的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
    <!-- root ioc -->
    <display-name>study spring mvc </display-name>
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:/spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>/index.html</welcome-file>
    </welcome-file-list>

</web-app>

在resources目录下创建mvc的xml配置文件,具体名称依据web.xml中初始化参数来,配置的都是最基本的组件,用来源码分析

<?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">

    <bean
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <props>
                <prop key="/test.do">simpleConrol</prop>
            </props>
        </property>
        <property name="interceptors" ref="myHandlerInterceptor"></property>
    </bean>

    <!--控制器 -->
    <bean id="simpleConrol" class="control.SimpleControl" />

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

    <!--资源解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/" />
        <property name="suffix" value=".jsp" />
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    </bean>
    
    <bean id="myHandlerInterceptor" class="interceptor.MyHandlerInterceptor"></bean>
    
    <bean class="exceptionResolver.SimpleHandlerExceptionResolver"></bean>
</beans>

以下是各组件的类     

controller

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class SimpleControl implements Controller

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 
        int a = 1/0;
        ModelAndView mv = new ModelAndView("test");
        mv.addObject("word", "this is test word");
        return mv;
    

HandlerExceptionResolver

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

public class SimpleHandlerExceptionResolver implements HandlerExceptionResolver 

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
        ModelAndView mv = new ModelAndView("error");
        return mv;
    

HandlerInterceptor

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor implements HandlerInterceptor 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
        System.out.println("this is MyHandlerInterceptor preHandle");
        return true;
    

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 
        System.out.println("this is MyHandlerInterceptor postHandle");
    

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 
        System.out.println("this is MyHandlerInterceptor afterCompletion");
    

还可以自定义异常,当返回自定义异常时返回特定的返回码

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "this is myException")
public class MyException extends Exception 

    private static final long serialVersionUID = 1L;

 

 

 

 

接下是通常配置

<?xml version="1.0" encoding="GBK"?>
<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.tuling.mvc.control"/>

    <!-- 注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 视图仓库 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView"/>
    </bean>

</beans>

 

以上是关于spring mvc源码解析的主要内容,如果未能解决你的问题,请参考以下文章

09. Spring MVC源码解析

spring mvc源码解析

Spring MVC 初始化源码—<mvc:annotation-driven >配置标签的源码解析

Spring6源码・MVC请求处理流程源码解析

Spring MVC工作原理及源码解析DispatcherServlet实现原理及源码解析

Spring MVC工作原理及源码解析 ViewResolver实现原理及源码解析