• 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

     
  • 相关阅读:
    b_lc_数组中最大数对和的最小值(排序+思维 | 进阶:第k)
    b_lc_使用服务器处理任务(模拟 + 堆)
    b_lc_插入后的最大值(贪心+区分正负数)
    b_lc_蓄水(反向思维:枚举取水次数)
    万能JDBC工具类【DBUtil 】
    Eureka服务注册中心
    springboot dubbo+zookeeper
    Thymleaf引擎模板
    多环境切换 & JSR303数据校验
    yaml配置注入
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4840737.html
Copyright © 2020-2023  润新知