Spring
Spring helps development teams everywhere build simple, portable, fast and flexible JVM-based systems and applications.
http://spring.io/guides/gs/serving-web-content/
http://spring.io/guides/gs/convert-jar-to-war-maven/
REST service
spring.io/guides/gs/rest-service/
Structure
. |-- pom.xml |-- src | `-- main | `-- java | `-- hello | |-- Application.java | |-- Greeting.java | `-- GreetingController.java
Steps
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
- 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
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
- 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
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
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>
- nano src/main/java/hello/GreetingController.java
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 }
- nano src/main/resources/templates/greeting.html
- nano 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
15 }
- mvn clean compile package install
- java -jar target/gs-serving-web-content-0.1.0.jar
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
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>
- 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
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">×</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 }
- 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
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 }