首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

设计 REST 风格的 MVC 框架-5 渲染

设计 REST 风格的 MVC 框架-5 渲染

渲染由于我们没有强制 HTTP 处理方法的返回类型,因此,handleResult() 方法针对不同的返回值将做不同的处理。代码如清单 22 所示。
清单 22. 处理返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Dispatcher  {
    ...
    void handleResult(HttpServletRequest request, HttpServletResponse response,
            Object result) throws Exception {
        if (result==null)
            return;
        if (result instanceof Renderer) {
            Renderer r = (Renderer) result;
            r.render(this.servletContext, request, response);
            return;
        }
        if (result instanceof String) {
            String s = (String) result;
            if (s.startsWith("redirect:")) {
                response.sendRedirect(s.substring(9));
                return;
            }
            new TextRenderer(s).render(servletContext, request, response);
            return;
        }
        throw new ServletException("Cannot handle result with type '"
                + result.getClass().getName() + "'.");
    }
}




如果返回 null,则认为 HTTP 请求已处理完成,不做任何处理;如果返回 Renderer,则调用 Renderer 对象的 render() 方法渲染视图;如果返回 String,则根据前缀是否有“redirect:”判断是重定向还是作为 HTML 返回给浏览器。这样,客户端可以不必访问 HttpServletResponse 对象就可以非常方便地实现重定向。代码如清单 23 所示。
清单 23. 重定向
1
2
3
4
5
6
7
@Mapping("/register")
String register() {
    ...
    if (success)
        return "redirect:/reg/success";
    return "redirect:/reg/failed";
}




扩展 Renderer 还可以处理更多的格式,例如,向浏览器返回 JavaScript 代码等。
返回列表