說明
因爲項目中使用到了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接口, 獲取值直接展示, 或者在此基礎上添磚加瓦吧