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/

http://spring.io/guides/gs/convert-jar-to-war-maven/

ApplicationContextAware

ApplicationContextAware, Interface to be implemented by any object that wishes to be notified of the ApplicationContext that it runs in.

   1 void setApplicationContext(ApplicationContext applicationContext)
   2 // applicationContext.getBean()
   3 // applicationContext.getEnvironment()
   4 

ResourceLoaderAware

ResourceLoaderAware, Interface to be implemented by any object that wishes to be notified of the ResourceLoader (typically the ApplicationContext) that it runs in.

   1 void setResourceLoader(ResourceLoader resourceLoader)
   2 // resourceLoader.getClassLoader()
   3 // resourceLoader.getResource(String location)
   4 

EnvironmentAware

EnvironmentAware, Interface to be implemented by any bean that wishes to be notified of the Environment that it runs in.

   1 void setEnvironment(Environment environment)
   2 // environment.containsProperty() 
   3 // environment.getProperty()
   4 // environment.getActiveProfiles()
   5 

REST service (SpringBoot)

spring.io/guides/gs/rest-service/

Structure

.
|-- pom.xml
|-- src
|   `-- main
|       `-- java
|           `-- hello
|               |-- Application.java
|               |-- Greeting.java
|               `-- GreetingController.java

Steps

   1 mkdir -p /tmp/greetingSpring
   2 mkdir -p /tmp/greetingSpring/src/main/java/hello
   3 mkdir -p /tmp/greetingSpring/target
   4 cd /tmp/greetingSpring

pom.xml

   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
   3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   6   <modelVersion>4.0.0</modelVersion>
   7   <groupId>org.springframework</groupId>
   8   <artifactId>gs-rest-service</artifactId>
   9   <version>0.1.0</version>
  10   <parent>
  11     <groupId>org.springframework.boot</groupId>
  12     <artifactId>spring-boot-starter-parent</artifactId>
  13     <version>1.1.5.RELEASE</version>
  14   </parent>
  15   <dependencies>
  16     <dependency>
  17       <groupId>org.springframework.boot</groupId>
  18       <artifactId>spring-boot-starter-web</artifactId>
  19     </dependency>
  20   </dependencies>
  21 <properties>
  22 <start-class>hello.Application</start-class>
  23 </properties>
  24 <build>
  25 <plugins>
  26 <plugin>
  27 <artifactId>maven-compiler-plugin</artifactId>
  28 <version>2.3.2</version>
  29 </plugin>
  30 <plugin>
  31 <groupId>org.springframework.boot</groupId>
  32 <artifactId>spring-boot-maven-plugin</artifactId>
  33 </plugin>
  34 </plugins>
  35 </build>
  36 <repositories>
  37 <repository>
  38 <id>spring-releases</id>
  39 <url>http://repo.spring.io/libs-release</url>
  40 </repository>
  41 </repositories>
  42 <pluginRepositories>
  43 <pluginRepository>
  44 <id>spring-releases</id>
  45 <url>http://repo.spring.io/libs-release</url>
  46 </pluginRepository>
  47 </pluginRepositories>
  48 </project>

src/main/java/hello/Application.java

   1 package hello;
   2 
   3 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
   4 import org.springframework.boot.SpringApplication;
   5 import org.springframework.context.annotation.ComponentScan;
   6 
   7 @ComponentScan
   8 @EnableAutoConfiguration
   9 public class Application {
  10 
  11     public static void main(String[] args) {
  12         SpringApplication.run(Application.class, args);
  13     }
  14 }

src/main/java/hello/Greeting.java

   1 package hello;
   2 
   3 public class Greeting {
   4 
   5     private final long id;
   6     private final String content;
   7 
   8     public Greeting(long id, String content) {
   9         this.id = id;
  10         this.content = content;
  11     }
  12 
  13     public long getId() {
  14         return id;
  15     }
  16 
  17     public String getContent() {
  18         return content;
  19     }
  20 }

src/main/java/hello/GreetingController.java

   1 package hello;
   2 
   3 import java.util.concurrent.atomic.AtomicLong;
   4 import org.springframework.web.bind.annotation.RequestMapping;
   5 import org.springframework.web.bind.annotation.RequestParam;
   6 import org.springframework.web.bind.annotation.RestController;
   7 
   8 import org.springframework.web.context.request.async.DeferredResult;
   9 import java.util.concurrent.Callable;
  10 import java.util.concurrent.ExecutorService;
  11 import java.util.concurrent.Executors;
  12 
  13 @RestController
  14 public class GreetingController {
  15     private ExecutorService es =  Executors.newFixedThreadPool(50); 
  16 
  17     public class MyCall implements Runnable {
  18 
  19         private DeferredResult df; 
  20         private String template;
  21         private String name;
  22         private AtomicLong counter;
  23 
  24         public MyCall(DeferredResult df, String template, String name, AtomicLong counter){
  25           this.df = df;
  26           this.template=template;
  27           this.name=name;
  28           this.counter = counter;
  29         }
  30 
  31         @Override
  32         public void run(){
  33             Greeting g  = new Greeting(this.counter.incrementAndGet(), String.format(this.template, this.name));
  34             this.df.setResult(g);
  35         }
  36     }
  37 
  38     private static final String template = "Hello, %s!";
  39     private final AtomicLong counter = new AtomicLong();
  40 
  41     @RequestMapping("/greeting")
  42     public Greeting greeting(@RequestParam(value="name", required=false, defaultValue="World") String name) {
  43         return new Greeting(counter.incrementAndGet(), String.format(template, name));
  44     }
  45 
  46     @RequestMapping("/greetingdf")
  47     public DeferredResult<Greeting> greetingdf(@RequestParam(value="name", required=false, defaultValue="World") String name) {
  48         DeferredResult<Greeting> deferredResult = new DeferredResult<Greeting>();
  49         MyCall mc = new MyCall( deferredResult , template,name,counter  );
  50         es.execute(mc);
  51         return deferredResult;
  52     }
  53 }

