`
chenshangge
  • 浏览: 87850 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

SpringMVC java 配置 DispatcherServlet

 
阅读更多
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的...通过配置DispatcherServlet和SpringMVC的配置文件,我们可以轻松地构建基于SpringMVC的Web应用程序。同时,Controller和视图的实现也非常重要,它们共同构成了SpringMVC的核心架构。

    Spring框架系列(13) - SpringMVC实现原理之DispatcherServlet的初始化过程.doc

    DispatcherServlet 作为一个 Servlet,需要根据 Servlet 规范使用 Java 配置或 web.xml 声明和映射。然而,DispatcherServlet 使用 Spring 配置来发现请求映射、视图解析、异常处理等等所需的委托组件。这就引出了一...

    spring+springMVC+Mybatis demo参考

    3. 配置SpringMVC:配置DispatcherServlet,定义视图解析器,处理拦截器,以及Controller的映射。 4. 配置Mybatis:配置Mybatis的SqlSessionFactory,创建Mapper接口和对应的XML映射文件,定义SQL语句。 5. 编写业务...

    SpringMVC纯注解配置

    在传统的SpringMVC应用中,我们需要在`web.xml`中声明DispatcherServlet,并在Spring的配置文件中定义Controller、Service、Repository等组件。然而,随着Java注解的发展,SpringMVC允许我们使用注解来替代这些XML...

    SpringMVC基于代码的配置方式(零配置,无web.xml)

    4. 使用Java配置:SpringMVC的Java配置类通常会继承`WebMvcConfigurerAdapter`,然后重写其中的方法来配置拦截器、视图解析器、消息转换器等。例如,你可以定义`addViewControllers()`来添加预定义的Controller,...

    SpringMVC一些配置文件的demo

    1. **核心配置文件**:SpringMVC的配置通常在`dispatcher-servlet.xml`中进行,这是SpringMVC的前端控制器DispatcherServlet的初始化参数。这个文件定义了处理器映射器、视图解析器、异常处理器等关键组件。 2. **...

    SpringMVC Demo_java_springmvc_DEMO_

    2. **SpringMVC配置**:在项目中,会有一个或多个配置文件,如`DispatcherServlet-servlet.xml`,用于配置SpringMVC的核心组件,包括视图解析器、处理器映射器、拦截器等。这些配置使得SpringMVC能够识别和处理HTTP...

    springMVC配置好的环境

    在“springMVC配置好的环境”中,我们通常包括了运行 Spring MVC 应用所需的所有组件和设置,这些组件可能包括但不限于: 1. **Spring Framework**:Spring 是整个应用的基础,它提供了依赖注入(DI)、面向切面...

    spring springmvc mybatis配置文件

    它定义了Bean的生命周期和依赖关系,包括数据源、事务管理器、SpringMVC的DispatcherServlet配置以及MyBatis的SqlSessionFactory。例如,你可以看到如下配置: ```xml &lt;!-- 数据库连接配置 --&gt; &lt;!-- ...

    springMVC零配置,无web.xml,无spring配置

    本项目"springMVC零配置,无web.xml,无spring配置"就是基于这样的理念,完全采用Java配置实现Spring MVC的应用。 在纯Java配置的Spring MVC项目中,核心的配置类通常会继承自`WebMvcConfigurerAdapter`或`...

    springmvc基本配置及定时任务配置修改

    在 `web.xml` 文件中,你需要配置 DispatcherServlet 的初始化参数,指定配置文件的位置。 3. **创建配置文件**:通常,我们会创建一个 `DispatcherServlet-servlet.xml` 配置文件,其中定义了视图解析器、模型-视图...

    基于SpringMVC的JAVA论坛(J2EE BBS 毕业设计)

    SpringMVC通过DispatcherServlet作为前端控制器,接收所有请求,并使用HandlerMapping将请求路由到合适的处理器。 **J2EE**(Java EE)是Java平台的企业版,提供了一组标准和API,用于构建分布式、多层的Web应用。...

    SpringMVC4零配置

    总结,SpringMVC4的零配置特性使得开发更加简洁高效,通过Java配置、自动配置和各种注解,我们可以快速搭建起一个功能完善的Web应用。理解并熟练掌握这些知识点,能够极大地提升开发效率,让开发者更专注于业务逻辑...

    springmvc,mybatis,shiro综合配置示例

    配置SpringMVC涉及创建DispatcherServlet,配置处理器映射器和适配器,定义视图解析器,以及可能的拦截器设置。 MyBatis是一个轻量级的Java持久层框架,它简化了SQL操作,将SQL语句与Java代码分离。MyBatis通过XML...

    maven搭建的springmvc+hibernate框架

    在 SpringMVC 中,我们需要配置 DispatcherServlet,它是 SpringMVC 的核心,负责接收请求并分发到相应的处理器。此外,还需要配置 HandlerMapping 和 HandlerAdapter,它们分别用于映射请求到控制器方法和适配控制...

    SpringMVC框架

    在使用SpringMVC框架时,开发者需要在web.xml中配置DispatcherServlet,或者通过Java配置类的方式配置。通常需要指定一个或多个视图解析器,并配置Spring的IoC容器。 此外,SpringMVC支持多种控制器形式,包括接口...

    Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载

    3. 配置SpringMVC:创建SpringMVC的配置文件,如servlet-context.xml,配置DispatcherServlet、ViewResolver、HandlerMapping等。 4. 配置Mybatis:创建mybatis的全局配置文件,mybatis-config.xml,配置数据源、...

    Spring+Springmvc+Mybatis

    3. 配置SpringMVC:设置DispatcherServlet,配置视图解析器、拦截器、模型驱动等。 4. 配置Mybatis:创建Mybatis的配置文件,定义数据源、事务管理器,以及Mapper接口和XML映射文件。 5. 编写Service层和Dao层:...

    SpringMVC和Hibernate

    1. 配置SpringMVC:设置DispatcherServlet、配置Controller Bean、定义视图解析器,以及配置其他Spring组件,如Service和DAO。 2. 配置Hibernate:配置SessionFactory,声明数据源,设置实体类和数据库表的映射,...

Global site tag (gtag.js) - Google Analytics