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=\>

mb-healthcloud

Set Character Encoding

org.springframework.web.filter.CharacterEncodingFilter

encoding UTF-8

Set Character Encoding /*

summercool

org.summercool.web.servlet.DispatcherFilter

summercool /*

index.htm

说明:

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\>

classpath:config/config.properties

class=\Resolver\>

class=\tionResolver\>

class=\>

value=\/>

class=\actoryBean\>

value=\/>

UTF-8 #

${com.maobang.platform.template.update.delay}

true /macro/macros.ftl as spring

UTF-8

class=\Configurer\>

error

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\>

.htm

说明:

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页面模版文件,如下:

HealthCloud

padding-top: 60px; padding-bottom: 40px; }

#tbtd ,#tbth{ border-top: 0px; }

${widget(\


${widget(\

2) 上面有两个${widget()}的freemarker函数请各位注意一下: 1. ${widget(\healthcloud/widgets/header\ 2. ${widget(\healthcloud/widgets/footer\

规则:${widget(\healthcloud/widgets/header\先加载--> /healthcloud/widgets/HeaderWidget.java --再加载-->

/healthcloud/widgets/header.ftl (HeaderWidget.java可选,即如果没有Widget类,则直接加载header.ftl页面)

而我们想在显示\局部页面的时候,我们可以将一部分显示的业务逻辑和\局部页面需要显示的页面数据通过此类 加载;那么我们查看下\类,如下:

publicclassHeaderWidgetimplementsFreeMarkerWidget {

publicvoidreferenceData(HttpServletRequestrequest, Mapmodel) {

model.put(\, CookieUtils.getUserName(request)); } }

说明:上面的代码中可以看出,\页面中会显示登录人的用户名信息,那么用户名的信息则就是通过referenceData()函数加载的,model是\的页面变量信息map,如下:

<#else>

summercool框架对Cookies封装

cookie-configurer.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\>

在上面这个配置文件中,最重要的是CookieConfigurer类配置,如下:

说明:

1) domain: cookie存放在的域名(笔者建议设置为一级域名,这样二级域名的

应用也可以获取和共享一级域名的cookie) 2) lifeTime:设置cookie的有效期

3) name:服务端的cookie名称,因为开发者在使用时,要知道设置了哪个

cookie

4) clientName:相对于服务端的cookie名称,这个是客户端的cookie名称。 5) encrypted:是否进行加密处理;设置了此属性,CookieConfigurer类会自

动对该cookie进行加密和解密。 如下应用举例:

publicstaticvoidwriteCookie(HttpServletRequestrequest, UserDOuserDO) {

if (request == null || userDO == null) {

thrownewIllegalArgumentException(); }

CookieModulejar = (CookieModule)request

.getAttribute(CookieModule.COOKIE);

if (jar == null)

{

thrownewNullPointerException(); }

jar.remove(CookieConstants.MANAGER_ID_COOKIE); jar.remove(CookieConstants.MANAGER_PWD_COOKIE); jar.remove(CookieConstants.MANAGER_UNAME_COOKIE);

jar.set(CookieConstants.MANAGER_ID_COOKIE, userDO.getId().toString()); try

{

jar.set(CookieConstants.MANAGER_UNAME_COOKIE,

URLEncoder.encode(userDO.getUserName(), \)); }

catch (UnsupportedEncodingExceptione) { }

jar.set(CookieConstants.MANAGER_PWD_COOKIE, userDO.getPassword()); }

说明:summercool框架已经对cookies进行了封装,在配置文件配置完成后就可以直接使用了

只要通过reqeust对象就可以直接设置和获取cookie的相关信息了。

所有的用户登录信息最好不用要session实现,因为session还要解决分布式的问题。建议登录信息全部都存放在cookie里面 是非常好的,因这样不仅可以实现登录信息的保存而且大大降低了开发难度;相关于变相的实现了无状态登录。

summercool框架对UrlRewrite封装

1) 比如说我们有这样的一个需求,所有的页面都要通过/item/1.htm这样的url

地址来访问“产品的详细页面”

2) 像上面这样的配置规则,我不需要多于的代码编写,可以自动生成上面这样

风格的url或是自定义的url风格

3) 上面成生的url风格中,我们还可以提取“1”这样的参数或是url中的参

数可以直接提取出来

请看url-configurer.xml的配置:

xmlns:xsi=\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\>

item

说明:

1) SimpleUrlHandlerMapping:可以配置/item/*.htm这样的url地址全部都交

给/item /item_detail.htm地址对应的

Controller(/item/ItemDetailController.java)来处理。 2) UrlBuilderModuleConfigurer:可以配置以模块为单位的url地址映射规则,

并加入序号,如:

item

在上面这段配置中,我们可以配置一个item模块的url地址规则为:/item/{id}.htm

在freemarker页面中,如果想使用上面规则的地址,则使用url内置函数:${url(\

在上面这个函数中,item:代表模块名,param是freemarker的内置函数,返回为map类型的数据,key=id, value=1

如果大家细点一点,会发现上面有一个人seq的一个参数,这个是干什么用的呢?因为有时候,一个item模块可能会有很多的模版规则,如/item/c{category}.htm

上面这个模版的意思是,查到一个item某类目下面的详细信息,这样的话我们可以将seq设置成2

页面上可以做这样的使用:${url(\--> 其中的\就是seq的值,是让url函数调用url模版的时候,只调用seq=2的那个模版。当然,也可以不写(默认会调用第一个配置的url模版, 即seq=1的模版)。

所以,url地址规则:${url(\--> /item/1.htm;

3) 提取url中的参数,上面的例子只是提到了规则url地址的生成,但是如何

将这些url中的参数提取出来呢?那么我们就要看一下,我们url对应处理的 Controller,如下: publicclassItemDetailControllerextendsAbstractController

{

@Override

protectedModelAndViewhandleRequestInternal(HttpServletRequestrequest,

HttpServletResponseresponse) throws Exception {

UrlBuilderModuleurlBuilderModule = (UrlBuilderModule)request .getAttribute(UrlBuilderModule.URL_BUILDER); UrlBuilderBeanDefinitionurlBuilderBean = urlBuilderModule .matchUrlBuilderBean();

// 如果在访问detail页面时,没有找查到相对应的url规则直接返回到/login.htm页面

if (urlBuilderBean == null || !urlBuilderBean.isMatched()) {

returnnewModelAndView(\); } //

Mapmap =

urlBuilderBean.getUriTemplateVariables(); try

{

String id = map.get(\);

// 在这里可以写一些业务逻辑,比如在DB中查找到item信息收直接显示detail页面,否则返回到/login.htm页面 Long.valueOf(id); }

catch (Exception e) {

returnnewModelAndView(\); } //

returnnewModelAndView(\, map); } }

Spring MVC业务层的整合

Summercool controller与service层的整合

在spring配置文件中配置相关配置,如healthcloud-service.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\>

destroy-method=\>

aliyuncs.com:3306/auth_db_test\/>

class=\>

value=\/>

class=\anager\>

众所周知,在SpringMVC中,常用的业务层的构成是controller->service->dao, 由于引入了Summercool框架,并且Summercool框架controller层不支持使用注解方式自动注入service,所以我们需要从应用上下文中获取构建的service或者dao。如下所示:

@SuppressWarnings(\) publicstaticT

getBeanFromContext(ApplicationContextapplicationContext, Classarg0) {

return (T) applicationContext.getBean(arg0.getSimpleName());

}

说明:

ApplicationContext为应用上下文,arg0参数为服务接口的class。如下所示:

LoginServiceloginService=

BeanUtils.getBeanFromContext(getApplicationContext(), LoginService.class);

Dao层代码自动生成工具

具体使用参考com.maobang.platform.tools.create类,执行main方法即可。 Config.properties配置,如下: Author:生成代码的作者 bean_package:生成bean的目录 pack_service:生成service的目录 package_dao:生成dao的目录

package_mapper:生成mybatis mapper文件目录 driverClassName:数据库驱动名称 url:数据库url username:数据库账号 password:数据库密码

本文来源:https://www.bwwdw.com/article/sf23.html

Top