package org.nutz.mvc.impl.processor; import javax.servlet.http.HttpServletRequest; import org.nutz.lang.Lang; import org.nutz.lang.Strings; import org.nutz.lang.util.Context; import org.nutz.log.Log; import org.nutz.log.Logs; import org.nutz.mvc.ActionContext; import org.nutz.mvc.ActionInfo; import org.nutz.mvc.NutConfig; import org.nutz.mvc.View; import org.nutz.mvc.ViewMaker; import org.nutz.mvc.ViewMaker2; import org.nutz.mvc.view.ViewWrapper; import org.nutz.mvc.view.VoidView; public class ViewProcessor extends AbstractProcessor { protected View view; public static final String DEFAULT_ATTRIBUTE = "obj"; private static final Log log = Logs.get(); @Override public void init(NutConfig config, ActionInfo ai) throws Throwable { //需要特别提醒一下使用jsonView,但方法的返回值是String的!! if("json".equals(ai.getOkView()) && String.class.equals(ai.getMethod().getReturnType())) { log.warn("Not a good idea : Return String ,and using JsonView!! (Using @Ok(\"raw\") or return map/list/pojo)--> " + Lang.simpleMetodDesc(ai.getMethod())); } view = evalView(config, ai, ai.getOkView()); } public void process(ActionContext ac) throws Throwable { Object re = ac.getMethodReturn(); Object err = ac.getError(); if (re != null && re instanceof View) { if (re instanceof ViewWrapper) putRequestAttribute(ac.getRequest(), ((ViewWrapper)re).getData()); ((View) re).render(ac.getRequest(), ac.getResponse(), err); } else { putRequestAttribute(ac.getRequest(), null == re ? err : re); view.render(ac.getRequest(), ac.getResponse(), null == re ? err : re); } doNext(ac); } /** * 保存对象到attribute */ public static void putRequestAttribute(HttpServletRequest req, Object re){ if (null != re){ if(re instanceof Context){ Context context = (Context) re; for(String key : context.keys()){ req.setAttribute(key, context.get(key)); } } else { req.setAttribute(ViewProcessor.DEFAULT_ATTRIBUTE, re); } } } public static View evalView(NutConfig config, ActionInfo ai, String viewType) { if (Strings.isBlank(viewType)) return new VoidView(); String str = viewType; int pos = str.indexOf(':'); String type, value; if (pos > 0) { type = Strings.trim(str.substring(0, pos).toLowerCase()); value = Strings.trim(pos >= (str.length() - 1) ? null : str.substring(pos + 1)); } else { type = str; value = null; } for (ViewMaker maker : ai.getViewMakers()) { if (maker instanceof ViewMaker2) { View view = ((ViewMaker2)maker).make(config, ai, type, value); if (view != null) return view; } View view = maker.make(config.getIoc(), type, value); if (null != view) return view; } throw Lang.makeThrow("Can not eval %s(\"%s\") View for %s", viewType, str, ai.getMethod()); } }