您的位置:首页 > 编程语言 > Java开发

不使用XML配置SpringMVC

2015-11-05 00:00 585 查看
摘要: 介绍了如何不使用一行XML配置一个SpringMVC工程。

对于大多数的Spring初学者来说,一开始接触的教程都是使用XML进行配置的;一般人自然会有很多不适应,比如一个servlet配置文件名字或者路径的问题就可能让你找老半天;其实Servlet从3.0版本起,就可以不使用web.xml来配置一个应用,Spring 3也提供了相关的支持,stackoverflow上有一个回答: http://stackoverflow.com/questions/15008126/spring-mvc-and-servlets-3-0-do-you-still-need-web-xml

示例代码地址:https://git.oschina.net/issasonjj/SpringNewDemo.git

本文使用的开发工具为STS(Spring Tool Suite)3.7.1,步骤如下:

一、工程的新建和配置

使用STS新建一个SpringMVC工程,贴上完整的pom.xml:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.jxjx</groupId>
<artifactId>www</artifactId>
<name>SpringNewDemo</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>4.2.2.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
<apiPath>newdemo</apiPath>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.2</version>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/${apiPath}</path>
<update>true</update>
<url>http://192.168.8.41:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
</configuration>
</plugin>
</plugins>
</build>
</project>


请保证javax.servlet-api库的版本为3.0及以上,并注意maven-war-plugin插件的failOnMissingWebXml选项,如果没有设置或者设为true,没有web.xml情况下会编译出错。

删除WEB-INF文件夹。

二、添加初始化类

Servlet 3.0后可以使用ServletContainerInitializer接口进行初始化而不需要web.xml进行配置;在Spring 3的q实现了此接口,它会调用一个WebApplicationInitializer接口的onStartup方法;因此我们需要创建一个实现该接口的初始化类;

public class MyAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.scan("com.jxjx.www.appconfig");
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(new GenericWebApplicationContext()));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
}

}

熟悉web.xml的读者可以发现以上代码跟XML配置有基本的一一对应关系,故不再赘述。

三、添加配置类

在初始化类的onStartup方法中,有一行代码context.scan("com.jxjx.www.appconfig"),用于扫描"com.jxjx.www.appconfig"包下的类;我们就把相关的配置类放在这个包下。

首先创建domain类

public class FooObj {
private String name;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}

}

随后使用注解进行配置

@Configuration
public class DomainConfig {

@Bean
public FooObj getFooObj() {
FooObj obj = new FooObj();
obj.setGender("man");
obj.setName("foo");
return obj;
}
}

再创建一个控制器配置的类

@Configuration
@EnableWebMvc
@ComponentScan("com.jxjx.www.spring.controllers")
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new MappingJackson2HttpMessageConverter());
}
}

我们准备提供返回JSON格式数据的接口,所以增加了JSON的Converter。

Controller的内容比较简单,返回一个JSON即可

@Controller
public class HomeController {

@Autowired FooObj obj;

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public @ResponseBody FooObj home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);

Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);

model.addAttribute("serverTime", formattedDate );

return obj;
}

}

如此,一个完全抛弃XML配置的Spring MVC工程就完成了。

总结:抛弃XML其实不是一件难事,大多数的教程还是由于惯性而使用大量的XML配置而吓跑了很多初学者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring web.xml