Groovy 执行自定义脚本

2024-01-08  本文已影响0人  Tinyspot

1. 自定义脚本

1.1 页面

1.2 引入依赖

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>3.0.13</version>
    <type>pom</type>
</dependency>

2. 页面 script.html

@Controller
@RequestMapping("groovy")
public class GroovyController {

    @GetMapping(value = {"", "/script"})
    public ModelAndView script() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("attr", "value");
        modelAndView.setViewName("script.html");
        return modelAndView;
    }
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>script</title>

    <style type="text/css">
        .button {
            position: absolute;
            background-color: #0a0a23;
            color: #fff;
            border: none;
            width: 100px;
            border-radius: 2px;
            padding: 5px;
        }
        .button:focus {
            outline-color: transparent;
            outline-style: solid;
            box-shadow: 0 0 0 2px #333338;
        }
    </style>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<div class="tool_class">通用工具</div>

<form>
    <div class="form_class">
        <span class="span_class">执行脚本</span>
        <textarea id="script" style="resize:none; width: 500px;" rows="10"></textarea>
    </div>
    <div class="form_class">
        <span class="span_class">调用参数:</span>
        <textarea id="params" style="resize:none; width: 500px;" rows="6"></textarea>
    </div>
    <div class="form_class" id="submitDiv">
        <button id="btn_click" class="button" type="button">提交</button>
    </div>
</form>
<script>
    $().ready(function () {
        $("#btn_click").click(function () {
            $('#result').remove();

            var script = $("#script").val();
            script = script.replace(/\n/g, " ")
            var params = $("#params").val();

            $.ajax({
                type: "POST",
                url: "/groovy/execute",
                data: {
                    script: script,
                    params: params
                },
                async: true,
                dataType: "json",
                success: function (data) {
                    var startElement = $('#submitDiv');
                    var resultEle = '<div class="result" id="result"> <span class="span_class">执行结果:</span> ' +
                        '<textarea style="resize:none; width: 500px;" rows="10" >' + JSON.stringify(data, null, 4) + '</textarea></div>';
                    startElement.after(resultEle);
                }
            });

        });
    });
</script>
</body>
</html>

3. 执行脚本

@RestController
@RequestMapping("/groovy")
public class GroovyRunController {

    /**
     * @param params json串
     */
    @PostMapping("/execute")
    public JSONObject execute(String script, String params) {
        Class<?> clazz = GroovyUtil.parseClass(script);
        Object obj = GroovyUtil.runScript(clazz, SpringBeanUtils.getApplicationContext(), params);

        JSONObject result = new JSONObject();
        JSONObject response = new JSONObject();
        response.put("data", obj);
        response.put("success", "true");
        result.put("response", response);

        return result;
    }
}
public class GroovyUtil {

    public static Object runScript(Class<?> clazz, ApplicationContext applicationContext, String params) {
        Map<String, Object> groovyParams = new HashMap<>(6);
        groovyParams.put("context", applicationContext);
        groovyParams.put("data", params);

        try {
            GroovyObject instance = (GroovyObject) clazz.newInstance();
            Object result = instance.invokeMethod("execute", groovyParams);
            return result;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    public static Class<?> parseClass(String script) {
        GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
        Class<?> clazz = classLoader.parseClass(script);
        return clazz;
    }
}

脚本内容

package com.example.concrete.starter.third;

import com.alibaba.fastjson.JSON;
import com.example.concrete.common.domain.UserDTO;
import com.example.concrete.starter.service.GreetService;
import org.springframework.context.ApplicationContext;

import java.util.Map;

public class GreetScript {

    public String execute(Map<String, Object> contextMap) {
        ApplicationContext applicationContext = (ApplicationContext) contextMap.get("context");
        String jsonStr = (String) contextMap.get("data");
        UserDTO userDTO = JSON.parseObject(jsonStr, UserDTO.class);

        GreetService greetService = (GreetService) applicationContext.getBean("greetServiceImpl");
        return greetService.greeting(userDTO, "groovy-script");
    }
}
上一篇下一篇

猜你喜欢

热点阅读