2018-05-22 11:51
缓存的使用,粒度可粗可细,成本可高可低,需要视不同的场景选择最划算的方案
我这里简要说一个简单有效的方案:
1:对于 bean/model,使用 cache.put(id, bean) 的方式来缓存
2:在 Service 层添加 XxxService.get(List idList) 以及 get(Integer id) 的业务方法,该方法自动处理缓存的问题,外界通过 id 号就可以透明化地获取到 model/bean ,完全无需在关心 cache
3:对于 List beanList 这类列表,里头的 bean/model 只放 id 号,也就是一个 List idList
4:任何对于列表的查询,都只返回 select id,返回数据以后,再通过 XxxService.get(List idList) 获取数据
这样做的主要好处是,避免了各处分别缓存 model/bean 后需要数据同步的问题,也就是说 bean/model 只在内存中缓存一份来共享,更新缓存只需要更新一处
当然,还有别的一些好处,大家可以多多思考一下
2018-05-21 09:45
还想到一个办法,大致如下:
1:创建 public class MyRequest extends HttpServletRequest
2:MyRequest 通过构造方法,将原 request 传入
public MyRequest(HttpServletRequest request) {
this.request = request;
}
3:在 MyRequest 中覆盖掉父类的 getWriter()、getOutputStream(),将这两个方法的返回值替换成自己希望输出的目的地,例如:
public Writer getWriter() {
// 这个 MyWriter 是你定制的写入到的一个目的地,用于接收生成的结果
new MyWriter(super.getWriter());
}
4:除了 getWriter()、getOutputStream() 以外,其它方法者转调 request 对象中的方法,例如:
public String getParameter(String name) {
return this.request.getParameter(name);
}
通过上面的方式,相当于通过包装 HttpServletRequest request 的方式,将输出目的地重定向到了你自己想要的地方
2018-05-21 09:36
@timzh 其它模板引擎都好处理,只需要将输出改变一下即可,唯独 jsp 不好处理,因为 jsp 的使用是下面这样的:
request.getRequestDispatcher(view).forward(request, response);
解决这个需求,需要替换引擎的输出,例如 OuputStream Writer,而 jsp 的这两个东东恰好在 jsp 被编译成的 class 文件中
这个 class 文件是被 jsp 被编译而成,没有 java 源代码,所以只能去修改 jsp 编译器的代码
2018-05-21 09:06
@李若谷 不仅功能强大,学习成本极低,而且性能极高,这里有性能测试:
https://www.oschina.net/news/90815/jfinal-3-3
这里有专用于 enjoy 性能测试的项目,自己可以在本地与 Thymeleaf 再测试一下:
https://gitee.com/jfinal/enjoy-performance