springMVC是通过DispatcherServlet将请求的URL映射到对应的控制器方法上,传统的配置DispatcherServlet的方式是配置在web.xml文件中。但是在servlet3.0的环境中,servlet容器会在类路径中查找javax.servlet.ServletContainerInitializer接口的类,如果能发现,就会用来配置servlet容器。Spring提供了这个接口的实现名为SpringServletContainerInitializer
package org.springframework.web;
import java.lang.reflect.Modifier;
import java.util.LinkedList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
if (webAppInitializerClasses != null) {
for (Class<?> waiClass : webAppInitializerClasses) {
// Be defensive: Some servlet containers provide us with invalid classes,
// no matter what @HandlesTypes says...
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer) waiClass.newInstance());
}
catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
return;
}
AnnotationAwareOrderComparator.sort(initializers);
servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}
这个类会查找实现WebApplicationInitializer的类并将容器配置任务交给它们。
AbstractAnnotationConfigDispatcherServletInitializer继承的父类
实现WebApplicationInitializer,在spring3.2版本以后。
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MyWebAppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] {RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"}; //将DispatcherServlet映射到"/"
}
}
因此我们只要继承AbstractAnnotationConfigDispatcherServletInitializer重写它的三个方法就可以配置DispatcherServlet和Spring应用上下文,而不需要在web.xml中配置。
getRootConfigClasses()方法返回带有@Configuration注解类会用来配置ContextLoaderListener创建应用上下文的Bean。getServletConfigClasses返回带有@Configuration注解的类会用来创建DispatcherServlet上下文中的bean,这两个上下文是父子关系。
下面我们看一下RootConfig和WebConfig
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.PropertySource;
@ImportResource({"classpath:applicationContext.xml"})
//为了注入Environment,需要在RootConfig时加载配置文件
@PropertySource(value="classpath:application.properties")
@ComponentScan(basePackages={"com.asclepius.slhdt.serv"},excludeFilters ={ @Filter(type = FilterType.ASPECTJ, pattern = "com.asclepius.slhdt.serv.modules.*.controller.*Controller"), //排除所有控制器
@Filter(type = FilterType.REGEX, pattern = "com.asclepius.slhdt.serv.config.*")})
public class RootConfig {
}
@EnableWebMvc
@ComponentScan("com.asclepius.slhdt.serv.modules.*.controller")
public class WebConfig extends WebMvcConfigurerAdapter {
// Thymeleaf view Resolver
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver =
new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
viewResolver.setCharacterEncoding("UTF-8");
return viewResolver;
}
// Template resolver
@Bean
public TemplateResolver templateResolver() {
TemplateResolver templateResolver =
new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setOrder(1);
return templateResolver;
}
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
// 静态资源可访问
configurer.enable();
}
}
webconfig继承了WebMvcConfigurerAdapter 重写了configureDefaultServletHandling()方法,是为了使对静态资源的请求转发到servlet容器上,而不是控制器。注意webconfig与rootconfig扫描装备的bean不应该有重复,否则会产生两个同类的bean。webconfig只要扫描装配控制器,视图解析器等相关的bean,让dispatcherServlet映射,rootconfig则要扫描装配一般的bean。
- 大小: 23.3 KB
分享到:
相关推荐
浅谈SpringMVC的...通过配置DispatcherServlet和SpringMVC的配置文件,我们可以轻松地构建基于SpringMVC的Web应用程序。同时,Controller和视图的实现也非常重要,它们共同构成了SpringMVC的核心架构。
DispatcherServlet 作为一个 Servlet,需要根据 Servlet 规范使用 Java 配置或 web.xml 声明和映射。然而,DispatcherServlet 使用 Spring 配置来发现请求映射、视图解析、异常处理等等所需的委托组件。这就引出了一...
3. 配置SpringMVC:配置DispatcherServlet,定义视图解析器,处理拦截器,以及Controller的映射。 4. 配置Mybatis:配置Mybatis的SqlSessionFactory,创建Mapper接口和对应的XML映射文件,定义SQL语句。 5. 编写业务...
在传统的SpringMVC应用中,我们需要在`web.xml`中声明DispatcherServlet,并在Spring的配置文件中定义Controller、Service、Repository等组件。然而,随着Java注解的发展,SpringMVC允许我们使用注解来替代这些XML...
4. 使用Java配置:SpringMVC的Java配置类通常会继承`WebMvcConfigurerAdapter`,然后重写其中的方法来配置拦截器、视图解析器、消息转换器等。例如,你可以定义`addViewControllers()`来添加预定义的Controller,...
1. **核心配置文件**:SpringMVC的配置通常在`dispatcher-servlet.xml`中进行,这是SpringMVC的前端控制器DispatcherServlet的初始化参数。这个文件定义了处理器映射器、视图解析器、异常处理器等关键组件。 2. **...
2. **SpringMVC配置**:在项目中,会有一个或多个配置文件,如`DispatcherServlet-servlet.xml`,用于配置SpringMVC的核心组件,包括视图解析器、处理器映射器、拦截器等。这些配置使得SpringMVC能够识别和处理HTTP...
在“springMVC配置好的环境”中,我们通常包括了运行 Spring MVC 应用所需的所有组件和设置,这些组件可能包括但不限于: 1. **Spring Framework**:Spring 是整个应用的基础,它提供了依赖注入(DI)、面向切面...
它定义了Bean的生命周期和依赖关系,包括数据源、事务管理器、SpringMVC的DispatcherServlet配置以及MyBatis的SqlSessionFactory。例如,你可以看到如下配置: ```xml <!-- 数据库连接配置 --> <!-- ...
本项目"springMVC零配置,无web.xml,无spring配置"就是基于这样的理念,完全采用Java配置实现Spring MVC的应用。 在纯Java配置的Spring MVC项目中,核心的配置类通常会继承自`WebMvcConfigurerAdapter`或`...
在 `web.xml` 文件中,你需要配置 DispatcherServlet 的初始化参数,指定配置文件的位置。 3. **创建配置文件**:通常,我们会创建一个 `DispatcherServlet-servlet.xml` 配置文件,其中定义了视图解析器、模型-视图...
SpringMVC通过DispatcherServlet作为前端控制器,接收所有请求,并使用HandlerMapping将请求路由到合适的处理器。 **J2EE**(Java EE)是Java平台的企业版,提供了一组标准和API,用于构建分布式、多层的Web应用。...
总结,SpringMVC4的零配置特性使得开发更加简洁高效,通过Java配置、自动配置和各种注解,我们可以快速搭建起一个功能完善的Web应用。理解并熟练掌握这些知识点,能够极大地提升开发效率,让开发者更专注于业务逻辑...
配置SpringMVC涉及创建DispatcherServlet,配置处理器映射器和适配器,定义视图解析器,以及可能的拦截器设置。 MyBatis是一个轻量级的Java持久层框架,它简化了SQL操作,将SQL语句与Java代码分离。MyBatis通过XML...
在 SpringMVC 中,我们需要配置 DispatcherServlet,它是 SpringMVC 的核心,负责接收请求并分发到相应的处理器。此外,还需要配置 HandlerMapping 和 HandlerAdapter,它们分别用于映射请求到控制器方法和适配控制...
在使用SpringMVC框架时,开发者需要在web.xml中配置DispatcherServlet,或者通过Java配置类的方式配置。通常需要指定一个或多个视图解析器,并配置Spring的IoC容器。 此外,SpringMVC支持多种控制器形式,包括接口...
3. 配置SpringMVC:创建SpringMVC的配置文件,如servlet-context.xml,配置DispatcherServlet、ViewResolver、HandlerMapping等。 4. 配置Mybatis:创建mybatis的全局配置文件,mybatis-config.xml,配置数据源、...
3. 配置SpringMVC:设置DispatcherServlet,配置视图解析器、拦截器、模型驱动等。 4. 配置Mybatis:创建Mybatis的配置文件,定义数据源、事务管理器,以及Mapper接口和XML映射文件。 5. 编写Service层和Dao层:...
1. 配置SpringMVC:设置DispatcherServlet、配置Controller Bean、定义视图解析器,以及配置其他Spring组件,如Service和DAO。 2. 配置Hibernate:配置SessionFactory,声明数据源,设置实体类和数据库表的映射,...