SpringMVC 是 Spring 框架的一个重要组成部分,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)架构模式,通过一系列核心类来实现请求处理、视图渲染等功能。下面我们就来详细解析 SpringMVC 中的几个核心类。

DispatcherServlet

DispatcherServlet 是 SpringMVC 的核心前端控制器,它负责接收所有的 HTTP 请求,并将请求分发给合适的处理器进行处理。可以理解为它是 SpringMVC 应用的中央调度器,把控着整个请求处理流程。

当一个请求进入应用时,首先会到达 DispatcherServlet。它会根据请求的信息,如 URL、请求方法等,从 HandlerMapping 中找到对应的处理器(Handler)。然后,将请求传递给处理器进行处理,处理器处理完请求后会返回一个 ModelAndView 对象。最后,DispatcherServlet 会根据这个 ModelAndView 对象中的信息,选择合适的视图解析器(ViewResolver)来解析视图,并将结果返回给客户端。

在 web.xml 中配置 DispatcherServlet 的示例代码如下:

<web-app>
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

HandlerMapping

HandlerMapping 接口的作用是根据请求信息找到对应的处理器(Handler)。SpringMVC 提供了多种实现类,如 BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping、RequestMappingHandlerMapping 等。

其中,RequestMappingHandlerMapping 是最常用的实现类,它支持使用 @RequestMapping 注解来映射请求。通过这个注解,我们可以将请求的 URL、请求方法等信息与处理器方法进行绑定。

示例代码如下:

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

在这个例子中,当请求的 URL 为 /hello 时,RequestMappingHandlerMapping 会将请求映射到 HelloController 类的 hello 方法。

HandlerAdapter

HandlerAdapter 负责调用处理器(Handler)的方法。因为不同类型的处理器可能有不同的调用方式,所以需要 HandlerAdapter 来进行适配。

SpringMVC 提供了多种 HandlerAdapter 实现类,如 SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter、RequestMappingHandlerAdapter 等。其中,RequestMappingHandlerAdapter 是与 @RequestMapping 注解配合使用的,它可以处理使用 @RequestMapping 注解标注的处理器方法。

当 DispatcherServlet 找到对应的处理器后,会通过 HandlerAdapter 来调用处理器的方法,并将请求参数传递给处理器方法。处理器方法处理完请求后,会返回一个 ModelAndView 对象或其他类型的结果,HandlerAdapter 会将这些结果封装成统一的格式返回给 DispatcherServlet。

ViewResolver

ViewResolver 的主要任务是根据处理器返回的视图名称,解析出具体的视图对象(View)。SpringMVC 提供了多种视图解析器实现类,如 InternalResourceViewResolver、FreeMarkerViewResolver、ThymeleafViewResolver 等。

以 InternalResourceViewResolver 为例,它主要用于解析 JSP 视图。配置示例如下:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

在这个配置中,prefix 和 suffix 属性分别指定了视图文件的前缀和后缀。当处理器返回的视图名称为 "hello" 时,InternalResourceViewResolver 会将其解析为 /WEB-INF/views/hello.jsp。

ModelAndView

ModelAndView 是一个封装了模型数据和视图信息的对象。在处理器方法中,可以通过返回 ModelAndView 对象来指定要展示的视图和传递给视图的数据。

示例代码如下:

@Controller
public class UserController {
    @RequestMapping("/userInfo")
    public ModelAndView getUserInfo() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("userName", "John");
        modelAndView.setViewName("userInfo");
        return modelAndView;
    }
}

在这个例子中,处理器方法 getUserInfo 创建了一个 ModelAndView 对象,添加了一个名为 "userName" 的模型数据,并设置了视图名称为 "userInfo"。DispatcherServlet 会根据这个 ModelAndView 对象,通过视图解析器解析出具体的视图,并将模型数据传递给视图进行渲染。

HandlerInterceptor

HandlerInterceptor 是 SpringMVC 提供的拦截器接口,用于在请求处理前后进行一些额外的处理。它有三个主要方法:preHandle、postHandle 和 afterCompletion。

preHandle 方法在处理器方法执行之前调用,可以用于进行权限验证、请求参数预处理等操作。如果该方法返回 false,则请求处理流程会被中断。

postHandle 方法在处理器方法执行之后,视图渲染之前调用,可以用于对模型数据进行修改、添加额外的请求属性等操作。

afterCompletion 方法在整个请求处理完成后调用,无论请求处理过程中是否发生异常,该方法都会被执行,通常用于资源清理等操作。

自定义拦截器示例代码如下:

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Pre-handle method is called");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post-handle method is called");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("After-completion method is called");
    }
}

在配置文件中配置拦截器:

<mvc:interceptors>
    <bean class="com.example.MyInterceptor" />
</mvc:interceptors>

通过对这些 SpringMVC 核心类的深入理解和掌握,我们可以更好地使用 SpringMVC 框架来开发高效、灵活的 Web 应用程序。在实际开发中,根据具体的需求合理配置和使用这些类,能够让我们的应用程序更加健壮和易于维护。

上一篇下一篇