网页静态化技术
随着用户访问网站的访问量越来越大,不能每次来访问都要去查询一次数据库所以网页静态化技术越来越流行,所谓网页静态化就是将网页以纯静态的方式显示在页面,减少数据库的访问压力。
网页静态化技术与缓存技术的比较
- 共同点:都是减轻数据库的访问压力
- 不同点: 缓存技术是使用在小规模的数据,而且查询数据较为频繁的时候使用,而网页静态化是使用在大规模但是查询数据库不是很频繁下使用
FreeMarker
FreeMarker是一款用Java语言编写的模板引擎,对于系统中频繁使用数据库进行查询但是内容更新很小的应用,都可以用FreeMarker将网页静态化,这样就避免了大量的数据库访问请求,从而提高网站的性能,在在移动端查询套餐数据的时候使用到了FreeMarker
- assign指令
相当于String name="张国荣"; System.out.println(name);
这行代码,就是历用assign定义一个属性然后使用插值表达式打印出来但是实际开发中一般都是取真实的数据所以这个用的比较少。
<#assign linkman="张国荣">
联系人:${linkman}
- include指令
就是添加一些公共页面,比如一些网站的头部,无论点击哪个功能头部的信息都会在上面显示,如果每一个网页就需要去写头部的代码来展示页面,就很频繁,所以就可以使用include标签将需要的页面直接导入到具体的位置
比如head.ftl为头部信息需要在另一个页面直接<#include "head.ftl"/>
就可以显示其中的内容。 - if指令
<#if success=true>
你已通过实名认证
<#else>
你未通过实名认证
</#if>
相当于对数据进行判断,如果success的属性是true就显示你已通过实名认证如果不是true就显示你未通过实名认证。
- list指令
一般用于将查询的到数据遍历出来得到指定的值渲染到静态页面上
<#list goodsList as goods>
商品名称:${name} 价格为:${price}
</#list>
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
String path = FreemarkerTest.class.getResource("/ftl/").getPath();
configuration.setDirectoryForTemplateLoading(new File(path));
configuration.setDefaultEncoding("utf-8");
Template template = configuration.getTemplate("freemarkertest.ftl");
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "kobe");
map.put("address", "beijing");
map.put("success", false);
FileWriter fileWriter = new FileWriter("d:/index.html");
assert template != null;
template.process(map, fileWriter);
fileWriter.close();
生成移动端静态页面
学完了freemarker的基本使用之后,就可以利用这个技术来实现移动端的套餐列表的静态页面和套餐详情的静态页面,但是这实现这个功能之前提出了三个问题。
- 什么时候生成静态页面比较合适呢?
- 将静态页面生成到什么位置呢?
- 应该生成几个静态页面呢?
答:
(1): 应该在管理员对后台进行增删改查的时候需要生成静态页面。就是当数据发生改变时。
(2):如果是在开发阶段将静态页面生成到项目中,上线后需要将页面生成到移动端所在的服务器中。
(3):生成三个页面,所有的套餐生成一个页面,每一个套餐详情生成一个页面多个套餐就是多个页面
步骤
- 将freemaker与spring整合
<!--加载属性文件,后期在Java代码中使用到这个文件所定义得key和value-->
<context:property-placeholder location="classpath:freemarker.properties"/>
<!-- spring对Freemarker的Configuration对象的集成 -->
<bean id="markerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<!--指定模板文件所在目录-->
<property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
<!--指定字符集-->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
- 将freemaker要生成到的路径作为配置文件freemarker.properties
out_put_path=D:/IdeaProjects/itcast_health/health_parent/health_mobile/src/main/webapp/pages
- 将需要生成的模板文件引入到相印的路径
- 到对应的模块,就是套餐模板的业务层中添加生成模板页面的方法
- 生成通用对应的详情页面的方法
/**
* 对一个数据和模板来生成对应的详情页面
* @param templateName --模板页面
* @param htmlPageName --需要生成的html后的页面名称
* @param map --生成html页面的数据模型
*/
public void generateHtml(String templateName,String htmlPageName,Map<String,Object> map){
//获得配置对象
Configuration configuration = freeMarkerConfigurer.getConfiguration();
Writer writer = null;
try {
Template template = configuration.getTemplate(templateName);
//构造输出流
writer = new FileWriter(new File(outPutPath + "/" + htmlPageName));
//输出文件
template.process(map,writer);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (writer!=null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 根据套餐集合数据生成套餐列表页面
/**
* 根据套餐集合数据生成套餐列表页面
* @param list -- 套餐的集合数据(套餐的所有数据)
*/
public void generateMobileSetmealDetailHtml(List<Setmeal> list){
for (Setmeal setmeal : list) {
Map<String,Object> map = new HashMap<>(2);
map.put("setmeal",setmealDao.findAssociationById(setmeal.getId()));
generateHtml("mobile_setmeal_detail.ftl","setmeal_detail_" + setmeal.getId() + ".html",map);
}
}
- 根据套餐集合数据生成套餐详情页面
/**
* 根据套餐集合数据生成套餐详情页面
* 特点:一条套餐数据对应一个页面
* @param list 查询出来的套餐的基本信息
*/
public void generateMobileSetmealListHtml(List<Setmeal> list){
Map<String,Object> map = new HashMap<>(2);
//为模板提供数据,用于生成静态页面
map.put("setmealList",list);
generateHtml("mobile_setmeal.ftl","m_setmeal.html",map);
}
- 对套餐数据进行增、删、改操作时会来重新生成对应的html静态页面
/**
* 对套餐数据进行增、删、改操作时会来重新生成对应的html静态页面
* 1.套餐的列表页面
* 2.套餐的详情页面
*/
public void generateMobileStaticHtml(){
//在生成静态页面之前需要查询数据
List<Setmeal> list = setmealDao.findAll();
//需要生成套餐列表静态页面
generateMobileSetmealListHtml(list);
//需要生成套餐详情静态页面
generateMobileSetmealDetailHtml(list);
}
- 在需要增、删、改、的操作重新生成静态页面,在里面调用
generateMobileStaticHtml();
方法 - 需要在业务层注入生成静态页面的路径
@Value("${out_put_path}")
private String outPutPath;