简介:轻量封装Spring MVC
因为本人在国内最大的电子商务公司工作期间,深感一个好的Web框架可以大大提高工作效率,而一个不好的Web框架,又可以大大的降低开发效率。所以,在根据笔者在从事电子商务开发的这几年中,对各个应用场景而开发的一个轻量封装Spring MVC的一个Web框架。
笔者工作的这几年之中,总结并开发了如下几个框架: summercool-web(Web框架,已经应用于某国内大型网络公司的等重要应用)、summercool-hsf(基于Netty实现的RPC框架,已经应用国内某移动互联网公司)、summercool-ddl(基于Mybaits的分表分库框架,已经应用国内某移动互联网公司);相继缓存方案、和消息系统解决方案也会慢慢开源。Summercool框架做为笔者的第一个开源框架
框架地址:http://summercool.googlecode.com/svn/trunk/summercool-web
应用地址:http://summercool.googlecode.com/svn/trunk/summercool-petstore
工具地址:http://summercool.googlecode.com/svn/trunk/summercool-tools
说明:此框架要用到spring-tools文件夹中的security文件夹中的文件,使用此框架的人员请将security文件夹的内容替换到JDK中的security文件夹中
一、先让我们看一下Spring MVC的AbstractController和SimpleFormController的处理流程图
为什么作者在这里要先查介绍这两个处理器呢?是因为笔者认为注解形势的Controller会让代码的可读性变理很差,并且因为配置在代码里,会发生很多映射关系不容易找到等问题。当然,SimpleFormController的生命周期也是非常强大,而且了注解之后,笔者认为表面上的灵活更容易让程序员犯错误。(当然为什么Spring在3.0之后不推荐使用,笔者也感觉很困惑)
1. AbstractController和SimpleFormController的处理流程
2. Summercool请求处理流程图
说明:
1. 了解Spring MVC底层代码或是了解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处理的,但是却包括一些动态信息(据说Spring MVC 3.1已经支持了)
3. summercool框架的相关说明
1) AroundPipeline接口说明
A. 因为Summercool框架是基于Filter实现的,所以AroundPipeline会过滤所有的请求,因为AroundPipeline笔者也是跟据Filter的模式进行调用的
B. PriorityOrdered接口是一个顺序接口,这样可以指定一个AroundPipeline的执行顺序
C. 这个类的主要应用场景是,可以对监控所有请求的执行时间,日志打点和定制相关图片压缩功能
D. 该类的相关功能演示,笔者会在后续编章中给出演示
package org.summercool.web.servlet.pipeline; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.PriorityOrdered; import org.summercool.web.servlet.AroundPipelineChain; /** * * @author:shaochuan.wangsc * @date:2010-3-10 * */ public interface AroundPipeline extends PriorityOrdered { /** * * @author:shaochuan.wangsc * @date:2010-3-10 * @param request * @param response * @param aroundPipelineChain * @throws Exception */ public void handleAroundInternal(HttpServletRequest request, HttpServletResponse response, AroundPipelineChain aroundPipelineChain) throws Exception; }
2) PreProcessPipeline接口说明
A. PreProcessPipeline接口会在允许处理的请求范围内继续向下执行(这句话的意思会在实践篇讲解)
B. PriorityOrdered接口是一个顺序接口,这样可以指定一个AroundPipeline的执行顺序
C. 这个类的主要应用场景是权限检查,如某个请求在处理过权限检查之后,则继续执行;反之,则跳转到另一个指定页面或资源
D. 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函数,请求会继续向下执行,最终执行Controller或是渲染页面
E. 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函数,请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求
package org.summercool.web.servlet.pipeline; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.PriorityOrdered; import org.springframework.web.servlet.ModelAndView; /** * * @author:shaochuan.wangsc * @date:2010-3-10 * */ public interface PreProcessPipeline extends PriorityOrdered { /** * * @author:shaochuan.wangsc * @date:2010-3-10 * @param request * @param response * @return * @throws Exception */ public boolean isPermitted(HttpServletRequest request, HttpServletResponse response) throws Exception; /** * * @author:shaochuan.wangsc * @date:2010-3-10 * @param request * @param response * @return * @throws Exception */ public ModelAndView handleProcessInternal(HttpServletRequest request, HttpServletResponse response) throws Exception; }
3) PostProcessPipeline接口说明
A. PostProcessPipeline接口,是在Controller或是页面渲染之前的一个处理类,可以拦截请求马上要处理的相关资源
B. 此处的应用场景是,如果一个人想到重定向到另一个页面,那么我们可以查看一下是否在重定向的白名单地址列表里面而防止被“钓鱼”
C. 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函数,请求会继续向下执行,最终执行Controller或是渲染页面
D. 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函数,请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求
E. isPermitted()函数中的ModelAndView里面包含要跳转或是要处理的资源,所以可以进行白名单等功能的检验
package org.summercool.web.servlet.pipeline; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.PriorityOrdered; import org.springframework.web.servlet.ModelAndView; /** * * @author:shaochuan.wangsc * @date:2010-3-10 * */ public interface PostProcessPipeline extends PriorityOrdered { /** * * @author:shaochuan.wangsc * @date:2010-3-10 * @param request * @param response * @param modelAndView * @return * @throws Exception */ public boolean isPermitted(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) throws Exception; public ModelAndView handleProcessInternal(HttpServletRequest request, HttpServletResponse response) throws Exception; }
3) ExceptionPipeline接口说明
A. 当Controller或是渲染页面的时候发生异常,会调用ExceptionPipeline
B. 为什么Spring MVC有Exception处理类,笔者还要再扩展一下呢?
因为Spring MVC只能处理:Exception --> /error.ftl 这样的,异常类型对应相关渲染页面处理
有时候我们需要这样处理: Exception (errorcode = 1) --> /error_1.ftl
Exception (errorcode = 2) --> /error_2.ftl
像这样的情况,是我们可以通过一种异常类型,不同的errorcode可以自定义不同的显示页面
当然,笔者也考虑到了原有的Spring MVC处理异常的方式;所以原始的Spring MVC的处理方式也是支持的
C. 在发生异常的时候,就可以通过此接口的ModelAndView接口来定制渲染页面
package org.summercool.web.servlet.pipeline; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.core.PriorityOrdered; import org.springframework.web.servlet.ModelAndView; /** * * @author:shaochuan.wangsc * @date:2010-3-10 * */ public interface ExceptionPipeline extends PriorityOrdered { /** * * @author:shaochuan.wangsc * @date:2010-3-10 * @param request * @param response * @param modelAndView * @param throwable * @throws Exception */ public void handleExceptionInternal(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView, Throwable throwable) throws Exception; }
4) FreeMarkerWidget接口说明
A. 在我们渲染一个页面的时候,我们可以使用${widget("/header")}
B. 渲染时候的顺序是:${widget("/header")} --> "/HeaderWidget.java" --> "/header.ftl"
C. 如果在渲染的时候,没有"/HeaderWdiget.java"处理类,则直接渲染"/header.ftl"页面
D. 这个函数的好处是,可以为每个页面的嵌套子页面提供独立的业务处理类Widget,使子页面的逻辑独立
package org.summercool.web.servlet.view.freemarker; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * * @author:shaochuan.wangsc * @date:2010-3-18 * */ public interface FreeMarkerWidget { /** * * @author:shaochuan.wangsc * @date:2010-3-18 * @param request * @param model */ public void referenceData(HttpServletRequest request, Map<String, Object> model); }
最后说明:
1. 此框架目的不是在于想打造一个全新的框架
2. 一个框架的学习成本还是有些高的,要是全新打造一个框架也势必会让新的开发人员重新学习,所以会严重影响一个框架的学习
3. 一个框架的考虑周全性也是比较困难的,当时笔者想自己独立开发一个框架的时候也是有此担心,所以想从Struts2和Spring MVC为基础的原型上面进行二次开发
4. 笔者最后选中了Spring MVC,主要还是因为它的设计非常优雅并且容易扩展
5. Summercool只是在Spring MVC的基础上封装的一个框架,也就是说严格上来说它是一个依拖于别人的框架,严格上来说不算是一个框架;只是二次开发之后的一个Spring MVC框架
相关推荐
笔者工作的这几年之中,总结并开发了如下几个框架: summercool(Web 框架,已经应用于某国内大型网络公司的等重要应用)、summercool-hsf(基于Netty实现的RPC框架,已经应用国内某移动互联网公司)、 summercool-...
summercool-hsf Automatically exported from code.google.com/p/summercool-hsf 1.目前为止性能最高的RPC远程通讯框架 2....笔者还开发了web层的框架,也在国内最大的电子商务公司使用,平稳运行两年时间: 地址:
笔者工作的这几年之中,总结并开发了如下几个框架: summercool( Web框架,已经应用于某国内大型网络公司的等重要应用)、summercool-hsf(基于Netty实现的RPC框架,已经应用国内某移动互联网公司)、summercool-...
SSO单点登录概要设计说明书.doc
奥塔北煤矿6.0 Mta新井设计说明书.docx
内容概要:本文详细介绍了基于S7-200 PLC和组态王软件构建喷泉控制系统的全过程。首先明确了系统的IO分配,包括启动按钮、停止按钮以及喷泉水泵的连接方式。接着展示了梯形图程序的设计,涵盖了基本的启停控制逻辑、定时循环和模式切换机制。随后提供了详细的接线图原理图,解释了输入输出部分的具体接线方法。最后讲述了组态王的画面设计,包括创建工程、定义变量和绘制监控界面等步骤。此外还分享了一些调试过程中遇到的问题及解决方案。 适合人群:对自动化控制感兴趣的初学者和技术人员,尤其是那些希望深入了解PLC编程和人机界面设计的人群。 使用场景及目标:适用于小型喷泉项目的实际控制系统开发,旨在帮助读者掌握PLC编程技巧、熟悉组态软件的应用,并能够独立完成类似的自动化控制系统设计。 其他说明:文中不仅包含了理论知识讲解,还附带了许多实践经验分享,如硬件配置建议、常见错误规避措施等,有助于提高实际操作能力。
计算机二级PPT精选二十套(标红)
保险公司IT变更管理流程设计说明书.doc.doc
毕业设计说明书A江坝后式厂房双曲拱坝设计.pdf
内容概要:文档《计算机二级MS精选300道选择题.docx》涵盖了计算机二级考试中Microsoft Office软件(Word、Excel、PowerPoint)及计算机基础知识的选择题。题目涉及软件操作技巧、功能应用、常见问题解决等方面,旨在帮助考生熟悉并掌握相关知识点,提高应试能力。文档内容详尽,涵盖面广,从基础操作到高级应用均有涉及,适合考生全面复习备考。 适用人群:准备参加计算机二级考试的学生及相关从业人员,特别是需要强化Office软件操作技能和计算机基础知识的人员。 使用场景及目标:①考生可以在复习过程中使用这些选择题进行自我检测,巩固所学知识;②教师可以将其作为教学辅助材料,帮助学生更好地理解和掌握课程内容;③培训机构可以用这些题目作为测试题库,评估学员的学习效果。 其他说明:文档不仅提供了大量的选择题,还详细解析了每道题目的答案,有助于考生深入理解知识点。此外,题目内容紧跟最新考试大纲,确保考生能够获得最有效的备考资料。
内容概要:本文介绍了一种创新的方法,利用多目标黏菌优化算法(MOSMA)来优化支持向量机(SVM)的参数C和gamma,从而提高回归预测的效果。首先详细解释了MOSMA的工作原理,包括黏菌权重更新、快速非支配排序以及自适应参数调整等关键技术点。接着展示了具体的Python代码实现,涵盖数据预处理、适应度函数定义、参数更新规则等方面。实验结果显示,在风电功率预测等多个应用场景中,相较于传统的网格搜索方法,MOSMA能够更快更有效地找到最优参数组合,显著提升了预测性能。 适合人群:从事机器学习研究或应用开发的技术人员,尤其是关注SVM参数优化及回归预测领域的从业者。 使用场景及目标:适用于需要进行高效参数寻优的回归预测任务,如风电功率预测、设备负载预测等。主要目标是通过改进SVM参数配置,获得更高的预测精度和更好的泛化能力。 其他说明:文中提供了完整的代码示例和详细的实施步骤指导,帮助读者快速理解和应用这一先进的优化技术。此外,还讨论了一些常见的注意事项和技术细节,如数据标准化、参数范围设定、并行化改造等。
毕业设计 某油库设计说明书.pdf
Q235钢板焊接工艺设计说明书.docx
75t循环流化床锅炉设计说明书.doc
(最新修订版)直列四缸柴油机配气机构设计毕业论文设计说明书.doc
内容概要:《deepseek大模型生态报告 2025年2月》详细介绍了DeepSeek大模型的背景、应用现状、技术特点及其产业生态。DeepSeek由杭州深度求索公司创立,通过一系列技术创新,如多层注意力架构(MLA)、FP8混合精度训练框架、DualPipe跨节点通信等,显著降低了训练成本和提高了模型性能。DeepSeek在国内和国际市场迅速崛起,登顶苹果应用商店免费APP下载排行榜,并被多家企业和机构接入,包括华为、三大运营商、微软、英伟达等。其开源策略和低成本优势对全球科技供应链和资本市场产生了深远影响,尤其是在AI领域。 适合人群:对人工智能、大模型技术感兴趣的科技爱好者、研究人员、企业家及政策制定者。 使用场景及目标:①了解DeepSeek大模型的技术创新和应用现状;②探讨DeepSeek对全球AI产业生态的影响;③分析DeepSeek在不同行业(如金融、医疗、教育、制造等)的具体应用案例。 其他说明:报告还涵盖了各国政府及相关机构对DeepSeek的态度和政策回应,以及DeepSeek对未来AI技术发展和国际竞争格局的启示。此外,报告深入剖析了DeepSeek在技术架构、数据策略和工程实践方面的突破,揭示了其成功背后的组织文化和创新机制。
内容概要:本文详细介绍了利用粒子群算法解决电动汽车区域综合能源系统中光伏电站、充电桩运营商和电网公司在定价上的三方博弈问题。通过MATLAB代码实现了粒子群算法的具体应用,包括参数设置、适应度函数设计、粒子更新策略以及结果可视化。文中展示了如何将三方定价变量编码成多维粒子,并通过目标函数计算和约束处理确保粒子在合理的解空间内搜索最优解。最终得到的电价曲线反映了不同时间段内的供需变化,验证了算法的有效性和实用性。 适合人群:从事能源系统优化、智能算法应用的研究人员和技术开发者。 使用场景及目标:适用于需要进行能源系统优化调度的场景,特别是涉及多方利益协调的问题。目标是找到光伏电价、充电桩电价和电网电价的最佳组合,使得三方利益达到最优平衡。 其他说明:建议在调试过程中关注特定时段的电价突变,适当调整参数如社会认知系数和社会学习因子,以获得更好的收敛效果。此外,初始粒子的位置选择对收敛速度有很大影响,推荐采用高斯扰动等方法进行初始化。
WY02锥齿轮的加工工艺规程及工时定额计算 课程设计说明书.docx
项目管理制度范文.docx
内容概要:本文深入探讨了双馈风力发电机(DFIG)的仿真建模及其关键技术模块。首先介绍了最大功率跟踪(MPPT)模块的工作原理,利用爬山算法优化风能利用率。接着详细讲解了转子侧变流器的矢量控制,包括坐标变换、PI调节器参数设定以及抗饱和处理。文中还讨论了网侧变流器的直流电压控制方法,强调了双闭环结构的重要性,并分享了低电压穿越仿真的实践经验。此外,文章详细解释了功率解耦控制和变速恒频实现的技术细节,提供了丰富的故障案例和调试技巧。 适合人群:从事风电工程研究和技术开发的专业人士,尤其是对DFIG仿真建模感兴趣的工程师和研究人员。 使用场景及目标:适用于希望深入了解DFIG内部机制的研究人员,帮助他们掌握从基本原理到复杂控制策略的设计与实现。同时,也为实际工程项目提供宝贵的调试经验和故障排除指南。 其他说明:文章不仅涵盖了理论分析,还包括大量实用的代码片段和具体的参数配置建议,确保读者能够顺利构建并运行仿真模型。