Spring MVC全注解配置 - 无web.xml

Serlvet 3以后,我们可以使用注解来配置Servlet,对于像Spring这类的框架来说是一个很好的适应。Spring也对此特性加入了很多的新功能。本文就将简单的对之前的xml配置转换为java代码的配置。代码配置让程序员们觉得更加具有流程化,不像配置很多代码程序员们都不愿意look into。

接下来,进行替换我们之前的web.xml和spring-mvc.xml的配置。也就是在你的web工程里面看不到这两个配置文件了。(可能有的童鞋会说,这样配置可能对以后的修改不方便,无法达到只修改配置文件就切换某些环境。其实不是,零配置文件只是修改了类定义的配置,并没有修改之前配置文件的灵活性。我想无论谁也不会在之前的web.xml中去修改某个servlet的配置吧。况且这些所谓的配置文件灵活性,只是针对某个值,我们可以写在我们的properties文件里面,而且Spring对这类配置文件有很好的支持,而且使用很方便,有兴趣的童鞋可以去search一下。所以请打消这个配置不灵活的念头)。

切入正题,首先我们要替换web.xml。在Spring MVC中配置DispatchServlet,该类是 Spring MVC的核心类(该类具体作用请参考Spring MVC相关文档)。也就是在容器启动的时候就要初始化该类,并且配置相应的参数。

之前我们的web.xml中对DispatchServlet的配置如下:

<servlet>
   <servlet-name>dispatcher</servlet-name>
   <servlet-class>
     org.springframework.web.servlet.DispatcherServlet
   </servlet-class>
   <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

Servlet3 以后,支持动态的添加Servlet配置,请参考ServletContext.addServlet方法。因此我们可以使用Spring MVC提供的AbstractDispatcherServletInitializer类。该类是的类关系是AbstractDispatcherServletInitializer -> WebApplicationInitializer,(点击查看WebApplicationInitializer详解)在AbstractDispatcherServletInitializer中重写onStartup方法,调用ServletContext.addServlet来实现注册该servlet。通过查看AbstractDispatcherServletInitializer源码,发现只需用重写他的三个方法既可以完成对DispatchServlet的注册。详细请看示例代码:

public class WebInitialConfiguration extends
		AbstractDispatcherServletInitializer {

	@Override
	protected WebApplicationContext createServletApplicationContext() {
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		// scan the class under the demo.config package with @Configuration annotation 
		// You can add it by manually such as:
		// context.register(Class<?>... annotatedClasses) -> context.register(WebMVCConfiguration.class, AppConfig.class, ....)
		// This configuration like:
		// <init-param>
	    // 		<param-name>contextConfigLocation</param-name>
	    // 		<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
	    // </init-param>
	    // all the configuration classes are in the same package, so use the getClass() method to get the package. Here the package name is com.sample.config
		context.scan(ClassUtils.getPackageName(getClass()));
		return context;
	}

	@Override
	protected String[] getServletMappings() {
		// Set the URL mapping
		return new String[] { "/" };
	}

	@Override
	protected WebApplicationContext createRootApplicationContext() {
		return null;
	}
}

细心的童鞋可以查看一下AbstractDispatcherServletInitializer的源码,会发现在代码中调用了ContextServlet.addServlet方法的:

DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
		ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, dispatcherServlet);

这时我们启动servlet3容器(本文使用tomcat7), 你会看到如下启动信息:

INFO: Initializing Spring FrameworkServlet ‘dispatcher‘
INFO: FrameworkServlet ‘dispatcher‘: initialization started
Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler]
INFO: FrameworkServlet ‘dispatcher‘: initialization completed in 843 ms

接下,替换spring-mvc.xml,在该配置中,我们只需用去配置很少几部分就可以借助Spring提供的接口完成对所有controller的注册和对视图解析的配置。

xml配置如下:

<context:component-scan base-package="com.sample.controller"/>
<context:annotation-config/>
<!-- This tag registers the DefaultAnnotationHandlerMapping and
         AnnotationMethodHandlerAdapter beans that are required for Spring MVC  -->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <propertyname="prefix"value="/WEB-INF/pages/"/>
     <propertyname="suffix"value=".jsp"/>
</bean>
 
