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 内置对象使用
示例如下:
// 输出html示例
//html为内置对象,用于封装xml和html输出
html.html { // html is implicitly bound to new MarkupBuilder(out)
head {
title('Groovy Servlet')
}
body {
p("Hello, ${request.remoteHost}: ${new Date()}")
}
}
运行结果:
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>
"""
运行结果:
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
}
运行结果:
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()}"
}
}
运行结果: