Summercool+mybatis框架解决方案
Summercool框架
基于SpringMVC框架的summercool的特点
1) Spring MVC是基于Servlet实现的请求处理器,而Summercool框架将其改成为基于Filter实现(好处就不多说了,大家都懂的;只是提一下,Servlet是请求生命周期的结束,而Filter则不是请求生命周期的结点)
2) Spring MVC在一些特殊处理上处理的也不是非常的理想,定制化也不是完全可以扩展的;如下几点描述:
a) xml配置文件的缺省加载
1. 如果我们要是想加载一个或多个Spring的xml配置文件,那么我们要用
2. 在Summercool中只要将Spring的xml配置文件,放在classpath下面的\文件夹下面,应用 启动的时候,Summercool框架会自动扫描classpath下面的\文件夹中的xml配置文件。
3. 多个jar包里面\文件夹下面的xml配置文件,框架也会自动加载
b) 约定胜于配置
1. Spring MVC其实已经有约定胜于配置了,但是还是不我们想要的那种理想型的
2. /index.htm --> /IndexController.java /user/user_manager.htm --> /user/UserManagerController.java
上面才是我们的理想型的约定胜于配置的方式
c) 页面模块化和页面函数自定义
Summercool框架中的内置函数,写法如下: Html代码
${widget(\
内容体!
${widget(\
说明:上面的页面中,我们可以看出${widget()}函数,不需要页面的扩展名
1. ${widget(\的加载过程,--> /HeaderWidget.java --> /header.ftl
2. 如果/HeaderWidget.java不存在,则 --> /header.ftl 3. 这样,我们就可以把一个公共页面的处理类的逻辑,写在/HeaderWdiget.java里面;如:显示登录名称
d) 自定义URL模版
1. 一个应用中,经常会自定义一些特别的url地址,而非约定胜于配置而自动映射的地址
2. http://localhost:8080/item/#id#.html --> http://localhost:8080/item/12345.html
3. 上面的URL地址,是我们自定义的一个URL地址,1) 我们一般的期望是上面的地址规则可以配置,并且变量可以跟据一定规则替换;2) 我们还期望有一个对应处理该地址的Controller处理类,并且可以自动提取出规则地址中的变量,如#id#
e) f) g) h) i)
Cookies的自动加密和解密实现 基于Cookies的免登录实现 全局统一处理的权限实现
全局统一处理的图片自动缩放处理实现(包括cache) 多语言模版的实现(Spring MVC和Freemarker自带)
j) 多主题的实现(Spring MVC自带)
Summercool请求处理流程图
说明:
1. Summercool相比较于Spring MVC多了AroundPipeline、PreProcessPipeline、PostpRrocessPipeline和ExceptionPipeline这些元素。 2. 处理流程的一个细节也调整了一下,具体如下:
1) request --> /index.htm --> /IndexController.java --> /index.ftl
如果Spring MVC在没有/IndexController.java这个处理类的话,会自动返回NotFound;不会渲染/index.ftl
2) Summercool框架改造成:request --> /index.htm --> [/indexController.java] --> [/index.ftl]
如果没有/IndexController.java这个处理类,那么Summercool会自动查找/index.ftl页面
3) 上面的这个特性非常有用,因为有些动态页面(如帮助页面)是不需要Controller处理的,但是却包括一些动态信息
Summercool框架的相关说明
AroundPipeline接口说明
1) 因为Summercool框架是基于Filter实现的,所以AroundPipeline会过滤所
有的请求,因为AroundPipeline笔者也是跟据Filter的模式进行调用的 2) PriorityOrdered接口是一个顺序接口,这样可以指定一个AroundPipeline
的执行顺序
3) 这个类的主要应用场景是,可以对监控所有请求的执行时间,日志打点和定
制相关图片压缩功能
4) 该类的相关功能演示,详见如下代码:
publicclassRequestMonitorimplementsAroundPipeline {
privatestaticfinal String N_CHAR = \;
privatefinal Logger logger =
LoggerFactory.getLogger(RequestMonitor.class);
privateintorder;
privateUrlPathHelperurlPathHelper = newUrlPathHelper();
privateNumberStatisticUtilnumberStatisticUtil = newNumberStatisticUtil();
publicRequestMonitor() {
numberStatisticUtil.setInterval(N_CHAR, 1000L); urlPathHelper.setUrlDecode(false); }
publicvoidhandleAroundInternal(HttpServletRequestrequest, HttpServletResponseresponse,
AroundPipelineChainaroundPipelineChain) throws Exception { //
if (!logger.isDebugEnabled()) {
aroundPipelineChain.handleAroundInternal(request, response,
aroundPipelineChain); return; } //
longbeginTime = System.currentTimeMillis(); //
numberStatisticUtil.incrementAndGet(N_CHAR);
longthreadCount = numberStatisticUtil.getValue(N_CHAR); // try
{
aroundPipelineChain.handleAroundInternal(request, response,
aroundPipelineChain); } finally {
if (logger.isInfoEnabled()) {
String url =
urlPathHelper.getLookupPathForRequest(request); longendTime = System.currentTimeMillis(); SimpleDateFormatsdf = newSimpleDateFormat(