SpringBoot 之 视图解析与模板引擎、 热部署、日志配置(四)
个人博客网:https://wushaopei.github.io/ (你想要这里多有)
一 、 SpringBoot环境下的视图解析技术
1. JSP
JSP 是我们常用的视图技术了,但是SpringBoot官方并不推荐使用。因为SpringBoot框架一般是打包为Jar运行,而JSP在web工程(War包)中可以被java程序读取和识别,但是在jar包中是比较困难的。所以需要采用其他的模板视图技术。
但我们还是简单的看一下它的使用方法:
- 主启动器
@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class SpringBootViewJspApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootViewJspApplication.class,args);
}
}
注意:
在SpringBoot中实现JSP视图解析,要在主启动器添加一个排除数据源DataSouce的注解,不然会在编译过程中报错!
注解如下:
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
- handler
@Controller
public class ShowViewHandler {
@RequestMapping("/show/view")
public String toTarget(Model model) {
model.addAttribute("attrName", "double kill");
return "target";
}
}
- springBoot的视图解析器配置: application.yml
spring:
mvc: # springmvc
view: #视图
prefix: /WEB-INF/ # 前缀
suffix: .jsp #后缀
- jsp
<body>
<h1>target</h1>
${requestScope.attrName }
</body>
加入依赖:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
<!--加载jsp页面所用的-->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
一般情况下,SpringBoot有自己的内嵌Tomcat服务器,可以自行运行加载Freemarkere所生成 的对应html
---> application.yml中限定的 “.ftl”后缀的页面作为html使用,该文件内部使用html的样式布局。
在SpringBoot访问JSP页面是要引入对应JSP页面,以及对外部即Eclipse的tomcat的加载依赖。
2.Freemarker模板引擎技术
①概念
FreeMarker是一款模板引擎:即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。
②工作原理
所有的模板视图技术的工作原理基本类似,也就意味着FreeMarker和JSP基本差不多。模板文件和数据模型是模板视图技术用来生成HTML页面所必须的组成部分。
数据模型(Java) + 模板文件(.ftl .jsp文件)= 输出(HTML,XML,源码文件)
JSP在Web系统中弥补了Servlet生成HTML页面的不足,但只能应用于Web系统,生成HTML页面。而FreeMarker不仅仅应用于Web系统,也可以应用于Java系统,还能生成Java, XML等文件,所以应用面更广。使用时,需要在项目pom.xml文件中增加依赖关系。
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.19</version>
</dependency>
用在SpringMVC中是需要加入对应的视图解析器
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!-- <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> -->
<property name="templateLoaderPaths">
<list>
<value>/WEB-INF/ftl/</value>
<value>classpath:/ftl/</value>
</list>
</property>
<property name="freemarkerSettings">
<props>
<prop key="defaultEncoding">UTF-8</prop>
<!-- FreeMarker默认每隔5秒检查模板是否被更新,如果已经更新了,就会重新加载并分析模板。 但经常检查模板是否更新可能比较耗时。如果你的应用运行在生产模式下,而且你预期模板不会经常更新,
则可以将更新的延迟时间延长至一个小时或者更久。 可以通过为freemarkerSettings属性设置template_update_delay达到这一目的,0
表示每次都重新加载 -->
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
</bean>
<bean
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
p:prefix="/" p:suffix=".ftl">
<property name="cache" value="false" />
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="requestContextAttribute" value="base"></property>
<property name="order" value="0"></property>
</bean>
③基本语法
${...}
FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值)。
<#-- 注释内容 -->
注释和HTML的注释也很相似,但是它们使用<#-- and -->来标识。不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中),因为FreeMarker会跳过它们。
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>
- FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。这些标签的名字以#开头。(用户自定义的FTL标签则需要使用@来代替#)
④ 例子
Freemarker模板引擎技术实例
①bean.ftl文件(在工程下,与pom.xml同级)
package ${packageName}.bean
public class ${className} {
private Integer ${fieldName}Id;
private String ${fieldName}Name;
private Double ${fieldName}Price;
public ${className}(){
}
public ${className}(Integer ${fieldName}Id,String ${fieldName}Name,Double ${fieldName}Price){
this.Integer ${fieldName}Id=Integer ${fieldName}Id;
this.String ${fieldName}Name=String ${fieldName}Name;
this.Double ${fieldName}Price=Double ${fieldName}Price;
}
public Integer get${propName}Id(){
return this.${fieldName}Id;
}
public void set${propName}Id(Integer ${fieldName}Id){
this.${fieldName}Id = ${fieldName}Id;
}
public String get${propName}Name(){
return this.${fieldName}Name;
}
public void set${propName}Name(String ${fieldName}Name){
this.${fieldName}Name = ${fieldName}Name;
}
public Double get${propName}Price(){
return this.${fieldName}Price;
}
public void set${propName}Price(Double ${fieldName}Price){
this.${fieldName}Price = ${fieldName}Price;
}
}
② Java代码
public class FreeMarkerTest {
public static void main(String[] args) throws Exception {
// 创建Freemarker对象的配置对象
Configuration cfg = new Configuration();
// 设定默认的位置(路径)
cfg.setDirectoryForTemplateLoading(new File(""));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 数据
Map paramMap = new HashMap();
String className = "User";
paramMap.put("packageName", "com.atguigu.crowdfunding");
paramMap.put("className", className);
Template t = cfg.getTemplate("bean.ftl");
// 组合生成
Writer out = new OutputStreamWriter(new FileOutputStream(new File("User.java")), "UTF-8");
// 执行
t.process(paramMap, out);
}
}
- 执行java编译
右键 == 》 Java application
生成对应JavaBean文件

③模板生成的javabean
public class Employee {
private Integer empId;
private String empName;
private Double empPrice;
public Employee(){
}
public Employee(Integer empId,String empName,Double empPrice){
this.Integer empId=Integer empId;
this.String empName=String empName;
this.Double empPrice=Double empPrice;
}
........
...........以下省略
⑤常用语法
【1】条件
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
<#else>
...
</#if>
【2】循环
<#list users as user>
${user.name},${user_index}
</#list>
【3】包含
<#include "xxxx.ftl">
【4】 表达式
| 表达式 | 说明 |
|---|---|
| ${Request.member.name} | 从Request域读取数据 |
| ${Session.member.name} | 从Session域读取数据 |
| ${Application.member.name} | 从Application域读取数据 |
| ${RequestParameters['id']} | 读取请求参数 |
| ${book.name?if_exists } | 用于判断如果存在,就输出这个值 |
| ${book.name?default(‘xxx’)} | 默认值xxx |
| ${book.name!"xxx"} | 默认值xxx |
| ${book.date?string('yyyy-MM-dd')} | 日期格式 |
| s?html | 对字符串进行HTML编码 |
| s?cap_first | 使字符串第一个字母大写 |
| s?lower_case | 将字符串转换成小写 |
| s?trim | 去掉字符串前后的空白字符 |
| s?size | 获得序列中元素的数目 |
- 示例 :
存 储:
model.addAttribute("message", "getMessage");
session.setAttribute("Love", "wenmin");
session.getServletContext().setAttribute("zuiai", "wenxing");
取数据:
${Request.message}
${Session.Love}
${Application.zuiai}
3.SpringBoot中使用FreeMarker
①依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
②增加相关配置
spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=true
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.enabled=true
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=true
spring.freemarker.prefer-file-system-access=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.settings.template_update_delay=0
spring.freemarker.settings.default_encoding=UTF-8
spring.freemarker.settings.classic_compatible=true
spring.freemarker.order=1
其中最重要的是spring.freemarker.suffix和spring.freemarker.template-loader-path,其他配置项可以使用默认值。
- springBoot中使用Freemarker后,可以生成任意后缀名的文件,只需要在配置文件里面配置好就可以作为前端html页面来使用。
【1】主启动器:
- 此处省略.....这是springBoot中默认要有的
【2】handler方法
@RequestMapping("/testftl")
public String testFtl(Model model) {
model.addAttribute("message", "getMessage");
session.setAttribute("Dream", "wenmin");
session.getServletContext().setAttribute("sinian", "wenxing");
return "hello";
}
【3】配置文件 -- application.yml
spring:
freemarker:
suffix: .ftl
template-loader-path: classpath:/templates/
server:
port: 1234
logging:
level:
root: INFO
path: /springboot/log
【4】前端页面:hello.ftl == 》 工程名下的templates 目录下
<!DOCTYPE html>
<html lang="zh-CN">
<head>
</head>
<body>
<h1>hello</h1>
${Request.message}
${Session.Love}
${Application.zuiai}
</body>
</html>
4.热部署
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
热部署的作用是对当前工程的配置文件、handler在修改后,会在保存刷新后进行自动重新加载内置的Tomcat,在控制台打印初始化情况,其主要监听范围是application.yml和application.properties配置文件、handler。
5.日志配置
logging:
level:
root: INFO
path: /springboot/log
作用:
该日志配置在于将程序运行过程中的详细流程进行打印,主要用于Debug测试检查时,会打印初始化过程的详细方法执行和值传递等。
保存位置 :
由于一次性打印的日志在Debug界面下会很多,不便于在串口内查看,所以可指定"path"路径进行保存到文件中,第一个“/”代表当前工程所在的盘符位置,后面是父目录、子目录,日志存在子目录中。
SpringBoot 之 视图解析与模板引擎、 热部署、日志配置(四)的更多相关文章
- 用 php 实现一个视图组件和模板引擎——基础
只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我 ...
- SpringBoot系列之集成jsp模板引擎
目录 1.模板引擎简介 2.环境准备 4.源码原理简介 SpringBoot系列之集成jsp模板引擎 @ 1.模板引擎简介 引用百度百科的模板引擎解释: 模板引擎(这里特指用于Web开发的模板引擎)是 ...
- 从零开始学习springboot之热部署的配置
各位看官大家好,博主之前因为毕业设计以及毕业旅游耽搁了好长一段时间没有更新博客了,从今天起又会慢慢开始学习啦. 今天主要是来学习springboot热部署的配置. 一. 热部署 我们通常在修改某些文件 ...
- SpringBoot项目构建、测试、热部署、配置原理、执行流程
SpringBoot项目构建.测试.热部署.配置原理.执行流程 一.项目构建 二.测试和热部署 三.配置原理 四.执行流程
- 转载:tomcat实现热部署的配置
tomcat实现热部署的配置 我们实现热部署后,自然就可以通过maven操作tomcat了,所以就需要maven取得操作tomcat的权限,现在这一步就是配置tomcat的可操作权限. 进入tom ...
- JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎
上篇博客我们聊了<JavaEE开发之SpringBoot工程的创建.运行与配置>,从上篇博客的内容我们不难看出SpringBoot的便捷.本篇博客我们继续在上篇博客的基础上来看一下Spri ...
- SpringBoot入门:新一代Java模板引擎Thymeleaf(理论)
Spring Boot 提供了spring-boot-starter-web来为Web开发予以支持,spring-boot-starter-web为我们提供了嵌入的Tomcat以及SpringMVC的 ...
- SpringBoot入门篇--使用Thymeleaf模板引擎进行页面的渲染
在做WEB开发的时候,我们不可避免的就是在前端页面之间进行跳转,中间进行数据的查询等等操作.我们在使用SpringBoot之前包括我在内其实大部分都是用的是JSP页面,可以说使用的已经很熟悉.但是我们 ...
- Laravel 5.2 三、中间件、视图与 Blade 模板引擎
一.中间件 Laravel 的 HTTP 中间件提供了对路由的一层过滤和保护.下面模拟一下用中间件验证后台登录. 1. 创建中间件 cmd 窗口进入项目目录,使用 artisan 命令创建 php a ...
随机推荐
- (一)Redis介绍
1 背景 在早期的互联网Web 1.0时代,大部分企业还是采用传统的企业级单体应用架构,而一时间蜂拥而至的巨大用户流量使得这种架构难以支撑,通过对诸多系统架构实施以及对巨大用户流量的分析过程中发现,其 ...
- Mysql常用sql语句(18)- union 全连接
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 其实Mysql并没有全连接,Oracle才有全连 ...
- 进程和线程—Python多线程编程
进程和线程 进程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其它用于跟踪执行的辅助数据. 一个程序运行就是一个进程(比如 QQ.微信或者其它软件): 进程可以通过派生新的进 ...
- 自动扫雷 python
自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. // 2018.8.10更新 代码已上传至GitHub https://gith ...
- Python中内置函数
python提供了很多的内置函数,这些内置的函数在某些情况下,可以起到很大的作用,而不需要专门去 写函数实现XX功能,直接使用内置函数就可以实现,下面分别来学习内置函数的使用和案例代码. abs(), ...
- Wfuzz使用学习
工具用了不总结,使用命令很容易生疏,今天就把笔记梳理总结一下. 0x01 简介 WFuzz是用于Python的Web应用程序安全性模糊工具和库.它基于一个简单的概念:它将给定有效负载的值替换对FUZZ ...
- ql的python学习之路-day13
前言:本节主要学习模块 一.模块的定义 模块:本质是.py结尾的python文件(文件名:test.py,对应的模块是:test),用来从逻辑上组织python代码(变量.函数.类.逻辑,本质是实现一 ...
- Java—线程的生命周期及线程控制方法详解
线程生命周期5种状态 介绍 线程的生命周期经过新建(New).就绪(Runnable).运行(Running).阻塞(Bolocked)和死亡(Dead) 状态转换图 新建(New) 程序使用 ...
- 推荐一款Python神器,5 行 Python 代码 实现一键批量扣图
今天给大家分享一款Python装逼实用神器. 在日常生活或者工作中,经常会遇到想将某张照片中的人物抠出来,然后拼接到其他图片上去.专业点的人可以使用 PhotoShop 的"魔棒" ...
- 「雕爷学编程」Arduino动手做(12)——霍尔磁力模块
37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...