zoukankan      html  css  js  c++  java
  • Spring4 MVC REST服务使用@RestController实例

    在这篇文章中,我们将通过开发使用 Spring4 @RestController 注解来开发基于Spring MVC4的REST风格的JSON服务。我们将扩展这个例子通过简单的注释与JAXB标注域类支持XML输出和JSON输出。在这个示例中,我们需要URL的后缀为 .xml 或 .json 以获得所需的输出。

    使用以下技术:
    • Spring 4.0.6.RELEASE
    • jackson-mapper-asl 1.9.13
    • Maven 3
    • JDK 1.6
    • Tomcat 7.0.54
    • Eclipse JUNO Service Release 2

    让我们现在开始!

    第1步:创建目录结构
    之前的文章使用Eclipse创建Maven Web项目包含了一步一步的指导,使用 Eclipse 来创建一个Maven项目(Spring4MVCRestServiceDemo)。
    下面是最终的项目目录结构:

    我们将使用 Spring Java配置而不使用XML。现在,让我们来添加/更新上述项目结构中提到的内容。
    第2步:使用 pom.xml 更新所需的依赖
    <?xml version="1.0"?>
    <project
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.yiibai.springmvc</groupId>
    	<artifactId>Spring4MVCRestServiceDemo</artifactId>
    	<packaging>war</packaging>
    	<version>1.0.0</version>
    	<name>Spring4MVCRestServiceDemo Maven Webapp</name>
    
    	<properties>
    		<springframework.version>4.0.6.RELEASE</springframework.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-core</artifactId>
    			<version>${springframework.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-web</artifactId>
    			<version>${springframework.version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${springframework.version}</version>
    		</dependency>
    
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>javax.servlet-api</artifactId>
    			<version>3.1.0</version>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet.jsp.jstl</groupId>
    			<artifactId>jstl-api</artifactId>
    			<version>1.2</version>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet.jsp</groupId>
    			<artifactId>javax.servlet.jsp-api</artifactId>
    			<version>2.3.1</version>
    		</dependency>
    
    		<dependency>
    			<groupId>org.codehaus.jackson</groupId>
    			<artifactId>jackson-mapper-asl</artifactId>
    			<version>1.9.13</version>
    		</dependency>
    	</dependencies>
    	<build>
    		<pluginManagement>
    			<plugins>
    				<plugin>
    					<groupId>org.apache.maven.plugins</groupId>
    					<artifactId>maven-war-plugin</artifactId>
    					<version>2.4</version>
    					<configuration>
    						<warSourceDirectory>src/main/webapp</warSourceDirectory>
    						<warName>Spring4MVCRestServiceDemo</warName>
    						<failOnMissingWebXml>false</failOnMissingWebXml>
    					</configuration>
    				</plugin>
    			</plugins>
    		</pluginManagement>
    		<finalName>Spring4MVCRestServiceDemo</finalName>
    	</build>
    </project> 

    上面的 pom.xml 与以前的教程中定义的相同。有一个显着的区别: 我们已经包括一个依赖于Jackson 库(jackson-mapper-asl),其将用于所述响应数据转换成JSON字符串。

    对于Spring 4.1.x 和以上, jackson-databind 2.3或以上是推荐使用的,以避免转换问题。

    安全的选择,你可以包括 jackson-databind 最新版本。
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>
    
    第3步:添加一个POJO/域对象
    package com.yiibai.springmvc.domain;
    
    public class Message {
    
    	String name;
    	String text;
    
    	public Message(String name, String text) {
    		this.name = name;
    		this.text = text;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public String getText() {
    		return text;
    	}
    
    }
    
    上述对象将从控制器返回 Jackson 转换成 JSON 的格式。
    第4步:添加控制器
    在 src/main/java 包下添加控制器类,如下图所示。
    package com.yiibai.springmvc.controller;
    
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.yiibai.springmvc.domain.Message;
    
    @RestController
    public class HelloWorldRestController {
    
    	@RequestMapping("/hello/{player}")
    	public Message message(@PathVariable String player) {
    
    		Message msg = new Message(player, "Hello " + player);
    		return msg;
    	}
    
    } 

    @PathVariable表示参数将被绑定到变量 URI 模板。更有趣的事情,这里要注意的是,这里我们使用的是 @RestController 注解,这标志着这个类作为控制器,每一个方法返回域对象/pojo代替一个视图。这意味着我们不再使用视图解析器,我们不再直接发送响应的HTML,我们只发送的域对象转换成格式。在我们的例子中,由于 jackson 包含在类路径中,消息对象将转换成JSON格式。

    第5步:添加配置类
    package com.yiibai.springmvc.configuration;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    
    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = "com.yiibai.springmvc")
    public class HelloWorldConfiguration {
    
    } 

    在这里,这个类是主要提供组件,扫描和注释支持。需要注意的是,我们没有任何视图解析器配置,因为我们在Rest案例并不需要。

    第6步:添加初始化类

    添加一个初始化类实现WebApplicationInitializer在src/main/java,使用如下图所示指定包(在这种情况下,替代在web.xml中定义的任何spring的配置)。在Servlet 3.0容器启动时,这个类会被加载并实例,它是在启动时方法将通过servlet容器调用。

    package com.yiibai.springmvc.configuration;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRegistration;
    
    import org.springframework.web.WebApplicationInitializer;
    import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
    import org.springframework.web.servlet.DispatcherServlet;
    
    public class HelloWorldInitializer implements WebApplicationInitializer {
    
    	public void onStartup(ServletContext container) throws ServletException {
    
    		AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    		ctx.register(HelloWorldConfiguration.class);
    		ctx.setServletContext(container);
    
    		ServletRegistration.Dynamic servlet = container.addServlet(
    				"dispatcher", new DispatcherServlet(ctx));
    
    		servlet.setLoadOnStartup(1);
    		servlet.addMapping("/");
    	}
    
    } 

    更新:请注意,上面的类可以写成更加简洁[和它的首选方式],通过扩展 AbstractAnnotationConfigDispatcherServletInitializer 基类,如下所示:

    package com.yiibai.springmvc.configuration;
    
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    	@Override
    	protected Class<?>[] getRootConfigClasses() {
    		return new Class[] { HelloWorldConfiguration.class };
    	}
     
    	@Override
    	protected Class<?>[] getServletConfigClasses() {
    		return null;
    	}
     
    	@Override
    	protected String[] getServletMappings() {
    		return new String[] { "/" };
    	}
    
    }
    
    第7步:构建和部署应用程序

    现在构建 war(在 Eclipse中)或通过 Maven 命令行( mvn clean install)。 部署 war 文件到Servlet3.0容器。

    运行它。访问: http://localhost:8080/Spring4MVCRestServiceDemo/hello/Messi ,您将看到 JSON 输出,如下图所示:

    就这样,所有输出如上所示。

    适应XML输出

    现在,如上面提到的,只是通过增加模型类(Message)JAXB注释,我们可以让XML输出支持以及JSON输出。下面是相同的演示:

    package com.yiibai.springmvc.domain;
    
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "pizza")
    public class Message {
    
    	String name;
    	String text;
    
    	public Message(){
    		
    	}
    	
    	public Message(String name, String text) {
    		this.name = name;
    		this.text = text;
    	}
    
    	@XmlElement
    	public String getName() {
    		return name;
    	}
    	
    	@XmlElement
    	public String getText() {
    		return text;
    	}
    
    }
    
    编译,部署并再次运行它,会看到下面的输出(注意URL后缀),访问URL:http://localhost:8080/Spring4MVCRestServiceDemo/hello/Yiibai.xml

    再次访问:http://localhost:8080/Spring4MVCRestServiceDemo/hello/Yiibai.json

    如果没有任何后缀,默认格式是XML:

    到这里,全部完成!

  • 相关阅读:
    redhat 关机注销命令详解
    CentOS网络配置详解
    Red Hat 6网络配置笔记
    H3C三层交换机S5500初始配置+网络访问策略
    python 发邮件 ,转载:https://mp.weixin.qq.com/s/kmNZ04MlDve4AmCCOoT2HA
    解决不能右键查看元素的问题, 转载:https://mp.weixin.qq.com/s/V_fpPN62Kdf0bz6zgFpVCg
    这几点鲜有人知的爬虫技巧,让你爽歪歪 转载:https://mp.weixin.qq.com/s/52luElhn4nRBZCdQMGEhnw
    一个反爬 JS 逆向分析的例子 转载:https://mp.weixin.qq.com/s/2luhB-AhMIzxVh6rPERzCA
    ssh 端口转发 转载:https://mp.weixin.qq.com/s/uesOCt9gmdST-HpwYTKsIw
    爬虫视频
  • 原文地址:https://www.cnblogs.com/borter/p/9519783.html
Copyright © 2011-2022 走看看