(10)SprintBoot 2.X 页面优化技术(页面静态化,前后端分离)(一)商品详情静态化

(10)SprintBoot 2.X 页面优化技术(页面静态化,前后端分离)(一)商品详情静态化

    • 1.为什么使用页面静态化?
    • 2. 代码实现
        • 2.1 application.properities中引入依赖
        • 2.2 改变goods_list.html的跳转商品详情页方式
        • 2.3 修改后端GoodsController接收商品详情页的请求的接口
        • 2.4 页面静态化后的goods_detail.htm

1.为什么使用页面静态化?

  • 使用页面静态化前:点击链接,访问后端controller 访问业务层,成功获取数据,将数据渲染到html页面再将整个html页面返回给客户显示
  • 使用页面静态化后::点击链接,除了第一次访问。访问直接访问用户本地的缓存的html页面 (浏览器会缓存下来静态static下文件),静态资源,然后通过前端ajAx来访问后端,获取页面需要显示的数据返回即可。说白了就是把动态网页中从服务器获取数据部分用ajax方式请求服务器接口获得,再通过angular、vue、react等前端框架渲染出来
  • 优点:
    (1)减轻服务器负担,浏览网页无需调用系统数据库。
    (2)有利于搜索引擎优化SEO,Baidu、Google都会优先收录静态页面,不仅被收录的快还收录的全;
    (3)加快页面打开速度,静态页面无需连接数据库打开速度较动态页面有明显提高;
    (4)网站更安全,HTML页面不会受php程序相关漏洞的影响;观看一下大一点的网站基本全是静态页面,而且可以减少攻击,防sql注入。数据库出错时,不影响网站正常访问。
    (5)数据库出错时,不影响网站的正常访问。
    (6)最主要是可以增加访问速度,减轻服务器负担,当数据量有几万,几十万或是更多的时候你知道哪个更快了. 而且还容易被搜索引擎找到。生成html文章虽操作上麻烦些,程序上繁杂些,但为了更利于搜索,为了速度更快些,更安全,这些牺牲还是值得的。

2. 代码实现

2.1 application.properities中引入依赖

#static
spring.resources.add-mappings=true
spring.resources.cache.period= 3600s
spring.resources.chain.cache=true 
spring.resources.chain.enabled=true
spring.resources.chain.compressed=true
spring.resources.chain.html-application-cache=true
spring.resources.static-locations=classpath:/static/

2.2 改变goods_list.html的跳转商品详情页方式




<td><a th:href="'/goods_detail.htm?goodsId='+${goods.id}">详情a>td>

2.3 修改后端GoodsController接收商品详情页的请求的接口

	/**
	 * 作页面静态化的商品详情
	 * 页面存的是html
	 * 动态数据通过接口从服务端获取
	 */
    @RequestMapping(value = "/detail/{goodsId}")
    @ResponseBody
    public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user, @PathVariable("goodsId") long goodsId) {

        //根据id查询商品详情
        GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
        model.addAttribute("goods", goods);
        long startTime = goods.getStartDate().getTime();
        long endTime = goods.getEndDate().getTime();
        long now = System.currentTimeMillis();

        int miaoshaStatus = 0;
        int remainSeconds = 0;

        if (now < startTime) {//秒杀还没开始,倒计时
            miaoshaStatus = 0;
            remainSeconds = (int) ((startTime - now) / 1000);
        } else if (now > endTime) {//秒杀已经结束
            miaoshaStatus = 2;
            remainSeconds = -1;
        } else {//秒杀进行中
            miaoshaStatus = 1;
            remainSeconds = 0;
        }
        GoodsDetailVo vo = new GoodsDetailVo();
        vo.setGoods(goods);
        vo.setUser(user);
        vo.setRemainSeconds(remainSeconds);
        vo.setMiaoshaStatus(miaoshaStatus);
        return Result.success(vo);
    }

2.4 页面静态化后的goods_detail.htm

  • getDetail() 通过ajax方式从服务端获取商品详情信息(GoodsDetailVo)后,交由render()进行页面渲染

<html >
<head>
    <title>商品详情title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
    <script type="text/javascript" src="/js/jquery.min.js">script>
    
    <link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.min.css" />
    <script type="text/javascript" src="/bootstrap/js/bootstrap.min.js">script>
    
    <script type="text/javascript" src="/jquery-validation/jquery.validate.min.js">script>
    <script type="text/javascript" src="/jquery-validation/localization/messages_zh.min.js">script>
    
    <script type="text/javascript" src="/layer/layer.js">script>
    
    <script type="text/javascript" src="/js/md5.min.js">script>
    
    <script type="text/javascript" src="/js/common.js">script>
head>
<body>

<div class="panel panel-default">
    <div class="panel-heading">秒杀商品详情div>
    <div class="panel-body">
        <span id="userTip"> 您还没有登录,请登陆后再操作<br/>span>
    div>
    <table class="table" id="goodslist">
        <tr>
            <td>商品名称td>
            <td colspan="3" id="goodsName">td>
        tr>
        <tr>
            <td>商品图片td>
            <td colspan="3"><img  id="goodsImg" width="200" height="200" />td>
        tr>
        <tr>
            <td>秒杀开始时间td>
            <td id="startTime">td>
            <td >
                <input type="hidden" id="remainSeconds" />
                <span id="miaoshaTip">span>
            td>
            <td>
                <div class="row">
                    <div class="form-inline">
                        <img id="verifyCodeImg" width="80" height="32"  style="display:none" onclick="refreshVerifyCode()"/>
                        <input id="verifyCode"  class="form-control" style="display:none"/>
                        

你可能感兴趣的:(SpringBoot,SpringBoot实战,Java框架)