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 应用程序。在实际开发中,根据具体的需求合理配置和使用这些类,能够让我们的应用程序更加健壮和易于维护。