Build with

Run with:

Tomcat REST service

Structure

.
|-- pom.xml
|-- src
    `-- main
        `-- java
            `-- hello
                |-- Application.java
                |-- Greeting.java
                `-- GreetingController.java

pom.xml

   1 <project xmlns="http://maven.apache.org/POM/4.0.0" 
   2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   4 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   5     <modelVersion>4.0.0</modelVersion>
   6     <groupId>org.springframework</groupId>
   7     <artifactId>gs-rest-service-tomcat</artifactId>
   8     <version>0.1.0</version>
   9     <packaging>war</packaging>
  10 
  11     <parent>
  12         <groupId>org.springframework.boot</groupId>
  13         <artifactId>spring-boot-starter-parent</artifactId>
  14         <version>1.1.5.RELEASE</version>
  15     </parent>
  16 
  17     <dependencies>
  18         <dependency>
  19             <groupId>org.springframework.boot</groupId>
  20             <artifactId>spring-boot-starter-web</artifactId>
  21             <scope>compile</scope> 
  22         </dependency>
  23     </dependencies>
  24 
  25     <properties>
  26         <start-class>hello.Application</start-class>
  27     </properties>
  28     <build>
  29         <plugins>
  30             <plugin>
  31                 <artifactId>maven-compiler-plugin</artifactId>
  32                 <version>2.3.2</version>
  33             </plugin>
  34         </plugins>
  35     </build>
  36     <repositories>
  37         <repository>
  38             <id>spring-releases</id>
  39             <url>http://repo.spring.io/libs-release</url>
  40         </repository>
  41     </repositories>
  42     <pluginRepositories>
  43         <pluginRepository>
  44             <id>spring-releases</id>
  45             <url>http://repo.spring.io/libs-release</url>
  46         </pluginRepository>
  47     </pluginRepositories>
  48 </project>

src/main/java/hello/Application.java

   1 package hello;
   2 
   3 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
   4 import org.springframework.boot.SpringApplication;
   5 import org.springframework.context.annotation.ComponentScan;
   6 import org.springframework.boot.context.web.SpringBootServletInitializer;
   7 import org.springframework.boot.builder.SpringApplicationBuilder;
   8 import org.springframework.context.annotation.Configuration;
   9 
  10 @ComponentScan
  11 @EnableAutoConfiguration
  12 @Configuration
  13 public class Application  extends SpringBootServletInitializer  {
  14 
  15     public static void main(String[] args) {
  16         SpringApplication.run(appClass, args);
  17     }
  18 
  19     @Override
  20     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
  21         return application.sources(appClass);
  22     }
  23 
  24     private static Class<Application> appClass = Application.class;
  25 }

src/main/java/hello/Greeting.java

   1 package hello;
   2 
   3 public class Greeting {
   4 
   5     private final long id;
   6     private final String content;
   7 
   8     public Greeting(long id, String content) {
   9         this.id = id;
  10         this.content = content;
  11     }
  12 
  13     public long getId() {
  14         return id;
  15     }
  16 
  17     public String getContent() {
  18         return content;
  19     }
  20 }

src/main/java/hello/GreetingController.java

   1 package hello;
   2 
   3 import java.util.concurrent.atomic.AtomicLong;
   4 import org.springframework.web.bind.annotation.RequestMapping;
   5 import org.springframework.web.bind.annotation.RequestParam;
   6 import org.springframework.web.bind.annotation.RestController;
   7 
   8 @RestController
   9 public class GreetingController {
  10 
  11     private static final String template = "Hello Tomcat, %s!";
  12     private final AtomicLong counter = new AtomicLong();
  13 
  14     @RequestMapping("/greetingTomcat")
  15     public Greeting greeting(@RequestParam(value="name", required=false, defaultValue="World") String name) {
  16         return new Greeting(counter.incrementAndGet(), String.format(template, name));
  17     }
  18 }

Build and deploy

Spring MVC (SpringBoot)

Structure:

