还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
处理请求的流程
2.
3.
1.Spring Web MVC如图2-
12、委托请求给处理器卜I A页面控制器,处理器响应前端控制器
5、返回ModdAndView
74、用务象~~、
6、渲染模型数调业对Model\视图据
7、返回控制模型视图Web容器如Tomcat图2-
1、架构232Spring WebMVC、核心架构图,如图1Spring WebMVC2-2HandlerMappingHandleroctrolkr人调用处理鬲相应功能处理方法HandlerAdaptexView关键架构的详细流程环节如下:
1、首先顾客发送祈求一一DispatcherServlet,前端控制器收到祈求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet------------HandlerMapping,HandlerMapping将会把祈求映射为对象(包括一种处理器(页面控制器)对象、多种HandlerExecutionChain Handler\JI7X3I拦截器)对象,通过这种方略模式,很轻易添加新的映射方略;Handlerinterceptor
九、中的拦截器:SpringSpring为我们提供了:org springframework.web.servlet HandlerlnterceptorSD,org springframework.web servlethandler Handle「lntercepto「Adapte「适酉[器,实现这个接口或继承此类,可以非常方便的实现自己的拦截器有以下三个方法Action Z刖执行—―.public booleanpreHandleHttpServletRequest request.HttpServletResponse response.Object handler;生成视图之前执行public voidpostHandleHttpServletRequest request,HttpServletResponse response.Object handler,ModelAndViewmodelAndView;品后执行,可旺曼放资源public voidafterCompletionHttpServletRequest request,HttpServletResponse response.Object handler,Exception ex分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)在preHandle中,可以进行编码、安全控制等处理;dpiAnd\/imAx_L在afte「Completion中,可以根据ex是否为null判断是否发生了异常,进行日志记录
3、DispatcherServlet------------HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很轻易支持诸多类型的处理器;
4、HandlerAdapter处理器功能处理措施的调用,HandlerAdapte「将会根据适配的成果调用真正的处理器的功能处理措施,完毕功能处理;并返回一种对象(包括模型数据、ModelAndView逻辑视图名);
5、ModelAndView的逻辑视图名----------ViewResolver,ViewResolver将把逻辑视图名解析为详细的通过这种方略模式,很轻易更换其他视图技术;View,
6、View——渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一种数据构造,因此很轻易支持其他视图技术;Map、返回控制权给由返回响应给顾客,到此一种流程结束7DispatcherServlet,DispatcherServlet此处我们只是讲了关键流程,没有考虑拦截器、当地解析、文献上传解析等,后边再细述到此,再来看我们前边提出的问题、祈求怎样给前端控制器?这个应当在中进行布署描述,在中详细讲解1web.xml HelloWorld、前端控制器怎样根据祈求信息选择页面控制器进行功能处理我们需要配置2进行映射HandlerMapping、怎样支持多种页面控制器呢?配置从而支持多种类型的页面控制器3HandlerAdapter、怎样页面控制器怎样使用业务对象?可以预料到,肯定运用容器的依赖注入功4Spring IoC能、页面控制器怎样返回模型数据?使用返回5ModelAndView、前端控制器怎样根据页面控制器返回的逻辑视图名选择详细的视图进行渲染?使用6进行解析ViewResolver、不一样的视图技术怎样使用对应的模型数据?由于是一种数据构造,很轻易支7Model Map持其他视图技术在此我们可以看出详细的关键开发环节
1、DispatcherServlet®web.xml中的布署描述,从而拦截祈求到Spring WebMVC
2、HandlerMapping的配置,从而将祈求映射到处理器
3、HandlerAdapter的配置,从而支持多种类型的处理器
4、ViewResolver的配置,从而将逻辑视图名解析为详细视图技术、处理器(页面控制器)的配置,从而进行功能处理5load-on-startup表达启动容器时初始化该;Servleturl-pattern表达哪些祈求交给处理,〃是用来定义默认映射的Spring WebMVC7servlet也可以如、*,〃表达拦截所有以为扩展名的祈求html html自此祈求已交给框架处理,因此我们需要配置的配置文献,默认Spring WebMVC SpringDispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字]-配置文献本示例为servlet.xml WEB-INF/chapter2-servlet.xmlo表达将祈求的和名字映射,如为上下文BeanNamellrlHandlerMapping URLBean URL/hell“,则配置文献必须有一种名字为〃的上下文默认忽视Spring/hell Bean,表达所有实现了SimpleControllerHandlerAdapter可以作为org.springframework.web.servlet.mvc.Controller BeanSpring中的处理器假如需要其他类型的处理器可以通过实现来处理WebMVCHadlerAdapter用于支持、视图解析;InternalResourceViewResolver ServletJSP表达模板页面需要使用标签库,中必须包括的viewClass JstIViewJSP JSTLclasspath jstl有关包;jar和查找视图页面的前缀和后缀前缀[逻辑视图名】后缀,例如传进来的逻prefix suffix辑视图名为则该该视图页面应当寄存在〃;hello,jsp WEB-INF/jsp/hello.jsp页面控制器/处理器必须实现接口,注意别选错了;后边我们会学习其他的处理器实现方式;Controllerpublic ModelAndViewhandleRequestHttpServletRequest req,功能处理措施,实现对应的功能处理,例如搜集参数、验证参数、HttpServletResponse resp绑定参数到命令对象、将命令对象传入业务对象进行业务处理、最终返回对象;ModelAndView包括了视图要实现的模型数据和逻辑视图名;ModelAndViewumv.addObjectmessage,Hello World!;〃表达添加模型数据,此处可以是任意对象;己;表POJO”11^£61^6\^^1110”11611达设置逻辑视图名为〃,视图解析器会将其解析为详细的视图,如前边的视图解析器“hello会将其解析为InternalResourceVio wResolverWEB-INF/jsp/hello.jsp”
1.init-param
2.param-namecontextConfigLocation/param-name
3.param-valueclasspath*:/springMVC.xml/param-value
4./init-param指明了配置文献的文献名,不使用默认配置文献名,而使用配置文献springMVC.xml其中・这里可以使用多种写法vparam-value**.xmlv/param value、不写,使用默认值:1/WEB-INF/vservlet-name-servlet.xml、2param-value/WEB-INF/classes/springMVC.xml/param-value、3param-valueclasspath*:springMVC-mvc.xml/param-value、多种值用逗号分隔4拦截匹配规则可以自己定义,拦截哪种合适?Servlet URL当映射为时,为例@RequestMapping/user7adeT、拦截*、例如
1.do*.htm,/user/add.do这是最老式的方式,最简朴也最实用不会导致静态文献被拦截jpg,js,css、拦截/,例如2/user/add可以实现目前很流行的风格诸多互联网类型的应用很喜欢这种风格的弊端会导致静态文献REST URLo被拦截后不能正常显示想实现风格,事情就是麻烦某些背面有处理措施还算简朴jpg,js,css REST、拦截/*,这是一种错误的方式,祈求可以走到中,但转到时再次被拦截,不能访问到3Action jspjsp
五、父子上下文WebApplicationContext如果你使用了监听器来加载配置,一般在的项目中都是使用监听listener Struts+Spring+Hibernate listener器的如下Java代码Q☆
1.listener
2..listener-classorg.springframework.web.context.ContextLoaderListener/listener-class
3./listener会创建一个上下文,称为父上下文父容器,保存在中,是Spring WebApplicationContextServletContext Key可以使用提供的工具类WebApplicationContext,ROOT WEB_APPLICATION_CONTEXT_ATTRIBUTE^]fto Spring-取出上下文对象WebApplicationContextUtils getWebApplicationContextServletContext;是一个可以同时配置多个,每个忙有一个自己的上下文对象DispatcherServlet ServletDispa herServlet称为子上下文子容器,子上下文可以访问父上下文中的内容,但父上下文不能WebApplicationContext,访问子上下文中的内容它也保存在中,ServletContext key是名称当一个寸象产生时,“org springframeworkweb servletFramewo*ServletCONTEXT+Servlet Requests会把这个子上下文对象保存在取寸象中,是WebApplicationContext RequesKey忙+可以使用工具类取出上下文对象:Dispa herServletclassgetName,.CONTEXT%RequestContextUtilsgetWebApplicationContextrequest;说明并没有限制我们,必须使用父子上下文我们可以自己决定如何使用Spring扫描指定的包中的类上的注解,常用的注解有context:component-scan/声明组件©Controller Action声明组件「©Service Service@ServicemyMovieListe声明成目件©Repository Da泛指组件当不好归类时©Component请求映射@RequestMapping7menup用于注入,提供的默认按名称装配,二©Resource j2ee@Resourcename beanName”用于注入,提供的默认按类型装配@Autowired srping事务管理@Transactional rollbackFor={Exception.class}@ResponseBody设定的作用域@Scopepprototype,r beanmvc:annotation-driven/是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配搐方案mvc:annotation-driven/会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean是spring21\/为©Controllers分发请求所必须的并提供了数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持JAXB,读写JSON的支持Jackson后面,我们处理响应ajax请求时,就使用到了对json的支持后面,对action写JUnitM元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter^^f-bean,来完成测试,取的时候要知道是mvc:annotation-driven/这一句注册的这两个bean如何替换mvc:annotation-driven/他到底做了什么工作,清看,最后面的十九节mvc:annotation-driven/到底做了什么工作mvc:interceptors/是一种简写形式通过着前面的大图,知道,我们可以配置多个HandlerMappingmvc:interceptors/会为每一个HandlerMapping,注入一个拦截器其实我们也可以手动配搐为每个HandlerMapping注入一个拦截器mvc:default-servlet-handler/使用耳认的Servle侏响应静态文件mvc:resources mapping=/images/**location=7images/cache-period=”31656g267匹配URL/images/**的URL被当做静态资源,由Spring读出到内存中再响应http
七、如何访问到静态的文件,如jpggcss如何你的DispatcherSeMet拦截“d”这样的有后缀的URL,就不存在访问不到稳态资源的问题如果你的DispatcherSeMet拦截7,为了实现REST风格,拦截了所有的请求,那么同时对*jsj.jpg等静态文件的访问也就被拦截了我们要解决这个问题目的可以正常访问铮态文件,不可以找不到粉态文件报404方案一激活Tomcat的defaidtSeMet来处理静态文件代科二☆Xml
1.servlet-mapping
2.servlet-namedefault/servlet-name
3.url-pattern*.jpg/url-pattern/servlet-mappingservlet-mapping
5.servlet-namedefault/servlet-name
6.url-pattern*.js/url-pattern
7.
8./servlet-mappingservlet-mapping
9.servlet-namedefault/servlet-name
10.url-pattern#.css/url-pattern
11.
12./servlet-mapping[
13.要酉i!置多个,每种文件酉i!置一个要写在DispatchecSeMet的前面,让defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧Tomcat.Jetty.JBoss.and GlassFish自带的默认Servlet的名字一defau代Google AppEngine自带的默认Servlet的名字一_ah_defaultResin自带的R认SeMet的名字~resin-fileWebLogic自带的默认SeMet的名字-TileServletWebSphere自带的默认SeMet的名字-SimpleFileServlet,方案二在sp「ing3O4以后版本提供了mvuresources,使用方法Xml代码D☆!■■对静态资源文件的访问~*1•
2.mvc:resources rrapping=*/iniages/#*location=,7ifnagesZM//images/**映射到ResoucceHttpRequestHandle「进行处理,location指定静态资源的位置.可以是web application根目录下、ja「包里面,这样可以把静态资源压缩到ja「包中cache-period可以使得静态资源进行web cache如果出现下面的错误,可能是没有凯^mvc:annotation・driven/的原因报错WARNING:No mappingfound forHTTP requestwith URI[/mvc/user/findUser/lisi/770]in DispatcherServletwith namespringMVC使用mvc「esou「ces/元素把mapping的URI注册到SimpleU「IHandle「Mapping的u「IMap中key为mapping的URI pattern值ffivalue^jResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由HandlerMapping转到ResoucceHttpRequestHandle「处理并返回所以就支持classpath目录ja「包内静态资源的访问.另外需要注意的一点是,不要对SimpleU「IHandle「Mapping设置defaultHandler.因为对static uci的defaidtHandle「就是ResourceHttpRequestHandler,否则无法处理static resourcesrequest方案三〉:default-servlet-handler/Xml代码J☆
1.mvc:default-servlet-handler/会把/**url.注册到SimpleUrlHandlerMapping的urlMap中把对静态资源的访问由HandlerMapping转到org springframeworkweb servletresourceDefaultServletHttpRequestHandler处理并返回DefaultServletHttpRequestHandle唯用就是各个Servlet容器自己的黔认Servlet.补充说明多个HandlerMapping的执行顺序问题DefaultAnnotationHandlerMapping的order属性值是0mvc:resources/自动注册的SimpleUrlHandlerMapping的o「dei•属性值是2147483646mvc:default-servlet-handlei7自动注册KlSimplellrlHandlerMapping的o「de「属性值是2147483647spring会先执行orde倘比较小的当访问一个a Jpg图片文件时,先通过DefaultAnnotationHandlerMapping处理器,一定是找不到的,因为我们没有叫a Jpg的Action然后再按rde嘴升序找,由于最后一个SimpleUilHandlerMapping是匹配/**”的,所以一定会匹配上,就可以响应图片访问一个图片,还要走层层匹鼠.不知拄能如何最后再说明一下,方案
二、方案三在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求如何你的DispatcherServlet拦截*C这样的URL后缀,就不存上述问题了还是有后缀方便转载请注明出处原文地址htt6〃elf
8848.iteye com/blog/875830
八、请求如何映射到具体的巾的方法?Action方案一基于xml配置映射,可以利用SimpleUCHandlerMapping、BeanNameUrlHandlerMapping进行Uri映射和拦截请一—£配置方法略方案二基于注解映射,可以使用DefaidtAnnotationHandlerMapping代码一二二Xml1・bean class=org.springframework.web.servlet.mvc.annotation.DefaultAnnotaticnHandlerKappi ng/bean但前面我们配置了vmvc:annotation-d「iven/,他会自动注册这个bean就不须要我们显示的注册这个bean了如何替换mvc:annotation-driven/他到底做了什么工作,清看,最后面的十九节mvc:annotation-driven/到底做了什么工作以上都可以注入interceptors,实现权限控制等前置工作我们使用第2种,基于注解来使用spring MVC并在action类上使用:©Controller@RequestMapping7user转载请在明田处原文地址:。
个人认证
优秀文档
获得点赞 0