页面静态化实现(springBoot)

本文介绍了Thymeleaf作为模板引擎实现静态化页面的详细步骤,包括设置模板解析器、上下文和模板引擎。通过在Spring Boot中配置Thymeleaf并结合文件服务,实现了页面数据的动态生成与静态化。同时,利用RabbitMQ监听消息,实现在商品信息修改或删除时自动更新静态页面,确保页面内容与数据库同步。
摘要由CSDN通过智能技术生成

常用的模板引擎:
  • ​ Freemarker

  • ​ Velocity

  • ​ Thymeleaf

Thymeleaf实现静态化用法
  • Context:运行上下文 (保存数据)
  • TemplateResolver:模板解析器(用来读取模板相关的配置,例如:模板存放的位置信息,模板文件名称,模板文件的类型等等)
  • TemplateEngine:模板引擎 (模板)

templateEngine.process(“模板名”, context(数据), writer(输出目的地的流));

Thymeleaf具体用法
  1. 在application中添加配置
ly:
thymeleaf:
 destPath: D:/nginx-1.14.2/html/item  #本地的静态文件保存地址  真实情况下地址在liunx文件夹下 
  1. 在resources–》templates–>引入静态文件
    在这里插入图片描述
  2. 编写代码
    我的controller
	@Autowired   //正常实现类  
    private GoodsServiceImpl goodsService;
    @Autowired  //静态页面生成类
    private FileService fileService;
    @GetMapping(value = "{id}.html",produces = "text/html")
    public String toItemPage(HttpServletRequest request, HttpServletResponse response, Model model, @PathVariable("id")Long id) throws InterruptedException, ExecutionException {
        //加载数据   调用实现类  返回map形式的数据  
        Map<String, Object> modelMap = this.goodsService.loadModel(id);
        //把数据放入模型中  在前端页面直接用
        model.addAllAttributes(modelMap);
        //页面静态化   
        if(!fileService.exists(id)){//判断D:/nginx-1.14.2/html/item/11.html 有没有这个文件
            //当没有这个文件的时候  就创建这个静态文件118.html
            this.fileService.syncCreateHtml(id);
        }
        return "item";
    }

我的实现类(fileService) 创建静态页面

@Service
public class FileService {
    @Autowired
    private GoodsServiceImpl pageService;
    @Autowired  //注入模板类
    private TemplateEngine templateEngine;
    
    @Value("${ly.thymeleaf.destPath}")  //注入配置文件的值
    private String destPath;//D:/nginx-1.14.2/html/item/

    public boolean exists(Long spuId) {//118
        File file = new File(destPath);
        if(!file.exists()){
            file.mkdirs();//如果不存在D:/nginx-1.14.2/html/item/ 文件夹,就创建
        }
        File f=new File(file,spuId+".html");//D:/nginx1.14.2/html/item/118.html
        return f.exists();//   判断这个文件夹下有没有这个文件 返回false
    }

    public void syncCreateHtml(Long spuId) {
        createHtml(spuId);
    }

    //创建静态的spuid.html 118.html
    public void createHtml(Long spuId)   {
        //创建上下文
        Context context = new Context();
        //调用loadModel方法  获取页面所需要的数据 并将数据放入上下文中
        context.setVariables(pageService.loadModel(spuId));
		
        File file = new File(destPath, spuId + ".html");
        try {
            //准备输出流
            PrintWriter printWriter = new PrintWriter(file, "utf-8");
            //输出文件   页面名   数据    输出流  把这个文件输出到指定地方
            templateEngine.process("item",context,printWriter);
        } catch (FileNotFoundException e) {e.printStackTrace();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

生成静态页面的重点方法:
context.setVariables()将数据放进去
templateEngine.process("文件名”,context,输出目的地的流)

  1. 配置 nginx代理静态页面
    • 将生成的静态文件手动拷贝到 nginx/html/item文件夹下
    • 配置nginx.conf文件
      listen       80;
      server_name  www.leyou.com(项目访问地址);
      
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      location /item {  # 配置转发  当地址带/item  就转发到这个路径
          # 先找本地
          root html;  
          if (!-f $request_filename) { #请求的文件不存在,就反向代理
             proxy_pass http://192.168.228.100:8084;  # 我的项目路径
             break;
          }
       }
      location / { #我的前端路径
           proxy_pass http://192.168.228.100:9002;
           proxy_connect_timeout 600;
           proxy_read_timeout 600;
      }
      

}
```

静态页面创建完成
前:
在这里插入图片描述
配置后:
在这里插入图片描述

使用rabbitmq实现修改 删除静态页面
  1. 导包
//rabbitmq导包
	<dependency>
   		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-starter-amqp</artifactId>
   	</dependency>
  1. 在application中配置redis地址
    spring:
      rabbitmq:
        username: leyou  #账号姓名
        password: leyou #账号密码
        virtual-host: /leyou  #虚拟主机
        host: 192.168.228.100  #redis所在虚拟机地址
    
  2. 在实现层 添加消息发送者 当用户更改或者删除时去调用这个方法
   /**
     *
     * 发送消息的方法,id就是spuId,type就是操作类型(增删改查)
     * @param id
     * @param type
     */
    private void sendMessage(String type,Long id) {
        // 发送消息  就是消息类型和id
        try {
            this.amqpTemplate.convertAndSend("item." + type, id);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  1. 编写监听器 当交换器中有消息时 对应的方法就会执行
@Component
public class GoodsListener {

    @Autowired
    private FileService fileService;
//增加和修改的方法放一起  修改就是重新生成一个同名的Html  会自动覆盖
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "ly.create.page.queue", durable = "true"),
            exchange = @Exchange(
                    value = "ly.item.exchange", 
                    type = ExchangeTypes.TOPIC),
            key = {"item.insert", "item.update"}))
    public void listenCreate(Long id) throws Exception {
        if (id == null) {
            return;
        }
        // 创建页面
        fileService.createHtml(id);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "ly.delete.page.queue", durable = "true"),
            exchange = @Exchange(
                    value = "ly.item.exchange", 
                    type = ExchangeTypes.TOPIC),
            key = "item.delete"))
    public void listenDelete(Long id) {
        if (id == null) {
            return;
        }
        // 删除页面
        fileService.deleteHtml(id);
    }
}
  1. 在FileService中添加 删除的静态页面的方法
 public void deleteHtml(Long id) {
       File file = new File(destPath, id + ".html");
       file.deleteOnExit();
   }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值