.
|-- pom.xml
|-- src
    `-- main
        |-- java
        |   `-- hello
        |       |-- Application.java
        |       `-- GreetingController.java
        `-- resources
            `-- templates
                `-- greeting.html

   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4     <modelVersion>4.0.0</modelVersion>
   5     <groupId>org.springframework</groupId>
   6     <artifactId>gs-serving-web-content</artifactId>
   7     <version>0.1.0</version>
   8     <parent>
   9         <groupId>org.springframework.boot</groupId>
  10         <artifactId>spring-boot-starter-parent</artifactId>
  11         <version>1.1.8.RELEASE</version>
  12     </parent>
  13     <dependencies>
  14         <dependency>
  15             <groupId>org.springframework.boot</groupId>
  16             <artifactId>spring-boot-starter-thymeleaf</artifactId>
  17         </dependency>
  18     </dependencies>
  19     <properties>
  20         <start-class>hello.Application</start-class>
  21     </properties>
  22     <build>
  23         <plugins>
  24             <plugin>
  25                 <groupId>org.springframework.boot</groupId>
  26                 <artifactId>spring-boot-maven-plugin</artifactId>
  27             </plugin>
  28         </plugins>
  29     </build>
  30     <repositories>
  31         <repository>
  32             <id>spring-milestone</id>
  33             <url>http://repo.spring.io/libs-release</url>
  34         </repository>
  35     </repositories>
  36     <pluginRepositories>
  37         <pluginRepository>
  38             <id>spring-milestone</id>
  39             <url>http://repo.spring.io/libs-release</url>
  40         </pluginRepository>
  41     </pluginRepositories>
  42 </project>

   1 package hello;
   2 
   3 import org.springframework.stereotype.Controller;
   4 import org.springframework.ui.Model;
   5 import org.springframework.web.bind.annotation.RequestMapping;
   6 import org.springframework.web.bind.annotation.RequestParam;
   7 
   8 @Controller
   9 public class GreetingController {
  10 
  11     @RequestMapping("/greeting")
  12     public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
  13         model.addAttribute("name", name);
  14         return "greeting";
  15     }
  16 
  17 }

   1 <!DOCTYPE HTML>
   2 <html xmlns:th="http://www.thymeleaf.org">
   3 <head>
   4     <title>Getting Started: Serving Web Content</title>
   5     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   6 </head>
   7 <body>
   8     <p th:text="'Hello, ' + ${name} + '!'" />
   9 </body>
  10 </html>

   1 package hello;
   2 
   3 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
   4 import org.springframework.boot.SpringApplication;
   5 import org.springframework.context.annotation.ComponentScan;
   6 
   7 @ComponentScan
   8 @EnableAutoConfiguration
   9 public class Application {
  10 
  11     public static void main(String[] args) {
  12         SpringApplication.run(Application.class, args);
  13     }
  14 
  15 }

testSpringMVCJSP

Structure Maven:

.
|-- pom.xml
|-- src
|   `-- main
|       |-- java
|       |   `-- org
|       |       `-- allowed
|       |           `-- bitarus
|       |               `-- hello
|       |                   `-- HelloController.java
|       `-- webapp
|           `-- WEB-INF
|               |-- mvc-dispatcher-servlet.xml
|               |-- pages
|               |   `-- greeting.jsp
|               `-- web.xml

pom.xml

   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
   3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   6     <modelVersion>4.0.0</modelVersion>
   7     <groupId>org.allowed.bitarus</groupId>
   8     <artifactId>testSpringMVCJSP</artifactId>
   9     <version>0.1.0</version>
  10     <packaging>war</packaging>
  11 
  12     <dependencies>
  13                 <dependency>
  14                         <groupId>org.springframework</groupId>
  15                         <artifactId>spring-core</artifactId>
  16                         <version>4.1.4.RELEASE</version>
  17                 </dependency>
  18  
  19                 <dependency>
  20                         <groupId>org.springframework</groupId>
  21                         <artifactId>spring-web</artifactId>
  22                         <version>4.1.4.RELEASE</version>
  23                 </dependency>
  24  
  25                 <dependency>
  26                         <groupId>org.springframework</groupId>
  27                         <artifactId>spring-webmvc</artifactId>
  28                         <version>4.1.4.RELEASE</version>
  29                 </dependency>
  30     </dependencies>
  31 </project>

HelloController.java

   1 package org.allowed.bitarus.hello;
   2 
   3 import org.springframework.stereotype.Controller;
   4 import org.springframework.ui.Model;
   5 import org.springframework.web.bind.annotation.RequestMapping;
   6 import org.springframework.web.bind.annotation.RequestParam;
   7 
   8 @Controller
   9 public class HelloController {
  10 
  11     @RequestMapping("/hello")
  12     public String hellox(@RequestParam(value="name", required=false,  defaultValue="World") String name, Model model) {
  13         model.addAttribute("name", name);
  14         return "greeting";
  15     }
  16 
  17 }

mvc-dispatcher-servlet.xml

   1 <beans xmlns="http://www.springframework.org/schema/beans"
   2         xmlns:context="http://www.springframework.org/schema/context"
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4         xsi:schemaLocation="
   5         http://www.springframework.org/schema/beans     
   6         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   7         http://www.springframework.org/schema/context 
   8         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   9         <context:component-scan base-package="org.allowed.bitarus.hello" />
  10         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11                 <property name="prefix">
  12                         <value>/WEB-INF/pages/</value>
  13                 </property>
  14                 <property name="suffix">
  15                         <value>.jsp</value>
  16                 </property>
  17         </bean>
  18 </beans>

greeting.jsp

   1 <!DOCTYPE HTML>
   2 <html xmlns:th="http://www.thymeleaf.org">
   3 <head>
   4     <title>Getting Started: Serving Web Content</title>
   5     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   6 </head>
   7 <body>
   8     <p>Hello ${name}</p>
   9 </body>
  10 </html>

web.xml

   1 <web-app id="WebApp_ID" version="2.4"
   2         xmlns="http://java.sun.com/xml/ns/j2ee" 
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
   5         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   6  
   7         <display-name>Spring MVC Application + JSP</display-name> 
   8         <servlet>
   9                 <servlet-name>mvc-dispatcher</servlet-name>
  10                 <servlet-class>
  11                        org.springframework.web.servlet.DispatcherServlet
  12                 </servlet-class>
  13                 <load-on-startup>1</load-on-startup>
  14         </servlet>
  15         <servlet-mapping>
  16                 <servlet-name>mvc-dispatcher</servlet-name>
  17                 <url-pattern>/</url-pattern>
  18         </servlet-mapping>
  19         <context-param>
  20                 <param-name>contextConfigLocation</param-name>
  21                 <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
  22         </context-param>
  23         <listener>
  24                 <listener-class>
  25                       org.springframework.web.context.ContextLoaderListener
  26                 </listener-class>
  27         </listener>
  28 </web-app>

