§Result/ResultHandler
Result 是 action 方法的返回值。 action 方法返回值可以是任意类型,每一种 Result 类型将会有一个对应的 ResultHandler 来负责处理相应的 Result 对象。
§1. 内置的 Result/ResultHandler
jetbrick 已经内置了多种 Result/ResultHandler 处理器:
String
: 负责处理模板 ViewHttpStatus
: 响应一个 HTTP StatusRawText
: 自定义文本输出RawData
: 自定义二进制输出RawDownload
: 文件下载JSONAware/JSONObject/JSONArray
: JSON 输出 (fastjson 库)JsonElement
: JSON 输出 (Gson 库)org.w3c.dom.Document
: XML 输出JAXBElement<?>
: JAXB XML 输出void
: 无 Response 输出。
我们将分别介绍不同的 Result 的使用方法。
§1.1 String
String Result 是专门用来处理模板 View 的,同时也能处理 forward 和 redirect 的情况。
@Action
public String list() {
// 将会显示 JSP 页面
return "list.jsp";
}
@Action
public String login() {
// 将会 redirect 到 /login
return "redirect:/login";
}
当我们使用 String 作为 Result 的时候,我们实际是由 View/ViewHandler 这一对兄弟来处理对应的 View。具体可以参考 View/ViewHandler
§1.2 HttpStatus
生成一个 HTTP Response 响应。
@Action
public HttpStatus notfound() {
// 将会返回一个 404 (Page not found)
return HttpStatus.SC_NOT_FOUND;
}
§1.3 RawText
提供自定义文本输出
@Action
public RawText text() {
return RawText.text("这是纯文本");
}
@Action
public RawText js() {
return RawText.js("data=[1,2,3];");
}
§1.4 RawData
提供自定义二进制输出
@Action
public RawData image() {
return new RawData(new File("/tmp/123.gif"), "image/gif");
}
§1.5 RawDownload
提供文件下载功能
@Action
public RawDownload download() {
return new RawDownload(new File("/tmp/123.doc"), "中文文件名.doc");
}
§1.6 JSONAware/JSONObject/JSONArray
使用 fastjson 库来生成一个 json 输出。(自动支持 jsonp 调用)
需要加入依赖:
<dependency>
<groupId>com.github.subchen</groupId>
<artifactId>jetbrick-webmvc-fastjson</artifactId>
<version>2.1</version>
</dependency>
范例代码如下:
@Action
public JSONAware list() {
JSONAware json = new JSONObject();
json.put("list", ...);
...
return json;
}
§1.7 JsonElement
使用 gson 库来生成一个 json 输出。(自动支持 jsonp 调用)
需要加入依赖:
<dependency>
<groupId>com.github.subchen</groupId>
<artifactId>jetbrick-webmvc-gson</artifactId>
<version>2.1</version>
</dependency>
范例代码如下:
@Action(value="data.json")
public GsonElement list() {
JsonObject json = new JsonObject();
json.add("list", ...);
...
return json;
}
§1.8 org.w3c.dom.Document
输出一个 XML Document
@Action(value="data.xml")
public Document getXml() {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
//
Element root = doc.createElement("root");
doc.appendChild(root);
...
//
return doc;
}
§1.9 JAXBElement
输出一个 JAXB XML Document
@Action(value="data.xml")
public JAXBElement<Users> getXml() {
Users users = new Users();
User user = new User();
user.setId("1");
user.setName("张三");
users.setUsers(Arrays.asList(user));
return new JAXBElement<Users>(new QName("users"), Users.class, users);
}
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="users")
public class Users {
@XmlElement(name="user")
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="user")
public class User {
@XmlElement
private String id;
@XmlElement
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
§1.10 void
不进行任何输出操作(可能用户自己会进行一些自定义的输出)
@Action
public void action() {
...
}
§2. 自定义 Result/ResultHandler
jetbrick 允许用户定义自己的 Result 和 ResultHandler。
§2.1 自定义 Result
新建一个普通的 Java 对象: MyResult
@ManagedWith(MyResultHandler.class)
public class MyResult {
...
}
提示: 需要使用
@ManagedWith(...)
标注,参数是对应的 ResultHandler 类。
§2.2 自定义 ResultHandler
新建一个 MyResultHandler
类来处理 MyResult
@Managed(MyResult.class)
public class MyResultHandler implements ResultHandler<MyResult> {
@Override
public void handle(RequestContext ctx, MyResult result) throws Throwable {
...
}
}
提示:
1. 需要实现jetbrick.web.mvc.result.ResultHandler
接口
2. 需要使用@Managed(...)
标注,参数是 Result 类。如果省略参数,那么将自动从 ResultHandler 接口的泛型参数中获取。
§3. 使用系统/第三方自带的 Result 类
如果你的 Result
类是系统自带的,或者第三方提供的,无法增加 @ManagedWith(...)
注解,那么也没关系。
我们可以直接定义对应的 ResultHandler
。然后将自定义的 ResultHandler
所在的 package 加入的 jetbrick 自动扫描路径下(由 web.scan.packages
配置),然后 jetbrick 就会在启动的时候,自动发现所有的 ResultHandler
,并且将其和 Result
关联起来。
我们真心的希望大家扩展自己的 Result/ResultHandler,然后共享出来,让 jetbrick 可以为更多的用户服务。