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源码解析的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 初始化源码—<mvc:annotation-driven >配置标签的源码解析