精华内容
下载资源
问答
  • } } 8、html模板 动态生成html页面模板:news.html <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"/> <title>新闻内容title> head> <body> 新闻内容h1> ${news....

    整体结构:
    在这里插入图片描述

    1、实体类

    package com.hdit.domain;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import org.springframework.format.annotation.DateTimeFormat;
    
    import java.util.Date;
    
    /**
     * @基本功能:
     * @ClassName: News
     * @Description: TODO
     * @Author: lijiaming
     * @Date: 2021/3/17 15:43
     * @Version 1.0
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class News {
        private int id;
        private String newsId;
        private String newsTitle;
        private String newsContent;
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date    newsDate;
    }
    
    

    2、thymeleaf模板引擎(TemplateEngine)实现数据与模板组合。

    package com.hdit.util;
    
    import com.hdit.domain.News;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * @author Administrator
     * @version v1.0
     * @className PageStaticUtil
     * @Date 2021/3/17
     */
    @Component
    public class PageStaticUtil {
    
        @Autowired
        private TemplateEngine  templateEngine;
    
        public  void  toHTML(News news){
    //      thymeleaf上下文
            Context   context=new Context();
    //        设置数据
            context.setVariable("news",news);
    
    //        输出
            FileWriter   out=null;
            try {
                out=new FileWriter("C:\\Users\\ljm\\Desktop\\news\\"+news.getNewsId()+".html");
                templateEngine.process("news.html",context,out);
            }catch (Exception  e){
    
            }finally {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    }
    
    

    3、配置将生成的组合后的html文件分别存放在服务器下和本地。

    package com.hdit.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @author Administrator
     * @version v1.0
     * @className PageStaticPathConfig
     * @Date 2021/3/17
     */
    @Configuration
    public class PageStaticPathConfig implements WebMvcConfigurer{
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/news/**").addResourceLocations("file:C:/Users/ljm/Desktop/news/");
            }
    }
    
    

    4、controller层

    package com.hdit.controller;
    
    import com.hdit.domain.News;
    import com.hdit.service.NewService;
    import com.hdit.util.PageStaticUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import java.util.List;
    import java.util.UUID;
    
    /**
     * @基本功能:
     * @ClassName: NewsController
     * @Description: TODO
     * @Author: lijiaming
     * @Date: 2021/3/17 15:43
     * @Version 1.0
     */
    @Controller
    public class NewsController {
        @Autowired
        private PageStaticUtil pageStaticUtil;
        @Autowired
        private NewService newService;
    
        @PostMapping("/addNews")
        public String addNews(News news){
            System.out.println("添加新闻!!!");
            news.setNewsId(UUID.randomUUID().toString());
            int i = newService.addNews(news);
            System.out.println(news);
            pageStaticUtil.toHTML(news);
            return "addNews.html";
        }
        @GetMapping("/findAllNews")
        public String findAllNews(ModelMap map){
            System.out.println("查找所有新闻!!!");
            List<News> news_list =  newService.findAllNews();
            System.out.println(news_list);
            map.addAttribute("news_list",news_list);
            return "showNews.html";
        }
    }
    
    

    5、service层

    service.impl接口类

    package com.hdit.service;
    
    import com.hdit.domain.News;
    
    import java.util.List;
    
    
    public interface NewService {
        public int  addNews(News news);
        public List<News> findAllNews();
     }
    
    

    service.impl实现类

    package com.hdit.service.impl;
    
    import com.hdit.domain.News;
    import com.hdit.mapper.NewsMapper;
    import com.hdit.service.NewService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @基本功能:
     * @ClassName: NewsServiceImpl
     * @Description: TODO
     * @Author: lijiaming
     * @Date: 2021/3/17 15:44
     * @Version 1.0
     */
    @Service
    public class NewsServiceImpl implements NewService {
        @Autowired
        private NewsMapper newsMapper;
        @Override
        public int addNews(News news) {
            Map map = new HashMap();
            map.put("newsId",news.getNewsId());
            map.put("newsTitle",news.getNewsTitle());
            map.put("newsContent",news.getNewsContent());
            map.put("newsDate",news.getNewsDate());
            return newsMapper.addNews(map);
        }
        @Override
        public List<News> findAllNews() {
            return newsMapper.findAllNews();
        }
    }
    
    

    6、mapper层

    package com.hdit.mapper;
    
    import com.hdit.domain.News;
    import org.apache.ibatis.annotations.Insert;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;
    import java.util.List;
    import java.util.Map;
    
    
    @Repository
    public interface NewsMapper {
        @Insert("insert into news values(null,#{newsId},#{newsTitle},#{newsContent},#{newsDate})")
        public int  addNews(Map map);
        @Select("select * from news")
        public List<News> findAllNews();
    }
    
    

    7、springboot启动类

    package com.hdit;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    
    @SpringBootApplication
    @MapperScan("/com.hdit.mapper") //扫描mapper
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
    }
    
    

    8、html模板

    动态生成html页面模板:news.html

    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="utf-8"/>
        <title>新闻内容</title>
    </head>
    <body>
    <h1>新闻内容</h1>
    <p th:text="${news.newsId}"></p>
    <p th:text="${news.newsTitle}"></p>
    <p th:text="${news.newsContent}"></p>
    <p th:text="${news.newsDate}"></p>
    </body>
    </html>
    

    查看所有新闻信息模板:showNews.html

    <!DOCTYPE html>
    <html lang="en"  xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="utf-8"/>
        <title>新闻内容</title>
    </head>
    <body>
    <h1>新闻内容</h1>
    <table border="1" >
        <tr>
            <th>序号</th>
            <th>id</th>
            <th>新闻标题</th>
            <th>新闻内容</th>
            <th>时间</th>
            <th>查看详情信息</th>
        </tr>
        <tr th:each="news:${news_list}">
            <td th:text="${news.id}"></td>
            <td th:text="${news.newsId}"></td>
            <td th:text="${news.newsTitle}"></td>
            <td th:text="${news.newsContent}"></td>
            <td th:text="${news.newsDate}"></td>
            <td ><a th:href="'/SpringBootNews/news/'+${news.newsId}+'.html'">查看</a></td>
        </tr>
    </table>
    </body>
    </html>
    

    9、添加新闻信息页面:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="utf-8"/>
        <title>添加新闻</title>
    </head>
    <body>
    <h1>添加新闻</h1>
    <form action="/SpringBootNews/addNews" method="post">
        新闻标题:<input type="text" name="newsTitle"/><br>
        新闻内容:<input type="text" name="newsContent"/><br>
        时 间:<input type="date" name="newsDate"/><br>
        <input type="submit" value="添加">
    </form>
    <form action="/SpringBootNews/findAllNews" method="get">
        <input type="submit" value="查看新闻"/>
    </form>
    </body>
    </html>
    

    10、application.yml配置文件:

    server:
      port: 8083
      servlet:
        context-path: /SpringBootNews
    spring:
      datasource:
        username: root
        password: 123456
        url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    

    11、pom.xml依赖文件:

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
    展开全文
  • 页面静态化

    2015-08-06 16:31:31
    新闻详情页静态化: 添加新闻时创建静态化页面
    新闻详情页静态化:

    添加新闻时创建静态化页面:

    展开全文
  • 一个全存储过程的 新闻发布系统 新闻子页页面静态化
  • Freemarker 页面静态化

    2019-09-09 13:52:36
    文章目录为什么要页面静态化Freemarker 简介Freemarker入门知识将网页静态化用于博客网站 为什么要页面静态化 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道。...

    为什么要页面静态化

    网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道。比如CSDN有非常多的人在上面写博客。一个博客的内容在发布后很少变动。那么这种场景下就适合使用页面静态化技术。在不请求数据库的情况下架就能返回博客内容页面:
    在这里插入图片描述

    对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。

    网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。

    另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。

    Freemarker 简介

    FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很合适作为web应用框架的一个组件。

    特点:

    1. 轻量级模版引擎,不需要Servlet环境就可以很轻松的嵌入到应用程序中
    2. 能生成各种文本,如html,xml,java,等
    3. 入门简单,它是用java编写的,很多语法和java相似

    工作原理:
    在这里插入图片描述

    Freemarker入门知识

    Test.ftl
    下面是一个Freemarker的模板。那么我写了常用的基础语法。我们可以使用这个模板生成我们想要的静态 html 页面

    <#--我只是一个注释,我不会有任何输出  -->
    ${name},你好。${message}
    
    <h3>assigne指令</h3>
    <#assign linkman="周先生">
    联系人:${linkman}
    
    <#assign info={"mobile":"13301231212",'address':'北京市昌平区王府街'} >
    电话:${info.mobile}  地址:${info.address}
    
    <h3>if指令</h3>
    <#if success=true>
      你已通过实名认证
    <#else>  
      你未通过实名认证
    </#if>
    
    <h3>list指令</h3>
    ----商品价格表----<br>
    <#list goodsList as goods>
      ${goods_index+1} 商品名称: ${goods.name} 价格:${goods.price}<br>
    </#list>
    
    <h3>内建函数</h3>
    <h4>获取集合大小</h4>
    共  ${goodsList?size}  条记录
    
    <h4>转换JSON字符串为对象</h4>
        <#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
    	<#assign data=text?eval />
    	开户行:${data.bank}  账号:${data.account}
    	
    <h4>日期格式化</h4>
    当前日期:${today?date} <br>
    当前时间:${today?time} <br>   
    当前日期+时间:${today?datetime} <br>        
    日期格式化:  ${today?string("yyyy年MM月")}
    
    <h4>数字转换为字符串</h4>
    累计积分:${point}
    累计积分:${point?c}
    
    
    <h3>空值处理运算符</h3>
    <h4>判断某变量是否存在:“??”</h4>
    <#if aaa??>
      aaa变量存在
    <#else>
      aaa变量不存在
    </#if>
    
    <h4>缺失变量默认值:“!”</h4>
      ${aaa!'-'}
    
    
    <h3>运算符</h3>
    <h4>算数运算符</h4>
    FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
    
    <h4>逻辑运算符</h4>
    逻辑运算符有如下几个: 
    逻辑与:&& 
    逻辑或:|| 
    逻辑非:! 
    逻辑运算符只能作用于布尔值,否则将产生错误 
    
    <h4>比较运算符</h4>
    表达式中支持的比较运算符有如下几个: 
    1  =或者==:判断两个值是否相等. 
    2  !=:判断两个值是否不等. 
    3  >或者gt:判断左边值是否大于右边值 
    4  >=或者gte:判断左边值是否大于等于右边值 
    5  <或者lt:判断左边值是否小于右边值 
    6  <=或者lte:判断左边值是否小于等于右边值 
    注意:  =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,而且FreeMarker是精确比较,"x","x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把>解释成FTL标签的结束字符,当然,也可以使用括号来避免这种情况,
    

    后台类

    package com.cpc.freemarker;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    public class Demo001 {
    	public static void main(String[] args) throws IOException, TemplateException {
    		// 1.创建配置类
    		Configuration configuration = new Configuration(Configuration.getVersion());
    		// 2.设置模板所在的目录
    		configuration.setDirectoryForTemplateLoading(
    				new File("D:\\code\\code_eclipse\\临时项目\\cpc_lunece_freemarker\\src\\main\\resources"));
    		// 3.设置字符集
    		configuration.setDefaultEncoding("utf-8");
    		// 4.加载模板
    		Template template = configuration.getTemplate("test.ftl");
    		// 5.创建数据模型
    		Map map = new HashMap(); 
    		map.put("name", "cpc");
    		map.put("message", "欢迎来到神奇的博客网站:http://www.cpc.com!");
    		map.put("success", true);
    		
    		List goodsList=new ArrayList();
    		Map goods1=new HashMap();
    		goods1.put("name", "苹果");
    		goods1.put("price", 5.8);
    		Map goods2=new HashMap();
    		goods2.put("name", "香蕉");
    		goods2.put("price", 2.5);
    		Map goods3=new HashMap();
    		goods3.put("name", "橘子");
    		goods3.put("price", 3.2);
    		goodsList.add(goods1);
    		goodsList.add(goods2);
    		goodsList.add(goods3);
    		map.put("goodsList", goodsList);
    		map.put("today", new Date());
    		map.put("point", 102920122);
    		// 6.创建Writer对象
    		Writer out = new FileWriter(new File("D:\\code\\code_eclipse\\临时项目\\cpc_lunece_freemarker\\src\\main\\webapp\\freemarker\\test.html"));
    		// 7.输出
    		template.process(map, out);
    		// 8.关闭Writer对象
    		out.close();
    	}
    }
    

    结果图
    在这里插入图片描述

    将网页静态化用于博客网站

    blogDetail.ftl

    <div class="data_list">
    	<div class="data_list_title">
    		<img src="../blog_show_icon.png"/>
    		博客信息
    	</div>
    	<div>
    		<div class="blog_title"><h3><strong>${blog.title }</strong></h3></div>
    		<div class="blog_share">
    			<!-- <div class="bshare-custom"><a title="分享到QQ空间" class="bshare-qzone"></a><a title="分享到新浪微博" class="bshare-sinaminiblog"></a><a title="分享到人人网" class="bshare-renren"></a><a title="分享到腾讯微博" class="bshare-qqmb"></a><a title="分享到网易微博" class="bshare-neteasemb"></a><a title="更多平台" class="bshare-more bshare-more-icon more-style-addthis"></a><span class="BSHARE_COUNT bshare-share-count">0</span></div><script type="text/javascript" charset="utf-8" src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=2&lang=zh"></script><script type="text/javascript" charset="utf-8" src="http://static.bshare.cn/b/bshareC0.js"></script> -->
    		</div>
    		<div class="blog_info">
    			发布时间:『${blog.releaseDate?datetime }』  博客类别:${blog.btid }  阅读(${blog.clickHit })
    		</div>
    		<div class="blog_content">
    		${blog.content }
    		</div>
    	</div>
    </div>
    

    后台代码:

    package com.cpc.freemarker;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Map;
    
    import com.cpc.blog.util.DBAccess;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    
    public class Demo002 {
    	@SuppressWarnings("rawtypes")
    	public static void main(String[] args) throws IOException, TemplateException, SQLException {
    		// 1.创建配置类 
    		Configuration configuration = new Configuration(Configuration.getVersion());
    		// 2.设置模板所在的目录
    		configuration.setDirectoryForTemplateLoading(
    				new File("D:\\code\\code_eclipse\\临时项目\\cpc_lunece_freemarker\\src\\main\\webapp\\freemarker"));
    		// 3.设置字符集
    		configuration.setDefaultEncoding("utf-8");
    		// 4.加载模板 (这是在 刚刚设置好的 目录下面去找)
    		Template template = configuration.getTemplate("blogDetail.ftl");
    		createPage(template);	
    	}
    	
    	private static void createPage(Template template) throws SQLException, IOException, TemplateException {
    		Connection con = DBAccess.getConnection();
    		String sql = "select * from t_lucene_freemarker_blog";
    		PreparedStatement pst = con.prepareStatement(sql);
    		ResultSet rs = pst.executeQuery();
    		Map map = new HashMap<>();
    		Map<String, Object> blog = new HashMap<>();
    		while(rs.next()) {
    			blog.put("bid", rs.getObject("bid"));
    			blog.put("title", rs.getObject("title"));
    			blog.put("releaseDate", rs.getObject("releaseDate"));
    			blog.put("btid", rs.getObject("btid"));
    			blog.put("clickHit", rs.getObject("clickHit"));
    			blog.put("content", rs.getObject("content"));
    			
    			map.put("blog", blog);
    //			// 6.创建Writer对象
    			Writer out = new FileWriter(new File("D:\\code\\code_eclipse\\临时项目\\cpc_lunece_freemarker\\src\\main\\webapp\\freemarker\\"+blog.get("bid")+".html"));
    			// 7.输出
    			template.process(map, out);
    			// 8.关闭Writer对象
    			out.close();
    		}
    		DBAccess.close(con, pst, rs);
    	}
    }
    

    其中的一个页面:

    在这里插入图片描述

    展开全文
  • 页面静态化技术

    2020-05-03 12:06:59
    页面静态化 1动态页面: 通过执行asp、php、jsp和.net等程序生成客户端网页代码的网页。通常可以通过网站后台管理系统对网站的内容进行更新管理。发布新闻,发布公司产品,交流互动,博客,网上调查等,这都是动态...

    页面静态化

    1动态页面:

    通过执行asp、php、jsp和.net等程序生成客户端网页代码的网页。通常可以通过网站后台管理系统对网站的内容进行更新管理。发布新闻,发布公司产品,交流互动,博客,网上调查等,这都是动态网站的一些功能。也是我们常见的。 常见的扩展名有:.asp、php、jsp、cgi和aspx 等。 注意:动态页面的“动态”是网站与客户端用户互动的意思,而非网页上有动画的就是动态页面。

    A.交互性好。

    B.动态网页的信息都需要从数据库中读取,每打开一个一面就需要去获取一次数据库,如果访问人数很多,也就会对服务器增加很大的荷载,从而影响这个网站的运行速度。

    2静态页面:

    最早的时候,网站内容是通过在主机空间中放置大量的静态网页实现的。为了方便对这些分散在不同目录的静态网页的管理,(一般是通过FTP),象frontpage/dreamweaver这样软件甚至直接提供了向主页空间以FTP方式直接访问文件的功能。以静态网页为主的网站最大的困难在于对网页的管理,在这种框架里,网页框架和网页中的内容混杂在一起,很大程度地加大了内容管理的难度。为了减轻这种管理的成本,发展出了一系列的技术,甚至连css本身,原本也是针对这种乱七八糟的网页维护而设计的,目的就是把网页表达的框架和内容本身抽象分离出来。

    A.静态网页的内容稳定,页面加载速度快。

    B.静态网页的没有数据库支持,在网站制作和维护方面的工作量较大。

    C.静态网页的交互性差,有很大的局限性。

    3为什么需要动态页面静态化:

    1. 搜索引擎的优化

    尽管搜索机器人有点讨厌,各个网站不但不会再象从前一样把它封起来,反而热情无比地搞SEO,所谓的面向搜索引擎的优化,其中就包括访问地址的改写,令动态网页看上去是静态网页,以便更多更大量地被搜索引擎收录,从而最大限度地提高自已的内容被目标接收的机会。但是,在完全以动态技术开发的网站,转眼中要求变换成静态网页提供,同时,无论如何,动态网页的内容管理功能也是必须保留的;就如同一辆飞驶的奔驰忽然要求180度转弯,要付出的成本代价是非常大的,是否真的值得,也确实让人怀疑。

    1. 提高程序性能

    很多大型网站,进去的时候看它很复杂的页面,但是加载也没有耗费多长时间,除了其它必要原因以外,静态化也是其中必需考虑的技术之一。

    先于用户获取资源或数据库数据进而通过静态化处理,生成静态页面,所有人都访问这一个静态页面,而静态化处理的页面本身的访问速度要较动态页面快很多倍,因此程序性能会有大大的提升。

    静态化在页面上的体现为:访问速度加快,用户体验性明显提升;在后台体现为:访问脱离数据库,减轻了数据库访问压力。

    4、FreeMarker原理

    ​ 基于Java的开发包和类库的一种将模板和数据进行整合并输出文本的通用工具,FreeMarker实现页面静态化的原理是:将页面中所需要的样式写入到 FreeMarker模板文件中,然后将页面所需要的数据进行动态绑定并放入到Map中,然后通过FreeMarker的模板解析类process()方 法完成静态页面的生成。

    模板 +  数据模型 = 输出,

    ​ 注: 这里将省略freemarker的语法, 因为很多都是类似EL表达式的, 这里只提供几种情况的讲解, 其中包括: list, map, list和map混合 FMDemo.java:

    public class FMDemo {
    
        //Freemarker
        public static void main(String[] args) throws Exception {
            
            Configuration conf = new Configuration();
            //模板+数据模型 = 输出
            //ftl: freemarker template
            //第一步: 读取html模板
            String dir = "C:\\workspace\\freemarker\\ftl\\";
            conf.setDirectoryForTemplateLoading(new File(dir));
            Template template = conf.getTemplate("freemarker.html");
            
            //第二步: 加载数据模型
            Map root = new HashMap();
            root.put("world", "世界你好");
            
            //List集合
            List<String> persons = new ArrayList<String>();
            persons.add("范冰冰");
            persons.add("李冰冰");
            persons.add("何炅");
            root.put("persons", persons);
            
            //Map集合
            Map map = new HashMap();
            map.put("fbb", "范冰冰");
            map.put("lbb", "李冰冰");
            root.put("map", map);
            
            //list和map混合
            List<Map> maps = new ArrayList<Map>();
            Map pms1 = new HashMap();
            pms1.put("id1", "范冰冰");
            pms1.put("id2", "李冰冰");
            Map pms2 = new HashMap();
            pms2.put("id1", "曾志伟");
            pms2.put("id2", "何炅");
            maps.add(pms1);
            maps.add(pms2);
            root.put("maps", maps);
            
            Writer out = new FileWriter(new File(dir + "hello.html"));
            template.process(root, out);
            System.out.println("生成完成");
        }
    }
    

    freemarker.html: 模板文件

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    ${world}
    <br/>
    
    <#list persons as person>
        <#if person_index == 2>
            ${person}---红色
        <#else>
            ${person}---绿色
        </#if>
    </#list><br/>
    
    <#list map?keys as key>
        ${map[key]}
    </#list>
    ${map.fbb}/${map.lbb}<br/>
    
    <#list maps as map>
        <#list map?keys as key>
            ${map[key]}
        </#list>
    </#list>
    <#list maps as map>
        ${map.id1}///${map.id2}
    </#list>
    </body>
    </html>
    

    5、静态化页面在项目中的使用

    ​ 当一个商品上架的时候, 通过发送消息来通知babasport-cms 来将对应的页面静态化. 在这里我们只写接收消息的方法,

    CustomMessageListener.java:接收MQ中的消息

    public class CustomMessageListener implements MessageListener{
        @Autowired
        private StaticPageService staticPageService;
        @Autowired
        private CMSService cmsService;
        
        @Override
        public void onMessage(Message message) {
            //先将接收到的消息强转为ActiveMQ类型的消息
            //因为在消息发送方那边传递的是Text类型的消息对象, 所以需要转成ActiveMQTextMessage
            ActiveMQTextMessage amtm = (ActiveMQTextMessage)message;
            try {
                String id = amtm.getText();
                System.out.println("CMS接收到的ID:"+id);
                Map<String, Object> root = new HashMap<String, Object>();
                
                Product product = cmsService.selectProductById(Long.parseLong(id));
                List<Sku> skus = cmsService.selectSkuListByProductIdWithStock(Long.parseLong(id));
                //去掉重复的颜色
                Set<Color> colors = new HashSet<Color>();
                for (Sku sku : skus) {
                    colors.add(sku.getColor());
                }
                root.put("colors", colors);
                root.put("product", product);
                root.put("skus", skus);
                
                staticPageService.index(root, id);
            } catch (JMSException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    

    StaticPageServiceImpl.java:

    public class StaticPageServiceImpl implements StaticPageService, ServletContextAware{
        //SpringMvc 管理 conf
        private Configuration conf;
        public void setFreeMarkerConfig(FreeMarkerConfig freeMarkerConfig) {
            this.conf = freeMarkerConfig.getConfiguration();
        }
    
        //静态化页面的方法
        public void index(Map<String, Object> root, String id){
            //输出目录: 通过getPath方法获取的是绝对路径
            String path = getPath("/html/product/" + id +".html");
            File f = new File(path);
            File parentFile = f.getParentFile();
            if(!parentFile.exists()){
                parentFile.mkdirs();
            }
            
            //spring中已经设置了模板路径:<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
            Writer out = null;
            
            try {
                //读
                Template template = conf.getTemplate("product.html");
                
                //设置输出的位置
                //写
                out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");
                template.process(root, out);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                if (out != null)
                {
                    try {
                        out.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
            }
            
        }
    
        //获取webapp下的html文件夹所在的位置
        //将相对路径转换为绝对路径
        public String getPath(String path){
            return servletContext.getRealPath(path);
        }
        
        private ServletContext servletContext;
        @Override
        public void setServletContext(ServletContext servletContext) {
            this.servletContext = servletContext;
        }
    }
    

    使用Spring管理Freemarker配置文件:

    <!-- 配置freemarker 实现类 -->    
            <bean class="cn.itcast.core.service.StaticPageServiceImpl">
                <property name="freeMarkerConfig">
                    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
                        <!-- 设置模板所在目录或文件夹的位置, 相对路径  -->
                        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
                        <!-- 设置默认编码集 -->
                        <property name="defaultEncoding" value="UTF-8"></property>
                    </bean>
                </property>
            </bean>
    

    模板页面: product.html 中的改动:

    引入其他页面:

    <#include “commons/header.html” />

    <div class="dd" id="colors">
        <#list colors as color>
        <div class="item" onclick="colorToRed(this,'${color.id}')">
            <b></b>
            <a href="javascript:;" title="${color.name }" >
            <img data-img="1"
                src="/images/53f44cc2N0b714cb2_002.jpg"
                alt="灰色三件套" height="25" width="25"><i>${color.name }</i></a>
        </div>
        </#list>
    </div>
    

    循环遍历imgUrls, 并且使用if…else 进行判断:

    <div class="spec-items">
        <ul class="lh">
            <#list product.imgUrls as pic>
                    <#if pic_index == 0>
                        <li><img data-img="1" class="img-hover"
                            alt="${product.name}" src="${pic}" width="50" height="50"></li>
                    <#else>
                        <li><img data-img="1" alt="${product.name}" src="${pic}"
                            width="50" height="50" ></li>
                    </#if>
            </#list>
        </ul>
    </div>
    
    展开全文
  • php实现页面静态化

    2016-12-07 18:52:25
    PHP页面静态化,是把那些内容不常变化的页面静态化,而不通过动态程从数据库或者缓存中读出,以此来增加响应速度和减轻服务器压力。这里的要点是对不常变化的内容做静态化,如:新闻,博客等。而经常变化的内容,如...
  • 使用PHP缓存机制完成新闻管理系统的页面静态化数据库表 ecs_article (新闻表)因为新闻这些信息,并不是对实时性要求高,本身这个新闻比较稳定,内容也比较固定,所以我们考虑: 当第一个用户访问某条新闻后,我们...
  • 打开php.ini配置文件查看output_buffering参数有没有打开output_buffering = on oroutput_buffering = 数值我的目录结构随便搞都可以分清楚静态和动态页面就可以singwa.php 动态页面新闻中心新闻列表index.php//1、...
  • 在一个网站运行的期间,要实现高效快速的访问一个页面,首先需要解决的就是网站的加载问题,这里的加载是网页上需要动态加载的一些东西,诸如图片,视频,文字,当我们访问这些网站的时候,网站后台的服务器负责加载...
  • PHP页面静态化,是把那些内容不常变化的页面静态化,而不通过动态程从数据库或者缓存中读出,以此来增加响应速度和减轻服务器压力。这里的要点是对不常变化的内容做静态化,如:新闻,博客等。而经常变化的内容,如...
  • lucene之页面静态化

    2019-09-10 04:03:33
    目的: 理解以及运用Freemarker一、为什么要使用网页静态化技术(Freemarker )?二、那什么是 Freemarker?三、Freemarker入门知识Test.ftl...网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中...
  • 是这样的,静态化和动态的技术我都会做,但是在做新闻详细页的时候遇到了问题。 新闻表大概有几十万条数据,每天来网站查看的人也有好几万。 所以,新闻详细页一定要做静态的,比如标题,内容 这种长久不更新的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 954
精华内容 381
热门标签
关键字:

新闻页面静态化