WEB 内置对象

接口内置对象:

变量名 绑定 备注
request ServletRequest -
response ServletResponse -
context ServletContext -
application ServletContext -
session getSession(false) 可以是 null
params Map 对象
headers Map对象
forward RequestDispatcher.forward(request, response) RequestDispatcher dispatcher = request.getRequestDispatcher(path);
include RequestDispatcher.include(request, response) RequestDispatcher dispatcher = request.getRequestDispatcher(path);
redirect HttpServletResponse.sendRedirect(location) String location
out response.getWriter()
sout response.getOutputStream()
print/println response.getWriter() 可代替 out ,sout对象
html new MarkupBuilder(out)
json new StreamingJsonBuilder(out)
bodyJsonStr request.getReader(); post 方式获取请求body体
fun FunctionInvoke 用与调用本地函数

html 内置对象使用

示例如下:

  1. // 输出html示例
  2. //html为内置对象,用于封装xml和html输出
  3. html.html { // html is implicitly bound to new MarkupBuilder(out)
  4. head {
  5. title('Groovy Servlet')
  6. }
  7. body {
  8. p("Hello, ${request.remoteHost}: ${new Date()}")
  9. }
  10. }

运行结果:
image.png

JSON 内置对象使用

示例如下:

def result = [:]

result.str = "Hello 11111"
result.success = true 
result.code = 200
result.array = ["hello " , "word"]
//list
def list = []
list << "1"
list << 2
list << true

class Person implements Serializable{
    def id;
    String name;
    def age;
}

Person p = new Person(name:'Bob', age:76,id:"1")

//json为内置对象,可以用于JSON封装输出
json result,list,p

运行结果:

[{"str":"Hello 11111","success":true,"code":200,"array":["hello ","word"]},["1",2,true],{"id":"1","age":76,"name":"Bob"}]

output 打印输出使用

示例如下:

// 输出一个html 字符串

println """
<html>
    <head>
        <title>Groovy Servlet</title>
    </head>
    <body>
        <p>
Hello, ${request.remoteHost}: ${new Date()} ${  ((Math.random()*9+1)*100000) as int }
        </p>
        <a href="http://129.204.207.148:20001/example/web/excelExport">
            <button>Excel</button>
        </a>
    </body>
</html>
"""

运行结果:
image.png

params 内置对象使用

params为内置对象,类型是map,将请求的传值封装到params中:
示例如下:

// 参数控制
//调用传参如下:
//?method=outjson&name=Bse&age=36&id=1&dataJson={"records":{"car":{"name":"HSV Maloo","make":"Holden","year":2006,"country":"Australia","record":{"type":"speed","description":"production pickup truck with speed of 271kph"}}}}

//params为内置对象,类型是map,将请求的传值封装到params中
println params
println "==============================="

//根据传参调用对应的方法,示例中method=outjson,将调用outjson方法
if(params["method"]){
    if(this.metaClass.methods.name.contains(params["method"])){
      "$params.method"();
    }else {
      json{ Error "无效请求,请传入合法调用方法!"};
    }
}else{
    json{ Error "无效请求,请传入调用方法!"};
}

def outjson(){
    println params.dataJson
}

def testBody(){
    //如果body传值的话,会增加内置对象bodyJsonStr
     println bodyJsonStr
}

调用示例:

import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

def post(String url, String json) throws IOException {
    RequestBody body = RequestBody.create(json, MediaType.get("application/json; charset=utf-8"));
    Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
    try (Response response = new OkHttpClient().newCall(request).execute()) {
      return response.body().string();
    }
}

def bowlingJson() {
    return '''
    {"records":{"car":{"name":"HSV Maloo","make":"Holden","year":2006,"country":"Australia","record":{"type":"speed","description":"production pickup truck with speed of 271kph"}}}}
    ''';
}


json {
    postData post("http://129.204.207.148:20001/example/web/parameter?method=testBody", bowlingJson())
}

运行结果:

{"postData":"[method:testBody]\n===============================\n    {\"records\":{\"car\":{\"name\":\"HSV Maloo\",\"make\":\"Holden\",\"year\":2006,\"country\":\"Australia\",\"record\":{\"type\":\"speed\",\"description\":\"production pickup truck with speed of 271kph\"}}}}    \n"}

upload 获取上传文件

示例如下:

//request是内置对象,文件上传接口中的request是引用spring中requestxxxxxx
def file = request.getFile("file");

json {
  fileName file.getOriginalFilename()
  contentType file.getContentType()
  size  file.getSize()
}

Excel 解析与生成

示例中使用的Excel解析与生成是基于第三方工具包EasyExcel,项目需要导入EasyExcel相关的jar包

excelRead Excel解析

示例如下:

import java.io.File;
import java.util.Map;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

def head = [:];
def dataList = [];
EasyExcel.read(new File("/opt/data/aop/icons.xlsx"),
    new AnalysisEventListener<Map<Integer, String>>() {
        @Override
        public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
            super.invokeHeadMap(headMap, context);
            head.putAll(headMap);
        }

        @Override
        public void invoke(Map<Integer, String> data, AnalysisContext context) {
            // context.readRowHolder().getRowIndex();
            // System.out.println(data);
            dataList << data
        }

        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            // System.out.println("end ");
        }
    }).sheet().doRead();

json {
    excelHead  head
    excelData  dataList
}

运行结果:
image.png

excelExport Excel导出

示例如下:

import java.io.File;
import java.util.Map;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

def head = [];
for ( i in 1..5 ) {
    head << ["Head" + i]
}

def dataList = [];

for ( i in 1..200 ) {
    dataList << ["Data1", "Data2", "Data3", "Data4", "Data5"]
}

try {
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    fileName = URLEncoder.encode("导出文件", "UTF-8").replaceAll("\\+", "%20");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
    EasyExcel.write(sout).head(head).sheet("sheet1").doWrite(dataList);
} catch (e) {
    json{
        code 500
        message "下载文件失败${e.getMessage()}"
    }
}

运行结果:
image.png