summercool+ mybatis框架解决方案
更新时间:2024-06-23 09:56:01 阅读量: 综合文库 文档下载
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(
\);
String message = \当前Dispatcher[\ + request.getRemoteAddr()
+ \ + url + \ + \当执行的时间为:[\ + sdf.format(new Date(beginTime)) + \ + \当前时间内(秒)执行线程数为:[\ + threadCount + \\
+ \请求执行的时间为:[\ + (endTime - beginTime) + \毫秒]\;
logger.info(message); } } }
publicvoidsetOrder(intorder) {
this.order = order; }
publicintgetOrder() {
returnorder; } }
PreProcessPipeline接口说明
1) PreProcessPipeline接口会在允许处理的请求范围内继续向下执行(这句话
的意思会在实践篇讲解)
2) PriorityOrdered接口是一个顺序接口,这样可以指定一个AroundPipeline
的执行顺序
3) 这个类的主要应用场景是权限检查,如某个请求在处理过权限检查之后,则
继续执行;反之,则跳转到另一个指定页面或资源
4) 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函
数,请求会继续向下执行,最终执行Controller或是渲染页面
5) 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函
数,请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求 6) 该类的相关功能演示,详见如下代码:
publicclassLoginSecurityextendsAbstractSecurity implementsPreProcessPipeline {
privateintorder;
// set 方法
publicvoidsetOrder(intorder) {
this.order = order; }
publicModelAndViewhandleProcessInternal(HttpServletRequestrequest, HttpServletResponseresponse) throws Exception {
returnnewModelAndView(\ + \); }
publicbooleanisPermitted(HttpServletRequestrequest, HttpServletResponseresponse) throws Exception {
if (match(request)) { returntrue; } else
{
if (CookieUtils.isLogin(request)) { returntrue; } else
{ returnfalse; } } }
publicintgetOrder() {
returnorder; } }
PostProcessPipeline接口说明
1) PostProcessPipeline接口,是在Controller或是页面渲染之前的一个处理类,
可以拦截请求马上要处理的相关资源
2) 此处的应用场景是,如果一个人想到重定向到另一个页面,那么我们可以查
看一下是否在重定向的白名单地址列表里面而防止被“钓鱼”
3) 如果isPermitted()函数返回为true,则不会执行handleProcessInternal()函
数,请求会继续向下执行,最终执行Controller或是渲染页面 4) 如果isPermitted()函数返回为false,则会执行handleProcessInternal()函数,
请求就不会继续向下执行,而是直接处理handleProcessInternal()函数返回的ModelAndView接口,然后终于此次请求
5) isPermitted()函数中的ModelAndView里面包含要跳转或是要处理的资源,
所以可以进行白名单等功能的检验
ExceptionPipeline接口说明
1) 当Controller或是渲染页面的时候发生异常,会调用ExceptionPipeline 2) 使用了exceptionPipeline,我们可以这样处理:
Exception (errorcode = 1) --> /error_1.ftl Exception (errorcode = 2) --> /error_2.ftl
像这样的情况,是我们可以通过一种异常类型,不同的errorcode可以自定义不同的显示页面
3) 在发生异常的时候,就可以通过此接口的ModelAndView接口来定制渲染页
面
4) 该类的相关功能演示,详见如下代码
publicclassDefaultExceptionHandlerimplementsExceptionPipeline {
private Logger logger = LoggerFactory.getLogger(getClass());
privateintorder;
publicvoidhandleExceptionInternal(HttpServletRequestrequest,
HttpServletResponseresponse, ModelAndViewmv, Throwablethrowable) throws Exception
{
// 打印错误信息
String stackTrace = StackTraceUtil.getStackTrace(throwable); // 记录错误信息
logger.error(stackTrace);
if (mv != null) {
mv.setViewName(\); } else
{
throwable.printStackTrace(); } }
publicvoidsetOrder(intorder) {
this.order = order; }
publicintgetOrder() {
returnorder; } }
FreeMarkerWidget接口说明
1) 在我们渲染一个页面的时候,我们可以使用${widget(\
2) 渲染时候的顺序是:${widget(\
\
3) 如果在渲染的时候,没有\处理类,则直接渲染
\页面
4) 这个函数的好处是,可以为每个页面的嵌套子页面提供独立的业务处理类
Widget,使子页面的逻辑独立
相关配置文件配置
web.xml配置
xmlns=\xmlns:web=%un.com/xml/ns/javaee\ xsi:schemaLocation=\http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\ id=\version=\> 说明: 1) Set Character Encoding:字符编码过滤器 2) summercool:summercool框架过滤器 3) 只要配置上面两个filter即完成了应用框架的启动配置 Summercool相关配置文件加载及说明 1) summercool框架会自动扫描:/spring/*.xml文件夹下面的所有的Spring配置 文件。 说明:上图中的/spring文件夹下面的Spring配置文件全部都会自动加载,包括依赖的项目或是jar里包括的/spring的文夹下面的配置文件。 2) 在healthcloud应用里面,一共预先建立了下面几个配置文件: a) applicationContext.xml b) cache-init-config.xml c) cookie-configurer.xml d) exception-configurer.xml e) healthcloud-module.xml f) healthcloud-service.xml g) monitor-configurer.xml h) security-configurer.xml i) url-configurer.xml 说明:在上面几个配置文件中,要想要healthcloud应用跑里面,上面 applicationContext.xml和healthcloud-module.xml这两个配置文件是不可缺少的。 1) applicationContextml里面配置的是healthcloud页面模版信息和一些 Spring MVC框架的配置信息。 2) Healthcloud-module.xml里面配置的是信息是summercool的一些请求映 射信息等。是整个summercool框架的核心配置文件之一;下面会详细讲解。 applicationContext.xml配置文件说明 xmlns:context=\ xmlns:util=\ xmlns:tx=\ xsi:schemaLocation=\ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\> class=\erConfigurer\> class=\Resolver\> class=\tionResolver\> class=\> value=\/> class=\actoryBean\> value=\/> class=\Configurer\> class=\ker.FreeMarkerErrorFunction\/> class=\ViewResolver\> 说明: 1) propertyConfigurer:该配置是用来配置Spring注入的一些变量信息。目 前里面只是有FreeMarker的模版路径和模版缓存时间。 2) MultipartResolver:如果你的Spring MVC中需要使用到文件上传的功能, 则需要配置这个类。默认Spring MVC是不支持文件上传的,只有配了这个类才会支持多文件上传;否则不起到作用。具体的用法,有时间笔者会给出例子,因为是标准的Spring MVC多文件上传,在这里不多作说明。 3) HandlerExceptionResolver:全局错误处理器;在Spring MVC在系统发生 异常的情况,会交给这个统一错误处理类来处理。比如说,上面配置中“defaultErrorView”属性可以告诉如果系统发生异常, 则要显示的默认处理页面(注:支持【 redirect: 】等这样的Spring MVC框架中View对象的语法)。 4) freemarkerConfiguration:设置的是Spring MVC中freemarker页面模版 的信息。在这里做了一点更改,支持classpath:下面的freemarker模版的加载,别的没有做任何的变动。具体的freemarker模版设置网上有很多的资类可以参数,都在这里不多做介绍了。 5) uriModuleConstants:这个配置比较关键,是配置freemarker页面中的全 局参数的一个map。比如说,我想让 freemarker页面加入一个全局变量 \,则可以配置在此map中。使用的时候只要在freemarker的任何页面中使用${AppName}即可显示。同理,如果想在 freemarker中加入全局的内置函数,当然也是通过此方法实现。 6) freemarkerResolver:Spring MVC中真正使用的freemarker页面处理类, 具体的实现和使用其实全部都是通过此类完成,具体该类的细节笔者在此不做细的讲解。 healthcloud-module.xml配置文件说明 xmlns:context=\xmlns:util=\ xsi:schemaLocation=\ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd\> 说明: 1) 该配置是整个summercool框架最核心的配置了。 2) org.summercool.web.module.WebModuleConfigurer:summercool框架会自 动加载此类并且分析该类加载的一些配置信息。 在此应用中,有如下几个信息是非常重要的: a) moduleName:设置当前应用模块的名称(没有关键作用,其实框架也用 不到,只是标识一下而已) b) moduleBasePackage:该模块包的根路径,主要是扫描Spring MVC的 Controller和Widget类。 c) uriExtension: summercool框架扫描到该模块的Controller之后,生 成的UrlMapping时的映射地址使用的扩展名是什么。比如 说:/IndexController.java --> /index.htm 或 /user/ModifyUserController.java --> /user/modify_user.htm 这样的url对应关系。【驼峰命名法的类,对应使用下划线的URL方式】 d) context:对应该模块的上下文。比如:context = \ 或 context = \e) contextPackage:扫描该模块对应的模块目录。 moduleBasePackage + contextPackage = 完整的该应用模块的招扫描路径 扫描该完整包路径下面的:controllers和widgets文件夹 controllers文件夹的扫描规则是: /controllers/IndexController.java --> /context/index.htm 如果是按照上面的这个配置,则真实的规则是: /controllers/IndexController.java --> /index.htm (因为context = \) f) 模块配置类可以允许配置多个,也就是说可以配置多个应和模块,只要 context不冲突即可。 3) org.summercool.web.module.WebModuleUriExtensionConfigurer: summercool应 用只允许有一个该配置类。该配置类主要是配置哪些过来的后缀名的url请求会允许交给summercool应用处理。 healthcloud的Controller和Widget开发 Controller开发 1) Controller的扫描规则是: /IndexController.java --> /index.htm 2) 扫描的附件条件是,被扫描加载的Controller类,必须是实现Spring MVC 的标准Controller接口和类名必须是以Controller结尾。 Widget函数讲解 1) 首先,我们还是先看一下/login.ftl页面模版文件,如下: padding-top: 60px; padding-bottom: 40px; } #tbtd ,#tbth{ border-top: 0px; } ${widget(\ ${widget(\