testSpringThymeleaf ( Spring MVC + Thymeleaf + Bootstrap + JQuery + Tomcat )

Maven Structure

.
|-- pom.xml
|-- src
|   `-- main
|       |-- java
|       |   `-- org
|       |       `-- allowed
|       |           `-- bitarus
|       |               `-- hello
|       |                   `-- HelloController.java
|       `-- webapp
|           |-- WEB-INF
|           |   |-- mvc-dispatcher-servlet.xml
|           |   |-- pages
|           |   |   |-- greeting.html
|           |   |-- web.xml
|           |-- css
|           |   `-- bootstrap-3.3.2.min.css
|           `-- js
|               |-- bootstrap-3.3.2.min.js
|               |-- greeting.js
|               `-- jquery-1.11.2.min.js

pom.xml

   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" 
   3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   5 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   6     <modelVersion>4.0.0</modelVersion>
   7     <groupId>org.allowed.bitarus</groupId>
   8     <artifactId>testSpringMVCThymeleaf</artifactId>
   9     <version>0.1.0</version>
  10     <packaging>war</packaging>
  11     <dependencies>
  12         <dependency>
  13                 <groupId>org.springframework</groupId>
  14                 <artifactId>spring-core</artifactId>
  15                 <version>4.1.4.RELEASE</version>
  16         </dependency>
  17         <dependency>
  18                 <groupId>org.springframework</groupId>
  19                 <artifactId>spring-web</artifactId>
  20                 <version>4.1.4.RELEASE</version>
  21         </dependency>
  22         <dependency>
  23                 <groupId>org.springframework</groupId>
  24                 <artifactId>spring-webmvc</artifactId>
  25                 <version>4.1.4.RELEASE</version>
  26         </dependency>
  27         <dependency>
  28             <groupId>org.thymeleaf</groupId>
  29             <artifactId>thymeleaf-spring4</artifactId>
  30             <version>2.1.4.RELEASE</version>
  31         </dependency>
  32         <dependency>
  33             <groupId>org.slf4j</groupId>
  34             <artifactId>slf4j-api</artifactId>
  35             <version>1.7.10</version>
  36         </dependency>
  37         <dependency>
  38             <groupId>org.slf4j</groupId>
  39             <artifactId>slf4j-log4j12</artifactId>
  40             <version>1.7.10</version>
  41         </dependency>
  42     </dependencies>
  43 </project>

HelloController.java

   1 package org.allowed.bitarus.hello;
   2 
   3 import org.springframework.stereotype.Controller;
   4 import org.springframework.ui.Model;
   5 import org.springframework.web.bind.annotation.RequestMapping;
   6 import org.springframework.web.bind.annotation.RequestParam;
   7 
   8 @Controller
   9 public class HelloController {
  10 
  11     @RequestMapping("/hello")
  12     public String hellox(@RequestParam(value="name", required=false,  defaultValue="World") String name, Model model) {
  13         model.addAttribute("name", name);
  14         return "greeting";
  15     }
  16 
  17 }

mvc-dispatcher-servlet.xml

   1 <beans xmlns="http://www.springframework.org/schema/beans"
   2         xmlns:context="http://www.springframework.org/schema/context"
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xmlns:mvc="http://www.springframework.org/schema/mvc"
   5         xsi:schemaLocation="
   6         http://www.springframework.org/schema/beans     
   7         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   8         http://www.springframework.org/schema/context 
   9         http://www.springframework.org/schema/context/spring-context-3.0.xsd
  10         http://www.springframework.org/schema/mvc
  11         http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12         <context:component-scan base-package="org.allowed.bitarus.hello" />
  13    <!-- Enabling Spring MVC configuration through annotations -->
  14     <mvc:annotation-driven />
  15     <!--  Mapping Static Resources -->
  16     <mvc:resources mapping="/js/**" location="/js/" />
  17     <mvc:resources mapping="/css/**" location="/css/" />
  18     
  19     <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
  20         <property name="prefix" value="/WEB-INF/pages/" />
  21         <property name="suffix" value=".html" />
  22         <property name="templateMode" value="HTML5" />
  23         <property name="cacheable" value="false" />
  24         <property name="characterEncoding" value="UTF-8" />
  25     </bean>
  26     <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
  27         <property name="templateResolver" ref="templateResolver" />
  28     </bean>
  29     <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
  30         <property name="templateEngine" ref="templateEngine" />
  31         <property name="order" value="1" />
  32         <property name="characterEncoding" value="UTF-8" />
  33     </bean>    
  34 </beans>

