使用 Spring Java配置而不使用XML。
使用 pom.xml 更新所需的依赖:
<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.dhb.demo</groupId>
<artifactId>spring4MVCHelloWorldNoXMLDemo</artifactId>
<packaging>war</packaging>
<version>0.1.0-SNAPSHOT</version>
<name>spring4MVCHelloWorldNoXMLDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<jetty.context>/</jetty.context>
<jetty.http.port>9089</jetty.http.port>
<jetty.https.port>9444</jetty.https.port>
<jetty.stopPort>10081</jetty.stopPort>
<spring.version>4.1.4.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<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>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!--maven jetty 插件配置-->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.17.v20160517</version>
<configuration>
<webApp>
<contextPath>${jetty.context}</contextPath>
</webApp>
<httpConnector>
<port>${jetty.http.port}</port>
</httpConnector>
<stopKey>jetty</stopKey>
<stopPort>${jetty.stopPort}</stopPort>
<!--<scanIntervalSeconds>2</scanIntervalSeconds>-->
</configuration>
</plugin>
</plugins>
<finalName>Spring4MVCHelloWorldNoXMLDemo</finalName>
</build>
</project>
和上一篇博客有一个显着的区别: 我们已经包括一个依赖于Jackson 库(jackson-mapper-asl),其将用于所述响应数据转换成JSON字符串。
对于Spring 4.1.x 和以上, jackson-databind 2.3或以上是推荐使用的,以避免转换问题。
安全的选择,你可以包括 jackson-databind 最新版本。
添加一个POJO域对象
package com.dhb.springmvc.entity;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* Created by ${denghb} on 2016/8/1.
*/
public class User {
String name;
String password;
public User(){
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
上述对象将从控制器返回 Jackson 转换成 JSON 的格式。
添加控制器
在 src/main/java 包下添加控制器类
package com.dhb.springmvc.controller;
import com.dhb.springmvc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by ${denghb} on 2016/7/31.
*/
@RestController
@RequestMapping("/springmvc")
public class HelloWorldController {
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public String sayHello(@PathVariable String name) {
return name;
}
@RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
public User user(@PathVariable String name) {
User user = new User(name, "hello "+ name);
return user;
}
}
@PathVariable表示参数将被绑定到变量 URI 模板。更有趣的事情,这里要注意的是,这里我们使用的是 @RestController 注解,这标志着这个类作为控制器,每一个方法返回域对象pojo代替一个视图。这意味着我们不再使用视图解析器,我们不再直接发送响应的HTML,我们只发送的域对象转换成格式。在我们的例子中,由于 jackson 包含在类路径中,消息对象将转换成JSON格式。
添加配置类
/**
* Created by ${denghb} on 2016/7/31.
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.dhb.springmvc")
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
//super.configureDefaultServletHandling(configurer);
configurer.enable(); //配置静态文件处理
}
}
在这里,这个类是主要提供组件,扫描和注释支持,和静态文件处理。需要注意的是,我们没有任何视图解析器配置,因为我们在Rest案例并不需要。
添加初始化类
package com.dhb.springmvc.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* Created by ${denghb} on 2016/7/31.
*/
public class DhbWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { return null; };
}
@Override
protected Class<?>[] getServletConfigClasses() {
// return new Class<?>[0];
return new Class [] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
构建和部署应用程序
访问:http://localhost:9089/springmvc/hello/denghb,看到json输出
XML输出,可以让XML输出支持以及JSON输出
package com.dhb.springmvc.entity;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* Created by ${denghb} on 2016/8/1.
*/
//@XmlRootElement(name = "demo")
@XmlRootElement
public class User {
String name;
String password;
public User(){
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
编译,部署并再次运行它,会看到下面的输出(注意URL后缀),访问
http://localhost:9089/springmvc/hello/denghb.json
如果没有任何后缀,默认格式是XML:(备注:这个在google浏览器里不行,需要在后面加上.xml才能显示下图效果)