SpringBoot+Thymeleaf, 頁面上嵌入groovy的demo

SpringBoot+Thymeleaf, 頁面上嵌入groovy的demo


Flag Counter

說明

因爲項目中使用到了groovy做一個比較輕量級的前端公式腳本,所以閒來無事也自己做了一個。

groovy和java整合的方式有三種

  • GroovyClassLoader
  • ScriptEngine
  • GroovyShell

這個可以大家自行百度, 我這裏用的第三種

代碼

依賴

在SpringBoot的基礎上, 加入下面兩個依賴. thymeleaf 主要是前端模板要用.

放在resources/templates文件夾下


<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
 <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.5.6</version>
            <type>pom</type>
        </dependency>

前端頁面

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>在線運行groovy</title>
    <style type="text/css">
        input {
            height: 30px;
        }

        td {
            padding: 0px;
        }

        table {
            border-collapse: separate;
            border-spacing: 20px;
            width: 300px;
            line-height: 22px;
            font-size: 12px;
        }
    </style>
</head>
<body>
<div align="center">
    <H2>在線運行groovy</H2>
    <div style="padding:0 20px;">
        <form th:action="@{/groovy}" th:object="${groovyDto}" method="post">
            <table>
                <tr>
                    <td>參數</td>
                    <td><input type="text" name="params" th:field="*{params}"></td>
                </tr>
                <tr>
                    <td>代碼</td>
                    <td><textarea name="code" th:field="*{code}"></textarea></td>
                </tr>
                <tr>
                    <td>結果</td>
                    <td><textarea name="result" th:field="*{result}"></textarea></td>
                </tr>
                <tr >
                    <td colspan="2" align="center">
                        <input type="submit" value="提交" >
                    </td>

                </tr>
            </table>
        </form>
    </div>
</div>
</body>
</html>

Controller

package com.zgd.demo.web.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.zgd.demo.web.dto.GroovyDto;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

/**
 * GroovyController
 *
 * @author zgd
 * @date 2020/6/23 12:04
 */
@Controller
@Slf4j
public class GroovyController {


  @PostMapping("/groovy")
  public String groovy(@ModelAttribute GroovyDto groovyDto, Model model){
    log.info("提交了groovy: {}",groovyDto);
    String params = groovyDto.getParams();
    String[] paramArr;
    if (StrUtil.isNotBlank(params)){
      paramArr = params.split(",");
    }else {
      paramArr = new String[]{};
    }

    Object evaluate = byGroovyShell(groovyDto, paramArr);

    groovyDto.setResult(ObjectUtil.defaultIfNull(evaluate,"").toString());
    model.addAttribute("groovyDto",groovyDto);
    return "groovy";
  }

  private Object byGroovyShell(@ModelAttribute GroovyDto groovyDto, String[] paramArr) {
    Binding binding = new Binding(paramArr);
    GroovyShell shell = new GroovyShell(binding);
    return shell.evaluate(groovyDto.getCode());
  }


  @GetMapping("/groovy")
  public String groovy(Model model){
	  //這裏必須設置屬性groovyDto, 否則頁面渲染會報錯
    model.addAttribute("groovyDto",new GroovyDto());
    return "groovy";
  }
}

dto

package com.zgd.demo.web.dto;

import lombok.Data;
import lombok.ToString;

/**
 * GroovyDto
 *
 * @author zgd
 * @date 2020/6/23 12:07
 */
@Data
@ToString
public class GroovyDto {

  private String params;

  private String result;

  private String code;

}

試用

直接啓動SpringBoot, 訪問 localhost:8080/groovy
在這裏插入圖片描述

這裏直接試下調用groovy腳本.

無參

在這裏插入圖片描述

有參

在這裏插入圖片描述

可以直接用groovy請求一些簡單restful接口, 獲取值直接展示, 或者在此基礎上添磚加瓦吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章