greeting.html

   1 <!DOCTYPE HTML>
   2 <html xmlns:th="http://www.thymeleaf.org">
   3     <head>
   4         <title>Getting Started: Serving Web Content</title>
   5         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    
   6         <meta name="viewport" content="width=device-width, initial-scale=1"/>
   7         <script th:src="@{/js/jquery-1.11.2.min.js}"></script>
   8         <script th:src="@{/js/bootstrap-3.3.2.min.js}"></script>        
   9         <script th:src="@{/js/greeting.js}"></script>
  10         <link rel="stylesheet" th:href="@{/css/bootstrap-3.3.2.min.css}"/>        
  11     </head>
  12     <body>      
  13         <nav class="navbar navbar-default navbar-fixed-top">
  14               
  15         <div class="container">
  16         <ul class="nav navbar-nav" style="width: 100%;">
  17         <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
  18         <li><a href="#">Link</a></li>
  19         <li class="dropdown">
  20           <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a>
  21           <ul class="dropdown-menu" role="menu">
  22             <li><a href="#">Action</a></li>
  23             <li><a href="#">Another action</a></li>
  24           </ul>
  25         </li>
  26         </ul>                
  27             <h1>My First Bootstrap Page</h1>
  28             <p>This part is inside a .container class.</p> 
  29             <p>The .container class provides a responsive fixed width container.</p>           
  30             <p th:text="'Hello, ' + ${name} + '!'" />
  31             <div class="row">
  32                 <div class="col-sm-4">.col-sm-4</div>
  33                 <div class="col-sm-4">.col-sm-4</div>
  34                 <div class="col-sm-4">.col-sm-4</div>
  35             </div>            
  36             <div class="row">
  37                 <div class="col-md-4">.col-md-4</div>
  38                 <div class="col-md-4">.col-md-4</div>
  39                 <div class="col-md-4">.col-md-4</div>
  40             </div>
  41             
  42             <ul class="nav nav-tabs">
  43                 <li role="presentation" class="tabHome"><a href="#">Home</a></li>
  44                 <li role="presentation" class="tabProfile"><a href="#">Profile</a></li>
  45                 <li role="presentation" class="tabMessages"><a href="#">Messages</a></li>
  46             </ul>            
  47             
  48             <div class="panel panel-primary panelHome">
  49                 <div class="panel-heading">
  50                     <h3 class="panel-title">Panel home</h3>
  51                 </div>
  52                 <div class="panel-body">
  53                     This is a Basic panel home
  54                     <form role="form">
  55                         <div class="form-group">
  56                             <label for="email">Email address:</label>
  57                             <input type="email" class="form-control" id="email"/>
  58                         </div>
  59                         <div class="form-group">
  60                             <label for="pwd">Password:</label>
  61                             <input type="password" class="form-control" id="pwd"/>
  62                         </div>
  63                         <div class="checkbox">
  64                             <label><input type="checkbox"/> Remember me</label>
  65                         </div>
  66                         <button id="submitButton" type="submit" class="btn btn-default">Click to show modal</button>
  67                     </form>                    
  68                 </div>
  69             </div>
  70             <div class="panel panel-primary panelProfile">
  71                 <div class="panel-heading">
  72                     <h3 class="panel-title">Panel profile</h3>
  73                 </div>
  74                 <div class="panel-body">
  75                 </div>
  76             </div>
  77             <div class="panel panel-primary panelMessages">
  78                 <div class="panel-heading">
  79                     <h3 class="panel-title">Panel messages</h3>
  80                 </div>
  81                 <div class="panel-body">
  82                 </div>
  83             </div>
  84         </div>
  85         
  86 <div id="myModal" class="modal fade">
  87     <div class="modal-dialog">
  88         <div class="modal-content">
  89             <div class="modal-header">
  90                 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  91                 <h4 class="modal-title">Confirmation</h4>
  92             </div>
  93             <div class="modal-body">
  94                 <p>Do you want to save changes you made to document before closing?</p>
  95                 <p class="text-warning"><small>If you don't save, your changes will be lost.</small></p>
  96             </div>
  97             <div class="modal-footer">
  98                 <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
  99                 <button type="button" class="btn btn-primary">Save changes</button>
 100             </div>
 101         </div>
 102     </div>
 103 </div>
 104         
 105         </nav>
 106     </body>
 107 </html>

web.xml

   1 <web-app id="WebApp_ID" version="2.4"
   2         xmlns="http://java.sun.com/xml/ns/j2ee" 
   3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
   5         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   6     <display-name>Spring MVC Application + Thymeleaf</display-name> 
   7     <servlet>
   8         <servlet-name>mvc-dispatcher</servlet-name>
   9         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  10         <load-on-startup>1</load-on-startup>
  11     </servlet>
  12     <servlet-mapping>
  13         <servlet-name>mvc-dispatcher</servlet-name>
  14         <url-pattern>/</url-pattern>
  15     </servlet-mapping>
  16     <context-param>
  17         <param-name>contextConfigLocation</param-name>
  18         <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
  19     </context-param>
  20 </web-app>

greeting.js

   1 $(document).ready(greetingReady);
   2 
   3 function greetingReady(){
   4     console.log("greeting ready !!!!");
   5     $('.tabHome').click(homeClicked);
   6     $('.tabProfile').click(profileClicked);
   7     $('.tabMessages').click(messagesClicked);
   8     
   9     $('.tabHome').addClass('active');
  10     $('.panelHome').show();
  11     $('.panelProfile').hide();
  12     $('.panelMessages').hide();
  13     
  14     $('.panel-heading').click(headingClicked);
  15     $('#submitButton').click(submitClicked);
  16 }
  17 
  18 function submitClicked(event){  
  19     $('#myModal').modal('show');    
  20 }
  21 
  22 function headingClicked(){
  23     $('.panel-body').toggle();
  24 }
  25 
  26 function homeClicked(event){
  27     event.preventDefault();
  28     event.stopPropagation();
  29     $('.panelHome').show();
  30     $('.panelProfile').hide();
  31     $('.panelMessages').hide();
  32     $('.tabHome').addClass('active');
  33     $('.tabProfile').removeClass('active');
  34     $('.tabMessages').removeClass('active');
  35 }
  36     
  37 function profileClicked(event){
  38     event.preventDefault();
  39     event.stopPropagation();
  40     $('.panelHome').hide();
  41     $('.panelProfile').show();
  42     $('.panelMessages').hide();    
  43     $('.tabHome').removeClass('active');
  44     $('.tabProfile').addClass('active');
  45     $('.tabMessages').removeClass('active');
  46 }
  47 
  48 function messagesClicked(event){
  49     event.preventDefault();
  50     event.stopPropagation();
  51     $('.panelHome').hide();
  52     $('.panelProfile').hide();
  53     $('.panelMessages').show();    
  54     $('.tabHome').removeClass('active');
  55     $('.tabProfile').removeClass('active');
  56     $('.tabMessages').addClass('active');
  57 }

