【注意】两个controller如何调用同一个方法,进行相同的数据处理,SetAtrr相同的内容

今天遇到一个情况:render到两个模板页面,但数据处理,setAttr的内容都相同,本来没有两个模板页面的时候,是直接写到controller进行setAttr的,可是想复用这个方法,那就在一个controller调用另一个controller?(重定向的话好像也不符合要求)

然后想了个错误的方法:

//错误的例子:
public class RepertoryController extends Controller {
	//报表
   public void index(){
	//把controller传过去service层,在service进行setAttr
	StayService.me.indexServer(this);
	render("/repertory.html");
   }
	
}

public class StaySteelController extends Controller {
	public void index() {
		StayService.me.indexServer(this);
		render("/staySteel.html");
	}
}

	//封装index缓存线程方法
public void indexServer(Controller controller){
      Map<String, Object> cacheMap = CacheKit.get("diskcache", "stock");
	if (cacheMap == null) {
		cacheMap = new HashMap<>();
		List<Stock> stockList = StayService.me.getAllStock(null);
		cacheMap.put("stockList", stockList);
		CacheKit.put("diskcache", "stock", cacheMap);
		controller.setAttr("cacheMap", cacheMap);
		logger.info("第一次启动 缓存");
		CacheKit.put("runThread", "runThread", "runThread");
	} else {
		controller.setAttr("cacheMap", cacheMap);
		// 5秒内访问,不进行刷新
		String cacheMapThread = CacheKit.get("runThread", "runThread");
		if (cacheMapThread == null) {
			getAllStockByThread();
			CacheKit.put("runThread", "runThread", "runThread");
			logger.info("启动 缓存刷新");
		}
	}
}


然而这种方式,虽然能实现需求,但是在“jfinal俱乐部”老大哥指出了种方式的问题:


微信截图_20180526111159.png

2.png

改成这样了:

public class StaySteelController extends Controller {
	public void index() {
		Ret ret = StayService.me.indexServer();
		setAttr("cacheMap", ret.get("cacheMap"));
		render("/staySteel.html");
	}
}	

public class RepertoryController extends Controller {

	//报表
	public void index(){
		Ret ret = StayService.me.indexServer();
		setAttr("cacheMap", ret.get("cacheMap"));
		render("/repertory.html");
	}
	
}	
	
	//返回Ret index缓存线程方法
public Ret indexServer(){
	Ret ret = new Ret();
	Map<String, Object> cacheMap = CacheKit.get("diskcache", "stock");
	if (cacheMap == null) {
		cacheMap = new HashMap<>();
		List<Stock> stockList = StayService.me.getAllStock(null);
		cacheMap.put("stockList", stockList);
		CacheKit.put("diskcache", "stock", cacheMap);
		ret.set("cacheMap", cacheMap);
		//controller.setAttr("cacheMap", cacheMap);
		logger.info("第一次启动 缓存");
		CacheKit.put("runThread", "runThread", "runThread");
	} else {
		ret.set("cacheMap", cacheMap);
		//controller.setAttr("cacheMap", cacheMap);
		// 5秒内访问,不进行刷新
		String cacheMapThread = CacheKit.get("runThread", "runThread");
		if (cacheMapThread == null) {
			getAllStockByThread();
			CacheKit.put("runThread", "runThread", "runThread");
			logger.info("启动 缓存刷新");
		}
	}
	return ret;
}


请指点。。。。

评论区

JFinal

2018-05-26 11:40

进步相当快,感谢你的分享

还有一个很重要的点,将 controller 传入 service 层,破坏了封装性, controller 调用方需要知道 service 层中传了什么值给 controller