目的
前端做了两套页面,一套PC ,一套手机,我想通过程序控制返回的页面,而Controller不需要关心终端,只需要render固定的字符串。
思路方法
拦截器拦截到render,然后修改viewpath
实现
关键代码
/***系统常量类*/public class AppConst { public static Routes SYSTEM_ROUTES = null ;}/***系统配置文件*/public class CmsConfig extends JFinalConfig { public void configConstant(Constants constants) { ConfigUtil.loadConfig(loadPropertyFile("application-test.properties", "application.properties", Const.DEFAULT_ENCODING)); constants.setBaseViewPath("/WEB-INF/page"); } public void configInterceptor(Interceptors interceptors) { interceptors.add(new RenderSwitchInterceptor()); }}/***路由配置*/public class WebRoute extends Routes { @Override public void config() { add("/web/product",WebProductCtrl.class,"web/product"); }}/** * PC 与手机 页面自动切换 关键代码 * Created by YangTao on 2015-8-31. */public class RenderSwitchInterceptor implements Interceptor { @Override public void intercept(Invocation ai) { Controller c = ai.getController(); ai.invoke(); //一定要注意,把处理放在invoke之后,因为放在之前的话,是会空指针的,不信你试 //一定要注意,把处理放在invoke之后,因为放在之前的话,是会空指针的,不信你试 //一定要注意,把处理放在invoke之后,因为放在之前的话,是会空指针的,不信你试 Render render = c.getRender(); String returnPath = render.getView(); // ctrl中render的字符串 String viewPath = ""; if (!returnPath.startsWith("/")){ // 如果不是以/开头,则说明不是页面的完整路径 viewPath = AppConst.SYSTEM_ROUTES.getViewPath(ai.getControllerKey()); } if (isMobile(c.getRequest())){ //手机 viewPath = viewPath.replace("/web/","/wap/"); } render.setView(viewPath+returnPath); } } update:修改代码结构、加注释