spring-mvc-html

Project structure:

.
|-- pom.xml
|-- src
|   `-- main
|       |-- java
|       |   `-- org
|       |       `-- allowed
|       |           `-- bitarus
|       |               `-- spring
|       |                   `-- mvc
|       |                       `-- html
|       |                           |-- ConfigX.java
|       |                           |-- ContextServletListener.java
|       |                           |-- HelloController.java
|       |                           |-- TestDAO.java
|       |                           `-- ThreadTimer.java
|       |-- resources
|       |   |-- log4j.properties
|       |   `-- test.sql
|       `-- webapp
|           `-- WEB-INF
|               |-- applicationContext.xml
|               |-- mvc-dispatcher-servlet.xml
|               |-- pages
|               |   `-- greeting.jsp
|               `-- web.xml

Uses Spring 4, Tomcat 7.0.X, commons-dbcp, MariaDB, Gson and log4j.

pom.xml

   1 <?xml version="1.0" encoding="UTF-8"?>
   2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd">
   4     <modelVersion>4.0.0</modelVersion>
   5     <groupId>org.allowed.bitarus</groupId>
   6     <artifactId>spring-mvc-html</artifactId>
   7     <version>0.1.0</version>
   8     <packaging>war</packaging>
   9     <dependencies>
  10         <dependency>
  11             <groupId>org.springframework</groupId>
  12             <artifactId>spring-core</artifactId>
  13             <version>4.1.4.RELEASE</version>
  14         </dependency>
  15         <dependency>
  16             <groupId>org.springframework</groupId>
  17             <artifactId>spring-web</artifactId>
  18             <version>4.1.4.RELEASE</version>
  19         </dependency>
  20         <dependency>
  21             <groupId>org.springframework</groupId>
  22             <artifactId>spring-webmvc</artifactId>
  23             <version>4.1.4.RELEASE</version>
  24         </dependency>
  25         <dependency>
  26             <groupId>org.springframework</groupId>
  27             <artifactId>spring-jdbc</artifactId>
  28             <version>4.1.4.RELEASE</version>
  29         </dependency>
  30         <dependency>
  31             <groupId>com.google.code.gson</groupId>
  32             <artifactId>gson</artifactId>
  33             <version>2.5</version>
  34         </dependency>
  35         <dependency>
  36             <groupId>org.mariadb.jdbc</groupId>
  37             <artifactId>mariadb-java-client</artifactId>
  38             <version>1.4.4</version>
  39         </dependency>
  40         <dependency>
  41             <groupId>log4j</groupId>
  42             <artifactId>log4j</artifactId>
  43             <version>1.2.17</version>
  44         </dependency>        
  45         <dependency>
  46             <groupId>javax.servlet</groupId>
  47             <artifactId>javax.servlet-api</artifactId>
  48             <version>3.1.0</version>
  49             <scope>provided</scope>
  50         </dependency>   
  51         <dependency>
  52             <groupId>commons-dbcp</groupId>
  53             <artifactId>commons-dbcp</artifactId>
  54             <version>1.4</version>
  55         </dependency>        
  56     </dependencies>
  57 </project>

web.xml

   1 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   2     <display-name>Spring MVC- HTML</display-name> 
   3     <servlet>
   4         <servlet-name>mvc-dispatcher</servlet-name>
   5         <servlet-class>
   6             org.springframework.web.servlet.DispatcherServlet
   7         </servlet-class>
   8         <load-on-startup>1</load-on-startup>
   9     </servlet>
  10     <servlet-mapping>
  11         <servlet-name>mvc-dispatcher</servlet-name>
  12         <url-pattern>/</url-pattern>
  13     </servlet-mapping>
  14     <listener>
  15         <listener-class>
  16             org.springframework.web.context.ContextLoaderListener
  17         </listener-class>
  18     </listener>
  19 </web-app>

applicationContext.xml

   1 <beans xmlns="http://www.springframework.org/schema/beans"
   2     xmlns:context="http://www.springframework.org/schema/context"
   3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   5 </beans>

mvc-dispatcher-servlet.xml

   1 <beans xmlns="http://www.springframework.org/schema/beans"
   2     xmlns:context="http://www.springframework.org/schema/context"
   3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   4     xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   5     <context:component-scan base-package="org.allowed.bitarus.spring.mvc.html" />
   6     <bean
   7         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   8         <property name="prefix">
   9             <value>/WEB-INF/pages/</value>
  10         </property>
  11         <property name="suffix">
  12             <value>.jsp</value>
  13         </property>
  14     </bean>
  15     <!--
  16     <bean id="testDatasource"
  17         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  18         <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
  19         <property name="url"
  20             value="jdbc:mariadb://localhost:3306/springmvchtml" />
  21         <property name="username" value="usertest" />
  22         <property name="password" value="????????" />
  23     </bean>
  24     -->    
  25     <bean id="testDatasource" class="org.apache.commons.dbcp.BasicDataSource" 
  26     destroy-method="close" >
  27         <property name="driverClassName" value="org.mariadb.jdbc.Driver"/>
  28         <!--<property name="url" value="jdbc:mariadb://localhost:3306/springmvchtml"/>-->
  29         <!--export JAVA_OPTS=-DspringJdbcUrl=jdbc:mariadb://localhost:3306/springmvchtml-->
  30         <property name="url" value="#{systemProperties['springJdbcUrl']}"/>
  31         <property name="username" value="usertest"/>
  32         <property name="password" value="????????"/>
  33         <property name="initialSize" value="3"/>
  34     </bean>   
  35     <bean id="configx" class="org.allowed.bitarus.spring.mvc.html.ConfigX">
  36         <property name="viewList">
  37             <list>
  38                 <value>greeting</value>
  39             </list>
  40         </property>
  41     </bean>
  42     <bean id="threadTimer" class="org.allowed.bitarus.spring.mvc.html.ThreadTimer" 
  43     init-method="start" destroy-method="destroy">
  44         <constructor-arg index="0" value="30000" />
  45     </bean>
  46     <bean id="testJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  47         <constructor-arg index="0" ref="testDatasource" />
  48     </bean>
  49     <bean id="testDAO" class="org.allowed.bitarus.spring.mvc.html.TestDAO"/>
  50 </beans>

log4j.properties

log4j.rootLogger = ALL, rootLogger
log4j.appender.rootLogger=org.apache.log4j.FileAppender
log4j.appender.rootLogger.File=/tmp/testlog.out
log4j.appender.rootLogger.layout=org.apache.log4j.PatternLayout
log4j.appender.rootLogger.layout.ConversionPattern=%d{ISO8601}|%p|%c|%t|%m%n
#log4j.appender.rootLogger.Threshold=ALL
log4j.appender.rootLogger.Threshold=INFO

log4j.logger.org.allowed.bitarus.spring.mvc.html.HelloController=ALL,helloConsConsole
log4j.appender.helloConsConsole=org.apache.log4j.ConsoleAppender
log4j.appender.helloConsConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.helloConsConsole.layout.ConversionPattern=%d{ISO8601}|%p|%c|%t|%m%n
#log4j.appender.helloConsConsole.Threshold=DEBUG
log4j.appender.helloConsConsole.Threshold=INFO

log4j.logger.org.allowed.bitarus.spring.mvc.html.ThreadTimer=ALL,threadTimerConsole
log4j.appender.threadTimerConsole=org.apache.log4j.ConsoleAppender
log4j.appender.threadTimerConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.threadTimerConsole.layout.ConversionPattern=%d{ISO8601}|%p|%c|%t|%m%n
#log4j.appender.threadTimerConsole.Threshold=DEBUG
log4j.appender.threadTimerConsole.Threshold=INFO

log4j.logger.org.allowed.bitarus.spring.mvc.html.TestDAO=ALL,testDAOConsole
log4j.appender.testDAOConsole=org.apache.log4j.ConsoleAppender
log4j.appender.testDAOConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.testDAOConsole.layout.ConversionPattern=%d{ISO8601}|%p|%c|%t|%m%n
#log4j.appender.testDAOConsole.Threshold=DEBUG
log4j.appender.testDAOConsole.Threshold=INFO

log4j.logger.org.allowed.bitarus.spring.mvc.html.ConfigX=ALL,configXConsole
log4j.appender.configXConsole=org.apache.log4j.ConsoleAppender
log4j.appender.configXConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.configXConsole.layout.ConversionPattern=%d{ISO8601}|%p|%c|%t|%m%n
#log4j.appender.configXConsole.Threshold=DEBUG
log4j.appender.configXConsole.Threshold=INFO

test.sql

   1 --JDBC URL: jdbc:mariadb://localhost:3306/springmvchtml
   2 create database springmvchtml;
   3 create user 'usertest'@'%' identified by '????????';
   4 create user 'usertest'@'localhost' identified by '????????';
   5 grant all on springmvchtml.* to 'usertest'@'%';
   6 grant all on springmvchtml.* to 'usertest'@'localhost';
   7 show grants for 'usertest'@'%';
   8 show grants for 'usertest'@'localhost'; 
   9 create table springmvchtml.dummy (name varchar(255) ) ;
  10 insert into springmvchtml.dummy (name) values('aaaa');
  11 insert into springmvchtml.dummy (name) values('bbbb');
  12 commit;

TestDAO.java

   1 package org.allowed.bitarus.spring.mvc.html;
   2 
   3 import org.apache.log4j.Logger;
   4 import org.springframework.beans.factory.annotation.Autowired;
   5 import org.springframework.beans.factory.annotation.Qualifier;
   6 import org.springframework.jdbc.core.JdbcTemplate;
   7 
   8 public class TestDAO {
   9   @Autowired
  10   @Qualifier("testJdbcTemplate")
  11   private JdbcTemplate jdbcTemplate;
  12   private Logger logger;
  13 
  14   public TestDAO() {
  15     this.logger = Logger.getLogger(TestDAO.class);
  16     logger.info("Created " + this.getClass().getSimpleName());
  17   }
  18 
  19   public String getNameFromDummy() {
  20     return this.jdbcTemplate.queryForObject("select name from dummy limit 1", String.class);
  21   }
  22 
  23 }

ThreadTimer.java

   1 package org.allowed.bitarus.spring.mvc.html;
   2 
   3 import java.text.MessageFormat;
   4 import org.apache.log4j.Logger;
   5 import org.springframework.beans.factory.annotation.Autowired;
   6 
   7 public class ThreadTimer extends Thread {
   8   private int delaySeconds;
   9   private Logger logger;
  10   private boolean running;
  11 
  12   @Autowired
  13   TestDAO testDAO;
  14 
  15   public ThreadTimer(int delaySeconds) {
  16     this.logger = Logger.getLogger(ThreadTimer.class);
  17     logger.info("Created instance of " + this.getClass().getSimpleName());
  18     this.running = true;
  19     this.delaySeconds = delaySeconds;
  20     this.setName(this.getClass().getSimpleName() + "_" + this.getName());
  21   }
  22 
  23   public void run() {
  24     while (running) {
  25       try {
  26         Thread.sleep(this.delaySeconds);
  27         logger.info("Delay " + this.getClass().getSimpleName());
  28         if (testDAO != null) {
  29           logger.info(MessageFormat.format("{0}", testDAO.getNameFromDummy()));
  30         }
  31       }
  32       catch (InterruptedException e) {
  33           logger.info("ThreadTimer interrupted exception:" + e.getMessage() );
  34       }
  35       catch (Exception e) {
  36           logger.info("ThreadTimer exception:" + e.getMessage() );
  37           stopRunning();
  38       }      
  39     }
  40     logger.info("Exited " + this.getClass().getSimpleName());
  41   }
  42 
  43   public void startRunning() {
  44     this.running = true;
  45   }
  46 
  47   public void stopRunning() {
  48     this.running = false;
  49   }
  50   
  51   public void destroy(){
  52     logger.info("Called destroy");
  53     this.stopRunning();
  54     this.interrupt();    
  55   }
  56 }

ConfigX.java

   1 package org.allowed.bitarus.spring.mvc.html;
   2 
   3 import java.util.List;
   4 import org.apache.log4j.Logger;
   5 
   6 public class ConfigX {
   7   private Logger logger;
   8   private List<String> viewList;
   9 
  10   public ConfigX() {
  11     this.logger = Logger.getLogger(ConfigX.class);
  12     this.logger.info("Created instance of ConfigX");
  13   }
  14 
  15   public List<String> getViewList() {
  16     return viewList;
  17   }
  18 
  19   public void setViewList(List<String> viewList) {
  20     this.viewList = viewList;
  21   }
  22 }

ContextServletListener.java

   1 package org.allowed.bitarus.spring.mvc.html;
   2 
   3 import javax.servlet.ServletContextListener;
   4 import javax.servlet.ServletContextEvent;
   5 import javax.servlet.annotation.WebListener;
   6 import java.sql.Driver;
   7 import java.sql.DriverManager;
   8 
   9 @WebListener
  10 public class ContextServletListener implements ServletContextListener {
  11     public void contextInitialized(ServletContextEvent sce){
  12         System.out.println("ContextServletListener init");
  13     }
  14     
  15     public void contextDestroyed(ServletContextEvent sce) {            
  16         //export JAVA_OPTS=-DspringJdbcUrl=jdbc:mariadb://localhost:3306/springmvchtml
  17         System.out.println("ContextServletListener destroyed");
  18         try {
  19             //Driver mySqlDriver = DriverManager.getDriver("jdbc:mariadb://localhost:3306/springmvchtml");
  20             Driver mySqlDriver = DriverManager.getDriver( System.getProperty("springJdbcUrl") );
  21             DriverManager.deregisterDriver(mySqlDriver);
  22         }
  23         catch(Exception ex){
  24             System.out.println(ex.getMessage());
  25         }
  26     }    
  27 }

HelloController.java

   1 package org.allowed.bitarus.spring.mvc.html;
   2 
   3 import org.apache.log4j.Logger;
   4 import org.springframework.beans.factory.annotation.Autowired;
   5 import org.springframework.beans.factory.annotation.Qualifier;
   6 import org.springframework.stereotype.Controller;
   7 import org.springframework.ui.Model;
   8 import org.springframework.web.bind.annotation.PathVariable;
   9 import org.springframework.web.bind.annotation.RequestMapping;
  10 import org.springframework.web.bind.annotation.RequestParam;
  11 import org.springframework.web.bind.annotation.ResponseBody;
  12 import com.google.gson.Gson;
  13 
  14 @Controller
  15 public class HelloController {
  16   protected class JsonObj {
  17     private String fieldX;
  18 
  19     public String getFieldX() {
  20       return fieldX;
  21     }
  22 
  23     public void setFieldX(String fieldX) {
  24       this.fieldX = fieldX;
  25     }
  26   }
  27 
  28   @Autowired
  29   @Qualifier("configx")
  30   private ConfigX configx;
  31   private Logger logger;
  32 
  33   public HelloController() {
  34     this.logger = Logger.getLogger(HelloController.class);
  35     logger.info("Created " + this.getClass().getSimpleName());
  36   }
  37 
  38   @RequestMapping("/helloVal/{name}") 
  39   public String helloVal(@PathVariable(value = "name") String name, Model model) {
  40     // http://localhost:8081/spring-mvc-html-0.1.0/helloVal/asd
  41     logger.info("helloVal with " + name);
  42     model.addAttribute("name", name); // set data in model
  43     return configx.getViewList().get(0); // view JSP
  44   }
  45 
  46   @RequestMapping(value = "/hello", produces = "application/json")
  47   @ResponseBody
  48   public String hellox(@RequestParam(value = "name", required = false, defaultValue = "World") String name) {
  49     // http://localhost:8081/spring-mvc-html-0.1.0/hello?name=asdkkk
  50     logger.info("hellox with " + name);
  51     JsonObj jo = new JsonObj();
  52     jo.setFieldX(name);
  53     return new Gson().toJson(jo);
  54   }
  55 }

greeting.jsp

   1 <html>
   2     <head>
   3         <title>Getting Started: Serving Web Content</title>
   4         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   5     </head>
   6     <body>
   7         <p>Hello ${name}</p>
   8     </body>
   9 </html>

Java/Spring (last edited 2024-01-19 20:56:39 by vitor)