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

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

然后想了个错误的方法:

  1. //错误的例子:
  2. public class RepertoryController extends Controller {
  3. //报表
  4.    public void index(){
  5. //把controller传过去service层,在service进行setAttr
  6. StayService.me.indexServer(this);
  7. render("/repertory.html");
  8.    }
  9. }
  10.  
  11. public class StaySteelController extends Controller {
  12. public void index() {
  13. StayService.me.indexServer(this);
  14. render("/staySteel.html");
  15. }
  16. }
  17.  
  18. //封装index缓存线程方法
  19. public void indexServer(Controller controller){
  20.       Map<String, Object> cacheMap = CacheKit.get("diskcache", "stock");
  21. if (cacheMap == null) {
  22. cacheMap = new HashMap<>();
  23. List<Stock> stockList = StayService.me.getAllStock(null);
  24. cacheMap.put("stockList", stockList);
  25. CacheKit.put("diskcache", "stock", cacheMap);
  26. controller.setAttr("cacheMap", cacheMap);
  27. logger.info("第一次启动 缓存");
  28. CacheKit.put("runThread", "runThread", "runThread");
  29. } else {
  30. controller.setAttr("cacheMap", cacheMap);
  31. // 5秒内访问,不进行刷新
  32. String cacheMapThread = CacheKit.get("runThread", "runThread");
  33. if (cacheMapThread == null) {
  34. getAllStockByThread();
  35. CacheKit.put("runThread", "runThread", "runThread");
  36. logger.info("启动 缓存刷新");
  37. }
  38. }
  39. }


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


微信截图_20180526111159.png

2.png

改成这样了:

  1. public class StaySteelController extends Controller {
  2. public void index() {
  3. Ret ret = StayService.me.indexServer();
  4. setAttr("cacheMap", ret.get("cacheMap"));
  5. render("/staySteel.html");
  6. }
  7. }
  8.  
  9. public class RepertoryController extends Controller {
  10.  
  11. //报表
  12. public void index(){
  13. Ret ret = StayService.me.indexServer();
  14. setAttr("cacheMap", ret.get("cacheMap"));
  15. render("/repertory.html");
  16. }
  17. }
  18. //返回Ret index缓存线程方法
  19. public Ret indexServer(){
  20. Ret ret = new Ret();
  21. Map<String, Object> cacheMap = CacheKit.get("diskcache", "stock");
  22. if (cacheMap == null) {
  23. cacheMap = new HashMap<>();
  24. List<Stock> stockList = StayService.me.getAllStock(null);
  25. cacheMap.put("stockList", stockList);
  26. CacheKit.put("diskcache", "stock", cacheMap);
  27. ret.set("cacheMap", cacheMap);
  28. //controller.setAttr("cacheMap", cacheMap);
  29. logger.info("第一次启动 缓存");
  30. CacheKit.put("runThread", "runThread", "runThread");
  31. } else {
  32. ret.set("cacheMap", cacheMap);
  33. //controller.setAttr("cacheMap", cacheMap);
  34. // 5秒内访问,不进行刷新
  35. String cacheMapThread = CacheKit.get("runThread", "runThread");
  36. if (cacheMapThread == null) {
  37. getAllStockByThread();
  38. CacheKit.put("runThread", "runThread", "runThread");
  39. logger.info("启动 缓存刷新");
  40. }
  41. }
  42. return ret;
  43. }


请指点。。。。

评论区

JFinal

2018-05-26 11:40

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

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

热门分享

扫码入社