在实际开发项目过程中,经常会使用Redis缓存机制减轻数据库的访问压力,其实还有一个方案可以实现数据库的访问优化。就是使用FreeMaker机制。当访问一次数据库后把数据封装到静态html页面上,以后再访问相同网站时就不需要再次查询数据,直接加载显示html页面。
下面做了一个实例优化,代码如下:
@Controller
public class FreeMakerController {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@RequestMapping("/genhtml")
public String genHtml(HttpServletRequest request, HttpServletResponse response)throws Exception {
//1、从spring容器中获得FreeMarkerConfigurer对象。
//2、从FreeMarkerConfigurer对象中获得Configuration对象。
Configuration configuration = freeMarkerConfigurer.getConfiguration();
//3、使用Configuration对象获得Template对象。相应的ftl模板我已经放到项目工程中去了,此项目我放在/WEB-INF/ftl目录下
Template template = configuration.getTemplate("hello.ftl");
//4、创建数据集
Map dataModel = new HashMap<>();
//需要把数据放到Map集合中去
dataModel.put("hello", "1000");
//5、创建输出文件的Writer对象,创建HTML文件
File file = new File(request.getServletContext().getRealPath("/WEB-INF/html") + "/html","hello.html");
File dir = file.getParentFile();
if (!dir.exists()) {
dir.mkdirs();
}
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
Writer out = new FileWriter(file);
//6、调用模板对象的process方法,数据封装到文件中去。
template.process(dataModel, out);
//7、关闭流。
out.close();
//直接显示已加载好数据的HTML文件,而不是jsp文件
return "/html/hello.html";
}
}
属性配置:
<mvc:resources location="/WEB-INF/html/html/" mapping="/html/*.html"/>
<mvc:resources location="/WEB-INF/jsp/" mapping="/jsp/*.html"/>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
在实践过程我也遇到一些问题:
1)一开始在Springmvc.xml中配置jsp过滤属性
<!-- 配置视图解析器 作用:在controller中指定页面路径的时候就不用写页面的完整路径名称了,可以直接写页面去掉扩展名的名称-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--真正的页面路径 = 前缀 + 去掉后缀名的页面名称 + 后缀
前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
但是我又配置了
<mvc:resources location="/WEB-INF/html/html/" mapping="/html/*.html"/>
<mvc:resources location="/WEB-INF/jsp/" mapping="/jsp/*.html"/>
无法正常访问网页,原来会优先进行前后缀的过滤,比如我返回的值是/html/hello.html,返回网址是”/WEB-INF/html/html/hello.html”,但是实际访问的网址是”/WEB-INF/jsp/html/hello.html.jsp”导致无法访问,需要把前后缀过滤注释掉。