= Spring =
Spring helps development teams everywhere build simple, portable, fast and flexible JVM-based systems and applications.
http://spring.io/guides
http://spring.io/guides/gs/serving-web-content/
== REST service ==
spring.io/guides/gs/rest-service/
=== Structure ===
{{{
.
|-- pom.xml
|-- src
|   `-- main
|       `-- java
|           `-- hello
|               |-- Application.java
|               |-- Greeting.java
|               `-- GreetingController.java
`-- target
    |-- classes
    |   `-- hello
    |       |-- Application.class
    |       |-- Greeting.class
    |       `-- GreetingController.class
    |-- generated-sources
    |   `-- annotations
    |-- gs-rest-service-0.1.0.jar
    |-- gs-rest-service-0.1.0.jar.original
    `-- maven-archiver
        `-- pom.properties
}}}
=== Steps ===
 * mkdir -p /tmp/greetingSpring
 * mkdir -p /tmp/greetingSpring/src/main/java/hello
 * mkdir -p /tmp/greetingSpring/target
 * cd /tmp/greetingSpring
pom.xml 
{{{#!highlihht xml
  4.0.0
  org.springframework
  gs-rest-service
  0.1.0
  
    org.springframework.boot
    spring-boot-starter-parent
    1.1.5.RELEASE
  
  
    
      org.springframework.boot
      spring-boot-starter-web
    
  
hello.Application
maven-compiler-plugin
2.3.2
org.springframework.boot
spring-boot-maven-plugin
spring-releases
http://repo.spring.io/libs-release
spring-releases
http://repo.spring.io/libs-release
}}}
src/main/java/hello/Application.java 
{{{#!highlight java
package hello;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
}}}
src/main/java/hello/Greeting.java 
{{{#!highlight 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;
    }
}
}}}
src/main/java/hello/GreetingController.java 
{{{#!highlight java
package hello;
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", required=false, defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}
}}}
Build with 
 * mvn clean compile package
Run with:
 * jar -tf target/gs-rest-service-0.1.0.jar # check JAR contents
 * java -jar target/gs-rest-service-0.1.0.jar
 * open URL http://localhost:8080/greeting
== Tomcat REST service ==
Structure
{{{
.
|-- pom.xml
|-- src
    `-- main
        `-- java
            `-- hello
                |-- Application.java
                |-- Greeting.java
                `-- GreetingController.java
}}}
'''pom.xml'''
{{{#!highlight xml
    4.0.0
    org.springframework
    gs-rest-service-tomcat
    0.1.0
    war
    
        org.springframework.boot
        spring-boot-starter-parent
        1.1.5.RELEASE
    
    
        
            org.springframework.boot
            spring-boot-starter-web
            compile 
        
    
    
        hello.Application
    
    
        
            
                maven-compiler-plugin
                2.3.2
            
        
    
    
        
            spring-releases
            http://repo.spring.io/libs-release
        
    
    
        
            spring-releases
            http://repo.spring.io/libs-release
        
    
}}}
'''src/main/java/hello/Application.java'''
{{{#!highlight java
package hello;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Configuration;
@ComponentScan
@EnableAutoConfiguration
@Configuration
public class Application  extends SpringBootServletInitializer  {
    public static void main(String[] args) {
        SpringApplication.run(appClass, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(appClass);
    }
    private static Class appClass = Application.class;
}
}}}
'''src/main/java/hello/Greeting.java'''
{{{#!highlight 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;
    }
}
}}}
'''src/main/java/hello/GreetingController.java'''
{{{#!highlight java
package hello;
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 Tomcat, %s!";
    private final AtomicLong counter = new AtomicLong();
    @RequestMapping("/greetingTomcat")
    public Greeting greeting(@RequestParam(value="name", required=false, defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}
}}}
=== Build and deploy ===
 * mvn clean compile package install
 * cp target/gs-rest-service-tomcat-0.1.0.war /usr/local/tomcat/webapps/ 
 * cp target/gs-rest-service-tomcat-0.1.0.war /opt/apache-tomcat-7.0.53/webapps/ # in alternative
 * Open http://localhost:8080/gs-rest-service-tomcat-0.1.0/greetingTomcat