zoukankan      html  css  js  c++  java
  • REST WebService

    REST WebService

    前置技能

    ① 使用maven来管理java项目

    这个技能必须点一级,以便快速配置项目。

    本文实际上是我学习Spring的过程中搬的官网上的demo,使用maven配置项目。

    ② jdk 1.8+   该服务demo需要在jdk1.8+的环境下运行

    新建项目,配置依赖文件

    ① 安装好eclipse的maven插件后,使用file——new——other——maven——maven project 新建一个空的maven项目。

    ② 访问Spring官网demo http://spring.io/guides/gs/rest-service/

    将Build With Maven 模块中提供的pom内容复制到我们自己的pom文件中,注意将项目坐标替换成上图中的配置。

    最终得到pom文件:

    复制代码
    <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/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.sogou.testspring</groupId>
      <artifactId>testspring-demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.2.5.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-milestone</id>
                <url>https://repo.spring.io/libs-release</url>
            </repository>
        </repositories>
        <pluginRepositories>
            <pluginRepository>
                <id>spring-milestone</id>
                <url>https://repo.spring.io/libs-release</url>
            </pluginRepository>
        </pluginRepositories>
    </project>
    复制代码

    编写Model和Controller

    在source目录 src/main/java下新建hello包,在hello包下新建

    ① Greeting.java

    复制代码
    package hello;
    
    public class Greeting {
    
        private final long id;
        private final String content;
    
        public Greeting(long id, String content) {
            this.id = id;
            this.content = content;
        }
    
        public long getId() {
            return id;
        }
    
        public String getContent() {
            return content;
        }
    }
    复制代码

    ② GreetingController.java

    复制代码
    package hello;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicLong;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        private static final String template = "Hello, %s!";
        private final AtomicLong counter = new AtomicLong();
    
        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
            return new Greeting(counter.incrementAndGet(),
                                String.format(template, name));
        }
        @RequestMapping(value="/greeting2")
        public String Greeting2(@RequestParam(value="name",defaultValue="meiyou") String name){
            return name;
        }
        @RequestMapping("/greeting3")
        public List<Greeting> greeting3(@RequestParam(value="name", defaultValue="World") String name) {
            List<Greeting> list=new ArrayList<Greeting>();
            list.add(new Greeting(counter.incrementAndGet(),
                    String.format(template, name)));
            list.add(new Greeting(counter.incrementAndGet(),
                    String.format(template, name)));
            return list;
        }
    }
    复制代码

    ③ 启动服务  Application.java

    复制代码
    package hello;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    复制代码

    官网的demo至此为止,可以发现这个demo并不需要配置web.xml或者spring dispatherServlet的xml文件,也需要依赖web容器就可以运行。 看起来这更像是一个普通的Java应用程序。

    启动服务&访问

    ① 因为在pom中配置了插件

     <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>

    所以我们可以直接 runAs——maven build,target输入 spring-boot:run  来启动服务

    ② 通过maven package打包项目,生成jar包,然后在target目录下  java -jar  jar包名称,即可启动项目

    但是

     原搬原官网的demo,启动的时候会报错,顺着报错信息找下去,发现

    spring-boot-autoconfigure-1.2.5.RELEASE.jar包下

    org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties 类中

    有这么一段代码

    public static final String DEFAULT_PREFIX = "classpath:/templates/";
    
    public static final String DEFAULT_SUFFIX = ".html";

    看样子需要一个templates的目录,于是在resources目录下新建一个templates目录,再次启动成功。

    在浏览器中访问:

    http://localhost:8080/greeting

    {"id":2,"content":"Hello, World!"}


    http://localhost:8080/greeting2
    meiyou


    http://localhost:8080/greeting3
    [{"id":3,"content":"Hello, World!"},{"id":4,"content":"Hello, World!"}]

    其他

    注意到demo的控制器中使用了一个注解 @RestController ,这个在spring3.x里边是没有的。

    复制代码
    /*
     * Copyright 2002-2014 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.springframework.web.bind.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import org.springframework.stereotype.Controller;
    
    /**
     * A convenience annotation that is itself annotated with {@link Controller @Controller}
     * and {@link ResponseBody @ResponseBody}.
     * <p>
     * Types that carry this annotation are treated as controllers where
     * {@link RequestMapping @RequestMapping} methods assume
     * {@link ResponseBody @ResponseBody} semantics by default.
     *
     * @author Rossen Stoyanchev
     * @author Sam Brannen
     * @since 4.0
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Controller
    @ResponseBody
    public @interface RestController {
    
        /**
         * The value may indicate a suggestion for a logical component name,
         * to be turned into a Spring bean in case of an autodetected component.
         * @return the suggested component name, if any
         * @since 4.0.1
         */
        String value() default "";
    
    }
    复制代码

    可以看到该注解是一个类注解,其功能相当于同时应用了  @Controller 和 @ResponseBody

     
  • 相关阅读:
    聊聊WS-Federation
    用双十一的故事串起碎片的网络协议(上)
    责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
    最小化局部边际的合并聚类算法(中篇)
    最小化局部边际的合并聚类算法(上篇)
    UVaLive 7371 Triangle (水题,判矩形)
    UVaLive 7372 Excellence (水题,贪心)
    POJ 3312 Mahershalalhashbaz, Nebuchadnezzar, and Billy Bob Benjamin Go to the Regionals (水题,贪心)
    UVa 1252 Twenty Questions (状压DP+记忆化搜索)
    UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4840737.html
Copyright © 2011-2022 走看看