`
flash7783
  • 浏览: 308521 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

胡诌Spring

    博客分类:
  • ssh
阅读更多



       像Struts一样,Spring MVC框架中同样分为前端控制器和后端控制器,其可以用如下图简单描述,Spring MVC的前端控制器DispatcherServlet负责初始化所需的资源和处理整个请求的工作流程(Struts中为ActionServlet),接收并处理符合一定规则http请求,例如 /springmvc/*等(在web.xml文件中配置),同时将http请求负责给后端控制器,目前默认后端控制器主要有Controller 、HttpRequestHandler和ThrowawayController,其中以Controller为主。

 

 

Spring MVC的处理过程大致如下:

 

http请求---à根据handlerMappings解析url---à找到最精确匹配的mappedHandler(HandlerExecutionChain类型,该类型其实是封装了Handler和拦截器)-à执行拦截器的preHandle方法--à获得HandlerAdapter,并通过Adapter模式调用Handler的handler的handle方法(此处非常关键,其实就是执行Controller),并返回ModelAndView对象---à执行拦截器的postHandle方法--à渲染试图--à渲染拦截器的afterCompletion方法。

 

在此至少能学到做框架设计四个非常重要的方

 

1、 Framework其实我们也可以写---------规范了处理流程,提供常用的功能实现

一个技术架构之所以成为框架,我个人认为首先应该明确整个处理的工作流程,也就是定下规则,当然这里需要用到大量的接口编程,使得以后的程序员可以扩展,更重要的是,以后具体实现功能可以不一样(例如同样是渲染到视图上,有的是采用jsp,有的采用freemarker等),当然框架要定义自己默认的一些实现(例如Spring MVC的Controller就提供了很多现成的实现,包括UrlFilenameViewController 、 MultiActionController等,当然实际的项目中,我们要写更多自己的Controller实现)。

2、 代码可以更优雅---------设计模式

一个好的框架,尤其是Spring这样优秀的框架,里面用到了大量的设计模式(对于设计模式,可能对于初学者有点怵头,其实我个人认为设计模式就是处理一类事情的思路,当然这些需要经过适当的抽象和精炼,所以设计模式在我们没有接触编程语言之前就会了一些,有些人就习惯把事情搞复杂 ^_^),在此简单介绍一种Adapter模式(当然上面的第一点,我们又可以认为用到了模板设计模式),

上面的过程已经定义了我们用Spring MVC处理一件事情的流程,但是具体做什么事情是由我们的业务系统解决的。还一句话说,具体做什么,需要我们程序员根据系统的需要自己来处理(在此不涉及DAO和BO层),在Spring MVC中更多是写自己的Controller(就像Struts中的Action),

还是简单介绍一下Adapter,我们举一个不太精准的例子,假如我的某电器只接受的是38V的电压,而我们常用的是220V的民用电,如何才能在220V的电压上用我38V的电器? 非常简单,找一个变压器,这就用到了Adapter设计模式,如果我已经有两个现成功能的对象,但不想改变继承关系,我们需要做一个适配器(Spring MVC在此用到了HandlerAdapter适配器)。

我们先看下面两个接口,Controller是我们自己要实现的接口

public interface Controller {

ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;


}


HandlerAdapter中

public interface HandlerAdapter {

boolean supports(Object handler);

ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

long getLastModified(HttpServletRequest request, Object handler);

}

 

如果我们想办法让执行handle方法的时候去调用Controller中的handleRequest方法,一切搞定。

Spring MVC默认为为我们提供了三种HandlerAdapter实现,分别为

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,

org.springframework.web.servlet.mvc.throwaway.ThrowawayControllerHandlerAdapter

 

(在DispatcherServlet.properties中配置)

以我们系统中常用的Controller为例:

public class SimpleControllerHandlerAdapter implements HandlerAdapter {

public boolean supports(Object handler) {

return (handler instanceof Controller);

}

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

return ((Controller) handler).handleRequest(request, response);

}

public long getLastModified(HttpServletRequest request, Object handler) {

if (handler instanceof LastModified) {

return ((LastModified) handler).getLastModified(request);

}

return -1L;

}


}

 

经过上面的描述,我们只要去实现Controller接口(更多的时候,我们继承AbstractController抽象类更合适,在第三点介绍),剩下的DispatcherServlet都帮我们搞定了。

3、 我的地盘我做主-----------开放-封闭原则

我们在来看一下Controller接口

public interface Controller {

ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;

}

 

所有的类,只要实现handleRequest方法即可,可在描述第二点的时候,我推荐继承AbstractController抽象类,那么我们研究一下AbstractController,很奇怪的是我们看到

handleRequest方法被final所修饰,意味着我们的子类没有办法来覆写该方法,好像和上面说的有一些矛盾。

public final ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)

throws Exception {

checkAndPrepare(request, response, this instanceof LastModified);

if (this.synchronizeOnSession) {

HttpSession session = request.getSession(false);

if (session != null) {

Object mutex = WebUtils.getSessionMutex(session);

synchronized (mutex) {

return handleRequestInternal(request, response);

                                   }

                             }

                   }

return handleRequestInternal(request, response);

}

 

其实AbstractController已经偷梁换柱了,给我们提供了如下的抽象方法

protected abstract ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)

throws Exception;

回过头来仔细想想,同样都是处理HTTP请求,如果我们要设置HTTP缓存时间?设置允许请求的方法(常用的GET和POST)?是否要在我们每个Controller子类中来设置?Spring MVC在此良苦用心,在AbstractController中都为我们处理好了。一方面在handleRequest中规定了处理流程,使得以后的程序员(尤其是不知道内情的程序员)不能更改,我们把它叫封闭原则,另一方面我们给以后的程序员提供了扩展的地方,在这里就是覆写handleRequestInternal方法。当然在此如果还不清楚的话,我们举一个通俗的例子:如果要做一盘醋溜白菜,为了更可口一点,我们知道最后要勾点芡,如果是一个不会做菜的人,一刚开始就放勾好的芡,那就坏了,换句话说,如果做一件事的业务逻辑非常重要,撒开手交给别人做,可能就出问题,如果我们把业务逻辑规定好,出错的概率就小多了,在这里封闭就体现必须在将勾芡放在最后一步,扩展体现在你可以用圆白菜,也可以用大白菜,业务需要(或者个人喜好)由你自己决定。

4、 术业有专攻,做你自己擅长的

“不重复发明轮子”这句话对我影响比较深,一方面说明不重复投资,另一方面其实也说明术业有专攻,在这一点Spring发挥到了极致,到处用成熟的框架,例如封装Hibernate、封装Quartz等,这些框架本身很成熟,Spring团队没有必要重新搞一套,除非是吃饱了撑的。在这里我要说明的是Spring MVC中将返回什么内容和怎么显示返回的内容两者分开,前者是业务逻辑决定的,后者是纯视图技术(可以用jsp、PDF、excel等),Spring MVC抽象出一个View接口,专门用于视图显示。

public interface View {

String getContentType();

void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception;


}

 

Spring MVC除了抛出一个View规范之外,还有非常多的默认实现,包括JstlView、TilesView、XsltView、ImageView、AbstractPdfView、AbstractExcelView等,让我们熟悉不同视图技术的工程师对Spring MVC折服之余,也让我们以后写代码、做项目多了几分从容。

http://tech.e800.com.cn/articles/2009/819/1250644092969_1.html

  • 大小: 9.4 KB
分享到:
评论

相关推荐

    天津市静海区第四中学2020学年高一语文11月份四校联考试题.doc

    例如,选项A中"胡诌(zōu)"的正确读音应为"胡诌(zhōu)",选项C中的"解剖(pāo)"的正确读音应为"解剖(pōu)",选项D中的"亘(gèng)古"应为"亘(gèn)古","炽(zhì)热"应为"炽(chì)热"。这类题目...

    九年级上册语文月考试题.doc

    1. 注音:考查学生对汉字读音的掌握,例如"一抔(póu)"、"胡诌(zhōu)"等。 2. 词语书写:检查学生对常用词语的正确书写,如"涕泗横流"、"恪尽职守"等。 3. 词语解释:测试学生对词汇含义的理解,比如"顿失滔滔"、...

    findip:在CDN中查找真实IP地址的python工具

    Find ip通过一些网络上的方式去寻找CDN之后的真实 IP地址DNS 解析无www的网站解析相同图标,标题,网站证书等方式进行提示你可以在...上面全是胡诌,真实情况是毕业需要一个毕设,所以瞎写了一个勉强能用的程序2333Insta

    襄城三高高一语文期中试题[精选].doc

    1. 试卷中的第一道选择题考察的是汉字拼音的准确性,涉及的词语有“胡诌”、“湔雪”、“思忖”和“呱呱而泣”,这要求学生具备良好的汉语拼音基础。 2. 第二道选择题则测试词语书写正确与否,例如“踉跄”、...

    浙江省台州市2020学年高一语文下学期起始考试题(无答案).doc

    1. 文字读音:题目中涉及到汉字的正确读音,例如“桦(huà)树”、“胡诌(zhōu)”、“纶(guān)巾”、“惊骇(hài)万状”等,这是语文学习的基础知识,考察学生的拼音识读能力。 2. 汉字书写:题目中提到了...

    高一语文下册期末调研考试试题 (2).doc

    1. 古代汉语基础:题目中涉及了汉字的读音,如"桌帏(wéi)"、"胡诌(zōu)"等,这是古代汉语中常见字词的读音测试,反映了高一学生对古汉语基础知识的掌握。 2. 错别字辨析:第二题考察学生对词语正确书写的能力...

    我在支付宝花了1分钟,查到了女朋友的开房记录!

    虽然是我在胡诌,但我也是有证据的: 蚂蚁森林玩过没? 官方宣称:每一种绿色行为都会产生绿色能量 什么意思呢? 只要你在支付宝上有过消费行为,那么你的蚂蚁森林就会出现对应的绿色能量。 周末放假,你说想出去...

    山东省威海市2013届高三语文上学期期末考试鲁人版

    1. **汉字读音**:试题中涉及到汉字的正确读音,例如A选项中的“胡诌(zōu)”应为“胡诌(zhōu)”,这要求学生掌握汉字的标准普通话读音。 2. **汉字书写**:检查学生的汉字书写规范,比如B选项中的“暴发力”...

    浙江省杭州市西湖高级中学2020学年高一语文12月月考试题(1).doc

    2. 基础知识运用:试题中的部分内容涉及到汉字读音的辨析,例如"浑身解数"的"解"读作"xiè","胡诌"的"诌"读作"zhōu",这些都是基础知识,需要考生掌握汉字的正确发音。 3. 错别字检查:题目中有对错别字的考察,...

    九年级上册语文月考试题.pdf

    例如,“胡诌”的读音是zhōu,“麾下”的“麾”正确读音是huī,而非hūi。同时,检查了词语的正确拼写,如“恪尽职守”、“惘然”等。 2. 成语理解和应用:题目中提到了成语“众志成城”、“相得益彰”、...

    重庆市江津第五中学九年级语文上册 20 香菱学诗导学案(无答案) 新人教版

    9. 预习自测中的其他词语如“请柬(jiǎn)”是邀请函,“怔怔(zhèng)”形容惊讶或呆住的样子,“胡诌(zhōu)”是随意编造的意思,“画缯(céng)”指的是绘画的丝绸,“鳏鳏(guān guān)”指孤独无伴的状态。...

    广东省江门市普通高中2018届高考语文三轮复习冲刺模拟试题(7)201806010293

    1. 字音辨析:题目中出现了多组词语,如“甄选/箴言”,“聒噪/恬淡”,“间距/间不容发”,“缄默/信笺”,“谄媚/胡诌”,“碑帖/俯首帖耳”,“掠影/虐待”,“舐犊/胼胝”,“复辟/鞭辟入里”,“花蕾/擂鼓”,...

    辽宁省灯塔市第二初级中学九年级语文上册第五单元综合测试新人教版

    这部分考察了学生对汉字发音的掌握,包括“嗔怒”、“聒噪”、“面面厮觑”、“谮害”、“麾军”、“腆着肚子”、“啐在脸上”、“避讳”、“绾着头发”、“星宿”、“攥紧”、“带挈”、“桑葚”、“胡诌”的正确...

    高三语文3月月考试题(无答案)新人教版 试题.doc

    2. **汉语词汇与发音**:试题中提到的字形和字音正确性的考察,如"看护"的拼音为"kān","一语成谶"的拼音为"chèn","辟谷"的拼音为"bì","靡计不施"的拼音为"mǐ","搽粉"的拼音为"chá","信口胡诌"的拼音为"zh...

    天津市北大宝坻附属实验学校2020届高三语文上学期第一次月考试题(无答案).doc

    1. 题目涉及到的汉字读音辨析,例如“谙练”的“谙”(ān)、“胡诌”的“诌”(zhōu)等,考察学生对常见汉字的正确发音。 2. 字形和读音的对应关系,如“倔强”的“倔”、“骨骼”的“骼”,以及“戛然而止”的...

    天津市杨村第一中学2020届高三语文上学期第一次月考试题.doc

    9. 挑、掮、胡诌、磕:这些都是动词,分别表示挑担、扛东西、随口编话和磕瓜子的动作。 10. 瞻前顾后:形容做事谨慎,考虑周全,这里用来形容诗人在创作时的思考过程。 11. 独树一帜/别具一格:这两个成语均表示...

    湖北省黄冈中学高一语文期中试卷(春季)[精选].doc

    对于“炮烙”的正确读音是páo luò,埋怨的“埋”读音是mán,渣滓的正确读音是zhā zǐ,觑见的“觑”读音是qù,胡诌的“诌”读音是zhōu,蛮横的“横”在这里读hèng。同时,检查了词语的书写,如“磨砺”应改为...

    年襄城三高高一语文期中试题.doc

    选项A中的“胡诌”的“诌”应读“zhōu”,而非“zōu”,选项B中的“莠民”的“莠”应读“yǒu”,而非“xiù”,选项C中的“拾级而上”的“拾”应读“shè”,而非“shí”。正确答案为D,包含的汉字拼音都正确。 ...

    年高一年级语文下册第二次月考试卷.doc

    - "寒暄"的"暄"应读xuān,"间或"的"间"读jiàn,"胡诌"的"诌"读zhōu,"少不更事"的"更"读gēng,"咄咄逼人"的"咄"读duō。 - "形骸"的"骸"读hái,"讪笑"的"讪"读shàn,"咀嚼"的"咀"读jǔ,"国子监"的"监"在此...

    高一语文下册期末调研考试试题 (17).doc

    1. **汉字拼音** - 在第一题中,提到了汉字的正确读音,如"桌帏(wéi)"、"胡诌(zōu)"等,这是对汉字拼音知识的考察,涉及到汉语的基础发音规则。 2. **错别字辨析** - 第二题涉及错别字的识别,例如"回朔"应为...

Global site tag (gtag.js) - Google Analytics