package org.nutz.mvc.view; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.nutz.lang.Lang; import org.nutz.mvc.View; /** * 返回特定的响应码 * <p/> * <b>注意,400或以上,会调用resp.sendError,而非resp.setStatus.这样做的原因是 * errorPage的配置,只有resp.sendError会触发,且绝大多数情况下,只会配置400或以上</b> * * @author MingMing * */ public class HttpStatusView implements View { public static final View HTTP_404 = new HttpStatusView(404); // public static final View HTTP_400 = new HttpStatusView(400); public static final View HTTP_500 = new HttpStatusView(500); public static final View HTTP_502 = new HttpStatusView(502); /** * 这个异常用于,在某个入口函数,如果你声明了 `@Fail("http:500")` 但是你真正的返回值想根据运行时决定。 <br> * 那么,你就直接抛这个异常好了 * * @author zozoh(zozohtnt@gmail.com) */ public static class HttpStatusException extends RuntimeException { private static final long serialVersionUID = 4035188583429445028L; private int status; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public HttpStatusException(int status) { this.status = status; } public HttpStatusException(int status, String fmt, Object... args) { super(String.format(fmt, args)); this.status = status; } } private int statusCode; public HttpStatusView(int statusCode) { this.statusCode = statusCode; } public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) { int code = this.statusCode; if (obj != null && obj instanceof HttpStatusException) { code = ((HttpStatusException) obj).getStatus(); } if (code >= 400) try { resp.sendError(code); } catch (IOException e) { throw Lang.wrapThrow(e); } else resp.setStatus(code); } }