Springboot view layer instance (JSP+Freemaker) and custom configuration reading

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325444674&siteId=291194637