(1)pipeline配置
<when>
<!-- 创建JSON,无模板,无layout。 -->
<pl-conditions:target-extension-condition extension="json" />
<pl-valves:performScreen />
<pl-valves:renderResultAsJson />
</when>
(2)screen代码
public class SayHello2 {
/** 英文 */
public Hello doEnglish() {
return new Hello("English", "Hello");
}
/** 中文 */
public Hello doChinese() {
return new Hello("Chinese", "你好");
}
public static class Hello {
private String language;
private String howToSay;
public Hello(String language, String howToSay) {
this.language = language;
this.howToSay = howToSay;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getHowToSay() {
return howToSay;
}
public void setHowToSay(String howToSay) {
this.howToSay = howToSay;
}
}
}
(3)原理
与普通的servlet返回json一样,先设置contentType="application/json",再写入response即可
在RenderResultJson中:
public void invoke(PipelineContext pipelineContext) throws Exception {
TurbineRunData rundata = getTurbineRunData(request);
if (!rundata.isRedirected()) {
Object resultObject = consumeInputValue(pipelineContext); //取出返回值
if (resultObject == null) {
return;
}
String javascriptVariable = getJavascriptVariable();
boolean outputAsJson = javascriptVariable == null;
if (outputAsJson) {
// output as json
response.setContentType(getContentType()); //设置contentType='application/json'
} else {
// output as javascript
response.setContentType(getJavascriptContentType());
}
PrintWriter out = response.getWriter();
String jsonResult = JSON.toJSONString(resultObject); //序列化
if (outputAsJson) {
out.print(jsonResult); //写入response
} else {
out.print("var ");
out.print(javascriptVariable);
out.print(" = ");
out.print(jsonResult);
out.print(";");
}
}
pipelineContext.invokeNext();
}