转载请注明出处:https://oldnoop.tech/c/134.html
Freemarker介绍
freemarker是一个模板引擎,
定义一个模板, 在模板里面使用一些标签来接收一些数据, 生成最终的文档
Freemarker集成springmvc
在MVC结构中,可以用在视图层,定义html模板,接收控制器层的数据,生成最终的页面
【说明:此处可以举例 springmvc + freemarker 如何集成, 说明springmvc的配置文件】
配置freemarker的视图解析器,
主要是配置视图页面文件的前缀,后缀
freemarker的配置bean(spring提供的集成freemarker的java类),
主要是配置模板文件夹路径,字符集,日期格式化等等
<bean id="freemarkerResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
<property name="prefix" value="/ftl/" />
<property name="suffix" value=".html" />
<property name="contentType" value="text/html;charset=utf-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<!-- 在存在多个视图解析器的情况下,优先使用哪个的优先级,优先使用 order值较小的视图解析器 -->
<!-- 这里优先使用freemarker的视图解析器(order值0), 没有再使用jsp的(order值1)-->
<property name="order" value="0" />
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.######</prop>
<prop key="whitespace_stripping">true</prop>
</props>
</property>
</bean>
freemarker拿到web根路径
Freeamker模板是静态化文件,拿不到jsp的内置对象,web根路径context path,需要单独处理
可以编写一个servlet,配置在web.xml中,启动的时候,将上下文路径contextpath,存放在application作用域的一个变量中,这样,freemarker模板页面就可以直接使用
<servlet>
<servlet-name>contextPathInit</servlet-name> <servlet-class>demo.ssm.framwork.ContextPathInitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
public class ContextPathInitServlet extends HttpServlet {
private static final long serialVersionUID = 9154047903006043149L;
private static final String CONTEXT_PATH_PARAM = "ctx";
@Override
public void init(ServletConfig config) throws ServletException {
config.getServletContext().setAttribute(CONTEXT_PATH_PARAM,
config.getServletContext().getContextPath());
}
}
Freemarker模板导出excel
使用excel模板 在模板里面使用freemaker标签,
然后使用freemarker的api生成最终的excel文件,替代poi的编码,方便维护和修改
Freemaker模板中的变量值为null,就会报错
Freemarker用于springboot
pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
application.properties配置freemarker
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.html
static文件夹下存放静态文件*.js,*.css,图片等
/src/main/resources
|---static
|-----css
|-----images
|-----js
templates文件夹下存放freemarker视图页面
/src/main/templates
|---templates
|--demo
|-----list.html
|-----to_add.html
|-----add.html
|-----to_edit.html
|-----edit.html
编写控制器
@Controller
@RequestMapping("/demo")
public class FreemarkerController {
@RequestMapping("/list")
public String list(Model model){
List<Map<String,Object>> list = new ArrayList<>();
Map<String, Object> map = null;
map = new HashMap<>();
map.put("id", 1);
map.put("name", "张三");
list.add(map);
map = new HashMap<>();
map.put("id", 2);
map.put("name", "李四");
list.add(map);
model.addAttribute("list", list);
return "demo/list";
}
}
编写视图页面
引入静态文件js/css/图片等,路径前缀 ${request.contextPath}
request和application.properties中的spring.freemarker.request-context-attribute=request对应
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${request.contextPath}/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="${request.contextPath}/js/jquery.formatDate.js"></script>
<link rel="stylesheet" type="text/css" href="${request.contextPath}/css/table.css">
</head>
<body>
<table class="gridtable">
<tr>
<td>id</td>
<td>姓名</td>
</tr>
<#list list as ele>
<tr>
<td>${ele.id}</td>
<td>${ele.name}</td>
</tr>
</#list>
</table>
</body>
</html>