## page was renamed from Spring <<TableOfContents(2)>> = 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 == * https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContextAware.html ApplicationContextAware, Interface to be implemented by any object that wishes to be notified of the ApplicationContext that it runs in. {{{#!highlight java void setApplicationContext(ApplicationContext applicationContext) // applicationContext.getBean() // applicationContext.getEnvironment() }}} == ResourceLoaderAware == * https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ResourceLoaderAware.html ResourceLoaderAware, Interface to be implemented by any object that wishes to be notified of the ResourceLoader (typically the ApplicationContext) that it runs in. {{{#!highlight java void setResourceLoader(ResourceLoader resourceLoader) // resourceLoader.getClassLoader() // resourceLoader.getResource(String location) }}} == EnvironmentAware == * https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/env/Environment.html EnvironmentAware, Interface to be implemented by any bean that wishes to be notified of the Environment that it runs in. {{{#!highlight java void setEnvironment(Environment environment) // environment.containsProperty() // environment.getProperty() // environment.getActiveProfiles() }}} == REST service (SpringBoot) == spring.io/guides/gs/rest-service/ === Structure === {{{ . |-- pom.xml |-- src | `-- main | `-- java | `-- hello | |-- Application.java | |-- Greeting.java | `-- GreetingController.java }}} === Steps === {{{#!highlight sh mkdir -p /tmp/greetingSpring mkdir -p /tmp/greetingSpring/src/main/java/hello mkdir -p /tmp/greetingSpring/target cd /tmp/greetingSpring }}} pom.xml {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <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>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <properties> <start-class>hello.Application</start-class> </properties> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>http://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>http://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project> }}} 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; import org.springframework.web.context.request.async.DeferredResult; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @RestController public class GreetingController { private ExecutorService es = Executors.newFixedThreadPool(50); public class MyCall implements Runnable { private DeferredResult df; private String template; private String name; private AtomicLong counter; public MyCall(DeferredResult df, String template, String name, AtomicLong counter){ this.df = df; this.template=template; this.name=name; this.counter = counter; } @Override public void run(){ Greeting g = new Greeting(this.counter.incrementAndGet(), String.format(this.template, this.name)); this.df.setResult(g); } } 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)); } @RequestMapping("/greetingdf") public DeferredResult<Greeting> greetingdf(@RequestParam(value="name", required=false, defaultValue="World") String name) { DeferredResult<Greeting> deferredResult = new DeferredResult<Greeting>(); MyCall mc = new MyCall( deferredResult , template,name,counter ); es.execute(mc); return deferredResult; } } }}} 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 <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>org.springframework</groupId> <artifactId>gs-rest-service-tomcat</artifactId> <version>0.1.0</version> <packaging>war</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency> </dependencies> <properties> <start-class>hello.Application</start-class> </properties> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>http://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>http://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project> }}} '''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<Application> 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 * catalina.sh start * tail -f catalina.out * Open http://localhost:8080/gs-rest-service-tomcat-0.1.0/greetingTomcat == Spring MVC (SpringBoot) == '''Structure:''' {{{ . |-- pom.xml |-- src `-- main |-- java | `-- hello | |-- Application.java | `-- GreetingController.java `-- resources `-- templates `-- greeting.html }}} * mkdir -p src/main/java/hello * mkdir -p src/main/resources/templates/ * nano pom.xml {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <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>org.springframework</groupId> <artifactId>gs-serving-web-content</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.1.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <properties> <start-class>hello.Application</start-class> </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>http://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-milestone</id> <url>http://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project> }}} * nano src/main/java/hello/GreetingController.java {{{#!highlight java package hello; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class GreetingController { @RequestMapping("/greeting") public String greeting(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } } }}} * nano src/main/resources/templates/greeting.html {{{#!highlight html <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="'Hello, ' + ${name} + '!'" /> </body> </html> }}} * nano 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); } } }}} * mvn clean compile package install * java -jar target/gs-serving-web-content-0.1.0.jar * Open http://localhost:8080/greeting?name=Yooo == 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 {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <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>org.allowed.bitarus</groupId> <artifactId>testSpringMVCJSP</artifactId> <version>0.1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.4.RELEASE</version> </dependency> </dependencies> </project> }}} HelloController.java {{{#!highlight java package org.allowed.bitarus.hello; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { @RequestMapping("/hello") public String hellox(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } } }}} mvc-dispatcher-servlet.xml {{{#!highlight xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <context:component-scan base-package="org.allowed.bitarus.hello" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans> }}} greeting.jsp {{{#!highlight xml <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p>Hello ${name}</p> </body> </html> }}} web.xml {{{#!highlight xml <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"> <display-name>Spring MVC Application + JSP</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app> }}} * mvn clean compile package * Access in Tomcat http://localhost:8081/testSpringMVCJSP-0.1.0/hello?name=asd == 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''' {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <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>org.allowed.bitarus</groupId> <artifactId>testSpringMVCThymeleaf</artifactId> <version>0.1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring4</artifactId> <version>2.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.10</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.10</version> </dependency> </dependencies> </project> }}} '''HelloController.java''' {{{#!highlight java package org.allowed.bitarus.hello; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class HelloController { @RequestMapping("/hello") public String hellox(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { model.addAttribute("name", name); return "greeting"; } } }}} '''mvc-dispatcher-servlet.xml''' {{{#!highlight xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="org.allowed.bitarus.hello" /> <!-- Enabling Spring MVC configuration through annotations --> <mvc:annotation-driven /> <!-- Mapping Static Resources --> <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/css/**" location="/css/" /> <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB-INF/pages/" /> <property name="suffix" value=".html" /> <property name="templateMode" value="HTML5" /> <property name="cacheable" value="false" /> <property name="characterEncoding" value="UTF-8" /> </bean> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> </bean> <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /> <property name="order" value="1" /> <property name="characterEncoding" value="UTF-8" /> </bean> </beans> }}} '''greeting.html''' {{{#!highlight html <!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <script th:src="@{/js/jquery-1.11.2.min.js}"></script> <script th:src="@{/js/bootstrap-3.3.2.min.js}"></script> <script th:src="@{/js/greeting.js}"></script> <link rel="stylesheet" th:href="@{/css/bootstrap-3.3.2.min.css}"/> </head> <body> <nav class="navbar navbar-default navbar-fixed-top"> <div class="container"> <ul class="nav navbar-nav" style="width: 100%;"> <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> <li><a href="#">Link</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Dropdown <span class="caret"></span></a> <ul class="dropdown-menu" role="menu"> <li><a href="#">Action</a></li> <li><a href="#">Another action</a></li> </ul> </li> </ul> <h1>My First Bootstrap Page</h1> <p>This part is inside a .container class.</p> <p>The .container class provides a responsive fixed width container.</p> <p th:text="'Hello, ' + ${name} + '!'" /> <div class="row"> <div class="col-sm-4">.col-sm-4</div> <div class="col-sm-4">.col-sm-4</div> <div class="col-sm-4">.col-sm-4</div> </div> <div class="row"> <div class="col-md-4">.col-md-4</div> <div class="col-md-4">.col-md-4</div> <div class="col-md-4">.col-md-4</div> </div> <ul class="nav nav-tabs"> <li role="presentation" class="tabHome"><a href="#">Home</a></li> <li role="presentation" class="tabProfile"><a href="#">Profile</a></li> <li role="presentation" class="tabMessages"><a href="#">Messages</a></li> </ul> <div class="panel panel-primary panelHome"> <div class="panel-heading"> <h3 class="panel-title">Panel home</h3> </div> <div class="panel-body"> This is a Basic panel home <form role="form"> <div class="form-group"> <label for="email">Email address:</label> <input type="email" class="form-control" id="email"/> </div> <div class="form-group"> <label for="pwd">Password:</label> <input type="password" class="form-control" id="pwd"/> </div> <div class="checkbox"> <label><input type="checkbox"/> Remember me</label> </div> <button id="submitButton" type="submit" class="btn btn-default">Click to show modal</button> </form> </div> </div> <div class="panel panel-primary panelProfile"> <div class="panel-heading"> <h3 class="panel-title">Panel profile</h3> </div> <div class="panel-body"> </div> </div> <div class="panel panel-primary panelMessages"> <div class="panel-heading"> <h3 class="panel-title">Panel messages</h3> </div> <div class="panel-body"> </div> </div> </div> <div id="myModal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">Confirmation</h4> </div> <div class="modal-body"> <p>Do you want to save changes you made to document before closing?</p> <p class="text-warning"><small>If you don't save, your changes will be lost.</small></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> </nav> </body> </html> }}} '''web.xml''' {{{#!highlight xml <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"> <display-name>Spring MVC Application + Thymeleaf</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> </web-app> }}} '''greeting.js''' {{{#!highlight java $(document).ready(greetingReady); function greetingReady(){ console.log("greeting ready !!!!"); $('.tabHome').click(homeClicked); $('.tabProfile').click(profileClicked); $('.tabMessages').click(messagesClicked); $('.tabHome').addClass('active'); $('.panelHome').show(); $('.panelProfile').hide(); $('.panelMessages').hide(); $('.panel-heading').click(headingClicked); $('#submitButton').click(submitClicked); } function submitClicked(event){ $('#myModal').modal('show'); } function headingClicked(){ $('.panel-body').toggle(); } function homeClicked(event){ event.preventDefault(); event.stopPropagation(); $('.panelHome').show(); $('.panelProfile').hide(); $('.panelMessages').hide(); $('.tabHome').addClass('active'); $('.tabProfile').removeClass('active'); $('.tabMessages').removeClass('active'); } function profileClicked(event){ event.preventDefault(); event.stopPropagation(); $('.panelHome').hide(); $('.panelProfile').show(); $('.panelMessages').hide(); $('.tabHome').removeClass('active'); $('.tabProfile').addClass('active'); $('.tabMessages').removeClass('active'); } function messagesClicked(event){ event.preventDefault(); event.stopPropagation(); $('.panelHome').hide(); $('.panelProfile').hide(); $('.panelMessages').show(); $('.tabHome').removeClass('active'); $('.tabProfile').removeClass('active'); $('.tabMessages').addClass('active'); } }}} * mvn clean compile package * Deploy in Tomcat listening in 8081. Access in Tomcat http://localhost:8081/testSpringMVCThymeleaf-0.1.0/hello?name=agh == 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 === {{{#!highlight xml <?xml version="1.0" encoding="UTF-8"?> <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>org.allowed.bitarus</groupId> <artifactId>spring-mvc-html</artifactId> <version>0.1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>1.4.4</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> </dependencies> </project> }}} === web.xml === {{{#!highlight xml <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"> <display-name>Spring MVC- HTML</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app> }}} === applicationContext.xml === {{{#!highlight xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> </beans> }}} === mvc-dispatcher-servlet.xml === {{{#!highlight xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> <context:component-scan base-package="org.allowed.bitarus.spring.mvc.html" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <!-- <bean id="testDatasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.mariadb.jdbc.Driver" /> <property name="url" value="jdbc:mariadb://localhost:3306/springmvchtml" /> <property name="username" value="usertest" /> <property name="password" value="????????" /> </bean> --> <bean id="testDatasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" > <property name="driverClassName" value="org.mariadb.jdbc.Driver"/> <!--<property name="url" value="jdbc:mariadb://localhost:3306/springmvchtml"/>--> <!--export JAVA_OPTS=-DspringJdbcUrl=jdbc:mariadb://localhost:3306/springmvchtml--> <property name="url" value="#{systemProperties['springJdbcUrl']}"/> <property name="username" value="usertest"/> <property name="password" value="????????"/> <property name="initialSize" value="3"/> </bean> <bean id="configx" class="org.allowed.bitarus.spring.mvc.html.ConfigX"> <property name="viewList"> <list> <value>greeting</value> </list> </property> </bean> <bean id="threadTimer" class="org.allowed.bitarus.spring.mvc.html.ThreadTimer" init-method="start" destroy-method="destroy"> <constructor-arg index="0" value="30000" /> </bean> <bean id="testJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg index="0" ref="testDatasource" /> </bean> <bean id="testDAO" class="org.allowed.bitarus.spring.mvc.html.TestDAO"/> </beans> }}} === log4j.properties === {{{#!highlught bash 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 === {{{#!highlight sql --JDBC URL: jdbc:mariadb://localhost:3306/springmvchtml create database springmvchtml; create user 'usertest'@'%' identified by '????????'; create user 'usertest'@'localhost' identified by '????????'; grant all on springmvchtml.* to 'usertest'@'%'; grant all on springmvchtml.* to 'usertest'@'localhost'; show grants for 'usertest'@'%'; show grants for 'usertest'@'localhost'; create table springmvchtml.dummy (name varchar(255) ) ; insert into springmvchtml.dummy (name) values('aaaa'); insert into springmvchtml.dummy (name) values('bbbb'); commit; }}} === TestDAO.java === {{{#!highlight java package org.allowed.bitarus.spring.mvc.html; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; public class TestDAO { @Autowired @Qualifier("testJdbcTemplate") private JdbcTemplate jdbcTemplate; private Logger logger; public TestDAO() { this.logger = Logger.getLogger(TestDAO.class); logger.info("Created " + this.getClass().getSimpleName()); } public String getNameFromDummy() { return this.jdbcTemplate.queryForObject("select name from dummy limit 1", String.class); } } }}} === ThreadTimer.java === {{{#!highlight java package org.allowed.bitarus.spring.mvc.html; import java.text.MessageFormat; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; public class ThreadTimer extends Thread { private int delaySeconds; private Logger logger; private boolean running; @Autowired TestDAO testDAO; public ThreadTimer(int delaySeconds) { this.logger = Logger.getLogger(ThreadTimer.class); logger.info("Created instance of " + this.getClass().getSimpleName()); this.running = true; this.delaySeconds = delaySeconds; this.setName(this.getClass().getSimpleName() + "_" + this.getName()); } public void run() { while (running) { try { Thread.sleep(this.delaySeconds); logger.info("Delay " + this.getClass().getSimpleName()); if (testDAO != null) { logger.info(MessageFormat.format("{0}", testDAO.getNameFromDummy())); } } catch (InterruptedException e) { logger.info("ThreadTimer interrupted exception:" + e.getMessage() ); } catch (Exception e) { logger.info("ThreadTimer exception:" + e.getMessage() ); stopRunning(); } } logger.info("Exited " + this.getClass().getSimpleName()); } public void startRunning() { this.running = true; } public void stopRunning() { this.running = false; } public void destroy(){ logger.info("Called destroy"); this.stopRunning(); this.interrupt(); } } }}} === ConfigX.java === {{{#!highlight java package org.allowed.bitarus.spring.mvc.html; import java.util.List; import org.apache.log4j.Logger; public class ConfigX { private Logger logger; private List<String> viewList; public ConfigX() { this.logger = Logger.getLogger(ConfigX.class); this.logger.info("Created instance of ConfigX"); } public List<String> getViewList() { return viewList; } public void setViewList(List<String> viewList) { this.viewList = viewList; } } }}} === ContextServletListener.java === {{{#!highlight java package org.allowed.bitarus.spring.mvc.html; import javax.servlet.ServletContextListener; import javax.servlet.ServletContextEvent; import javax.servlet.annotation.WebListener; import java.sql.Driver; import java.sql.DriverManager; @WebListener public class ContextServletListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce){ System.out.println("ContextServletListener init"); } public void contextDestroyed(ServletContextEvent sce) { //export JAVA_OPTS=-DspringJdbcUrl=jdbc:mariadb://localhost:3306/springmvchtml System.out.println("ContextServletListener destroyed"); try { //Driver mySqlDriver = DriverManager.getDriver("jdbc:mariadb://localhost:3306/springmvchtml"); Driver mySqlDriver = DriverManager.getDriver( System.getProperty("springJdbcUrl") ); DriverManager.deregisterDriver(mySqlDriver); } catch(Exception ex){ System.out.println(ex.getMessage()); } } } }}} === HelloController.java === {{{#!highlight java package org.allowed.bitarus.spring.mvc.html; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; @Controller public class HelloController { protected class JsonObj { private String fieldX; public String getFieldX() { return fieldX; } public void setFieldX(String fieldX) { this.fieldX = fieldX; } } @Autowired @Qualifier("configx") private ConfigX configx; private Logger logger; public HelloController() { this.logger = Logger.getLogger(HelloController.class); logger.info("Created " + this.getClass().getSimpleName()); } @RequestMapping("/helloVal/{name}") public String helloVal(@PathVariable(value = "name") String name, Model model) { // http://localhost:8081/spring-mvc-html-0.1.0/helloVal/asd logger.info("helloVal with " + name); model.addAttribute("name", name); // set data in model return configx.getViewList().get(0); // view JSP } @RequestMapping(value = "/hello", produces = "application/json") @ResponseBody public String hellox(@RequestParam(value = "name", required = false, defaultValue = "World") String name) { // http://localhost:8081/spring-mvc-html-0.1.0/hello?name=asdkkk logger.info("hellox with " + name); JsonObj jo = new JsonObj(); jo.setFieldX(name); return new Gson().toJson(jo); } } }}} === greeting.jsp === {{{#!highlight html <html> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p>Hello ${name}</p> </body> </html> }}}