Web MVC核心组件
组件 | 说明 | |
---|---|---|
HandlerMapping | 将请求与拦截器列表一起映射到处理程序,以进行预处理和后期处理。映射基于某些标准,具体标准因HandlerMapping 实现而异。两个主要HandlerMapping实现是RequestMappingHandlerMapping (支持带@RequestMapping注释的方法)和SimpleUrlHandlerMapping (将URI路径模式显式注册到处理程序) | |
HandlerAdapter | 帮助DispatcherServlet调用映射到请求的处理程序,而不管实际如何调用该处理程序。主要目的HandlerAdapter是保护DispatcherServlet这些细节。 | |
HandlerExceptionResolver | 解析异常 | |
ViewResolver | String将从处理程序返回的基于逻辑的视图名称解析为实际的名称View ,以将其呈现给响应。 | |
LocaleResolver,LocaleContextResolver | 能够提供国际化的视图 | |
ThemeResolver |
<?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"
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">
<context:component-scan base-package="com.imooc.web"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Web MVC注解驱动
- 注解配置 @Configuration
- 组件激活 @EnableWebMvc
- 自定义组件 WebMvcConfigurer(接口,基于java1.8)
xml与注解替换
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("addInterceptors.preHandle");
return true;
}
});
}
}
以上代码的@Configuration,@EnableWebMvc,@Bean相关代码替换以下xml配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
@EnableWebMvc 注解
-
配置@EnableWebMvc注解则会自动加载@Configuration的配置类
-
DelegatingWebMvcConfiguration中无@Bean,@Bean在WebMvcConfigurationSupport类中
Web MVC 其他常用注解
- 模型属性 @ModelAttribute
- 请求头 @RequestHeader
- Cookie @CookieValue
- 切面通知 @ControllerAdvice
- 异常处理
- 校验参数
Web MVC 自动装配
@ComponentScan(basePackages = "com.webmvc")
public class DispatcherServletConfig {
}
public class
DefaultAnnotationConfigDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
// 对应web.xml
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
// DispatcherServlet
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{DispatcherServletConfig.class};
}
// 映射
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
替换
- web.xml
<web-app>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- app-context.xml
<context:component-scan base-package="com.webmvc"/>
相关代码