<!-- This tag allows for mapping the DispatcherServlet to "/" -->
<mvc:default-servlet-handler/>

首先,在Spring MVC中,我们可以使用@Configuration来进行Spring的配置,我们刚才也有需要去扫描这一类的配置类。接下来就是需要开启Spring MVC的具体配置。使用@EnableWebMvc,该注解等同于<mvc:annotation-driven/>,该标签具体的意思请看xml配置中对该标签的解释。

接下来我们要去扫描我们的controller,即有@Controller的类。因此我们使用@ComponentScan进行扫描,该注解等同于<context:componet-scan>。

Spring MVC需要对视图的解析进行一次定义,因此我们需要在该类中实例化一个ResourceViewResolver,该类的定义视具体需要而定。

具体的代码如下:

@Configuration
// <mvc:annotation-driven/>
@EnableWebMvc
@ComponentScan(basePackages={"com.sample.controller"})
public class WebMVCConfiguration extends WebMvcConfigurerAdapter {

	// equals: <mvc:default-servlet-handler/>
	@Override
	public void configureDefaultServletHandling(
			DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}

	// add the resolver
	@Bean
	public InternalResourceViewResolver internalResourceViewResolver() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setPrefix("/WEB-INF/pages/");
		resolver.setSuffix(".jsp");
		return resolver;
	}
}

此时我们添加我们的controller到com.sample.controller包下,然后定义我们的requestmapping,再次启动server,你会看到会增加之前检测到的controller的信息。

INFO: Mapped "{[/test],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.sample.controller.TestController.test()

至此,简单的替换已经完成,更多的功能会在后续的文章中继续加入,如:spring-security, thymeleaf(一个很不错的视图框架)。

时间: 2024-10-26 18:35:10

Spring MVC全注解配置 - 无web.xml的相关文章

java spring mvc 全注解

本人苦逼学生一枚,马上就要毕业,面临找工作,实在是不想离开学校.在老师的教导下学习了spring mvc ,配置文件实在繁琐,因此网上百度学习了spring mvc 全注解方式完成spring的装配工作; 废话不多说了上干货,其实我也没怎么理解不过简单的运行了一个spring mvc 全注解项目,也不能说是全注解,因为保留了web.xml和spring-serlvet.xml文件,(可能有的童鞋会说,这样配置可能对以后的修改不方便,无法达到只修改配置文件就切换某些环境.其实不是,零配置文件只是修

Spring jdbctemplate和事务管理器 全注解配置 不使用xml

/** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>// 作用为:配置spring容器(应用上下文)@ComponentScan("com.zxh")//需要扫描的包@Import({JdbcConfig.class,TransactionConfig.class})//子配置类@PropertySource("jdbcC

Spring学习记录(2) Spring MVC+Mybatis 注解配置

所有XML的配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springfr

spring mvc jfreechar注解配置及数据库访问

1.action类,使用注解配置的: package com.t5.manage.action;import java.awt.Font;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Map; import javax.annotation.Resource;import javax.servl

基于maven的SpringMVC,Spring,MyBatis的全注解配置

首先创建maven项目 1.maven添加各种依赖包 <!-- 数据库连接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- Mybatis与Spring的包 --> <dependency>

springmvc3.2+spring+hibernate4全注解方式整合(一)

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.

servlet3.0无web.xml

大家应该都已经知道spring 3.1对无web.xml式基于代码配置的servlet3.0应用.通过spring的api或是网络上高手们的博文,也一定很快就学会并且加到自己的应用中去了.PS:如果还没,也可以小小参考一下鄙人的上一篇文章<<探 Spring 3.1之无web.xml式 基于代码配置的servlet3.0应用>>. 经过一天的深度research, 我了解,理解以及重现了springframework的那一小段代码. OK,第一步,入手点,WebApplicatio

spring 4 + jpa(hibernate 3/4) + spring mvc 多数据源配置

先从persistence.xml开始: <?xml version=”1.0″ encoding=”UTF-8″?><persistence version=”2.1″ xmlns=”http://java.sun.com/xml/ns/persistence” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence

【Spring】Spring MVC原理及配置详解

1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中. Spring MVC主要由DispatcherServlet.处理器映射.处理器(控制器).视图解析器.视图组成.他的两个核心是两个核心: 处理器映射:选择使用