1. Project directory structure
2. Create an MVN project
Freemaker support is relatively simple, just add:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
jsp supports in addition to adding:
<!-- servlet 依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
You also need to set spring.mvc.view in the configuration file, see (3) application.yml for details.
The detailed pom.xml is as follows:
<?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>com.example</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- servlet 依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三 、 application.yml
spring:
datasource:
url : jdbc:mysql://localhost:3306/test?useSSL=false
username : your-user
password : your-passwd
driver-class-name : com.mysql.jdbc.Driver
test2ds:
url : jdbc:mysql://localhost:3306/test2?useSSL=false
username : your-user
password : your-passwd
driver-class-name : com.mysql.jdbc.Driver
mvc:
view:
prefix: /WEB-INF/jsp/
suffix: .jsp
# 自定义属性,可以在Controller中读取
hello: Hello Angel From application
myProps: #自定义的属性和值
simpleProp: simplePropValue
arrayProps: 1,2,3,4,5
listProp1:
- name: abc
value: abcValue
- name: efg
value: efgValue
listProp2:
- config2Value1
- config2Vavlue2
mapProps:
key1: value1
key2: value2
The data source is not used in this example. spring.mvc.view is to implement jsp configuration. spring.hello and myProps are custom properties that are used in the next Controller.
Fourth, the view layer
The jsp page is under src/main/webapp/WEB-INF/jsp.
helloJsp.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>在此处插入标题</title>
</head>
<body>
helloJsp
<br>
${hello}
</body>
</html>
freemaker is under src/main/resources/templates
web.ftl
<!DOCTYPE html>
<html lang="zh">
<body>
Date: ${time?date}
<br>
时间: ${time?time}
<br>
Message: ${message}
<br>
simpleProp: ${simpleProp}
</body>
</html>
now.ftl
<!DOCTYPE html>
<html lang="zh">
<body>
时间: ${mynow}
<br>
</body>
</html>
error.ftl
<!DOCTYPE html>
<html lang="en">
<body>
Something wrong: ${status} ${error}
</body>
</html>
Five, two control classes
HelloController calls the jsp page
package com.example.jsp.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
//从spring中读取配置,如取不到默认值为hello jack
@Value("${spring.hello:hello jack}")
private String hello;
@RequestMapping("/helloJsp")
public String helloJsp(Map<String, Object> map){
System.out.println("HelloController.helloJsp().hello="+hello);
map.put("hello", hello);
return "helloJsp";
}
}
FtlWebContrpller needs a helper class MyProps that reads the properties of myProps
package com.example.freemarker.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix="myProps") //接收application.yml中的myProps下面的属性
public class MyProps {
private String simpleProp;
private String[] arrayProps;
private List<Map<String, String>> listProp1 = new ArrayList<Map<String, String>>(); //接收prop1里面的属性值
private List<String> listProp2 = new ArrayList<String>(); //接收prop2里面的属性值
private Map<String, String> mapProps = new HashMap<String, String>(); //接收prop1里面的属性值
public String getSimpleProp() {
return simpleProp;
}
//String类型的一定需要setter来接收属性值;maps, collections, 和 arrays 不需要
public void setSimpleProp(String simpleProp) {
this.simpleProp = simpleProp;
}
public List<Map<String, String>> getListProp1() {
return listProp1;
}
public List<String> getListProp2() {
return listProp2;
}
public String[] getArrayProps() {
return arrayProps;
}
public void setArrayProps(String[] arrayProps) {
this.arrayProps = arrayProps;
}
public Map<String, String> getMapProps() {
return mapProps;
}
public void setMapProps(Map<String, String> mapProps) {
this.mapProps = mapProps;
}
}
FtlWebContrpller code
package com.example.freemarker.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Date;
import java.util.Map;
/**
* Created by LK on 2016/5/7.
*/
@Controller
public class FtlWebContrpller {
@Value("${application.message:1234556677}")
private String message = "hi,hello world......";
@Autowired
private MyProps myProps;
@RequestMapping("/")
public String web(Map<String,Object> model){
model.put("time",new Date());
model.put("message",this.message);
model.put("simpleProp",this.myProps.getSimpleProp());
return "web";//返回的内容就是templetes下面文件的名称
}
@RequestMapping("/now")
String now(Map<String,Object> model) {
model.put("mynow",(new Date()).toString());
return "now";//返回的内容就是templetes下面文件的名称
}
}
6. Main category
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
@SpringBootApplication
public class SpringbootTestApp implements EmbeddedServletContainerCustomizer{
public static void main(String[] args) {
SpringApplication.run(SpringbootTestApp.class, args);
}
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
// TODO 自动生成的方法存根
container.setPort(8080);
}
}
run:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.8.RELEASE)
2017-11-02 22:54:51.384 INFO 17207 --- [ main] com.example.SpringbootTestApp : Starting SpringbootTestApp on mymotif-Vostro-14-5480 with PID 17207 (/home/mymotif/workspace/springboot/target/classes started by mymotif in /home/mymotif/workspace/springboot)
2017-11-02 22:54:51.388 INFO 17207 --- [ main] com.example.SpringbootTestApp : No active profile set, falling back to default profiles: default
2017-11-02 22:54:51.490 INFO 17207 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@353d0772: startup date [Thu Nov 02 22:54:51 CST 2017]; root of context hierarchy
2017-11-02 22:54:52.167 WARN 17207 --- [ main] o.m.s.mapper.ClassPathMapperScanner : No MyBatis mapper was found in '[com.example]' package. Please check your configuration.
2017-11-02 22:54:53.535 INFO 17207 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2017-11-02 22:54:53.553 INFO 17207 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2017-11-02 22:54:53.555 INFO 17207 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.23
2017-11-02 22:54:53.876 INFO 17207 --- [ost-startStop-1] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2017-11-02 22:54:53.882 INFO 17207 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2017-11-02 22:54:53.882 INFO 17207 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2396 ms
2017-11-02 22:54:54.055 INFO 17207 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2017-11-02 22:54:54.060 INFO 17207 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-11-02 22:54:54.061 INFO 17207 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-11-02 22:54:54.061 INFO 17207 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-11-02 22:54:54.062 INFO 17207 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2017-11-02 22:54:54.462 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@353d0772: startup date [Thu Nov 02 22:54:51 CST 2017]; root of context hierarchy
2017-11-02 22:54:54.578 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/now]}" onto java.lang.String com.example.freemarker.controller.FtlWebContrpller.now(java.util.Map<java.lang.String, java.lang.Object>)
2017-11-02 22:54:54.580 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String com.example.freemarker.controller.FtlWebContrpller.web(java.util.Map<java.lang.String, java.lang.Object>)
2017-11-02 22:54:54.581 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/helloJsp]}" onto public java.lang.String com.example.jsp.controller.HelloController.helloJsp(java.util.Map<java.lang.String, java.lang.Object>)
2017-11-02 22:54:54.591 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-11-02 22:54:54.592 INFO 17207 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-11-02 22:54:54.660 INFO 17207 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-02 22:54:54.661 INFO 17207 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-02 22:54:54.729 INFO 17207 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-11-02 22:54:55.409 INFO 17207 --- [ main] o.s.w.s.v.f.FreeMarkerConfigurer : ClassTemplateLoader for Spring macros added to FreeMarker configuration
2017-11-02 22:54:55.674 INFO 17207 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-11-02 22:54:55.752 INFO 17207 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-11-02 22:54:55.760 INFO 17207 --- [ main] com.example.SpringbootTestApp : Started SpringbootTestApp in 4.898 seconds (JVM running for 5.267)
2017-11-02 22:55:17.802 INFO 17207 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-11-02 22:55:17.802 INFO 17207 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2017-11-02 22:55:17.822 INFO 17207 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 20 ms
localhost:8080/helloJsp go to helloJsp.jsp
localhost:8080/now转到now.ftl
localhost:8080/go to web.ftl
page does not exist go to error.ftl