资源描述
核心架构详细流程环节如下:
1、 一方面顾客发送祈求——>DispatcherServlet,前端控制器收到祈求后自己不进行解决,而是委托给其她解析器进行解决,作为统一访问点,进行全局流程控制;
2、 DispatcherServlet——>HandlerMapping, HandlerMapping将会把祈求映射为HandlerExecutionChain对象(包括一种Handler解决器(页面控制器)对象、各种HandlerInterceptor拦截器)对象,通过这种方略模式,很容易添加新映射方略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把解决器包装为适配器,从而支持各种类型解决器,即适配器设计模式应用,从而很容易支持诸多类型解决器;
4、 HandlerAdapter——>解决器功能解决办法调用,HandlerAdapter将会依照适配成果调用真正解决器功能解决办法,完毕功能解决;并返回一种ModelAndView对象(包括模型数据、逻辑视图名);
5、 ModelAndView逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为详细View,通过这种方略模式,很容易更换其她视图技术;
6、 View——>渲染,View会依照传进来Model模型数据进行渲染,此处Model实际是一种Map数据构造,因而很容易支持其她视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给顾客,到此一种流程结束。
此处咱们只是讲了核心流程,没有考虑拦截器、本地解析、文献上传解析等,后边再细述。
到此,再来看咱们前边提出问题:
1、 祈求如何给前端控制器?这个应当在web.xml中进行布置描述,在HelloWorld中详细解说。
2、 前端控制器如何依照祈求信息选取页面控制器进行功能解决? 咱们需要配备HandlerMapping进行映射
3、 如何支持各种页面控制器呢?配备HandlerAdapter从而支持各种类型页面控制器
4、 如何页面控制器如何使用业务对象?可以预料到,必定运用Spring IoC容器依赖注入功能
5、 页面控制器如何返回模型数据?使用ModelAndView返回
6、 前端控制器如何依照页面控制器返回逻辑视图名选取详细视图进行渲染? 使用ViewResolver进行解析
7、 不同视图技术如何使用相应模型数据? 由于Model是一种Map数据构造,很容易支持其她视图技术
在此咱们可以看出详细核心开发环节:
1、 DispatcherServlet在web.xml中布置描述,从而拦截祈求到Spring Web MVC
2、 HandlerMapping配备,从而将祈求映射到解决器
3、 HandlerAdapter配备,从而支持各种类型解决器
4、 ViewResolver配备,从而将逻辑视图名解析为详细视图技术
5、解决器(页面控制器)配备,从而进行功能解决
load-on-startup:表达启动容器时初始化该Servlet;
url-pattern:表达哪些祈求交给Spring Web MVC解决, “/” 是用来定义默认servlet映射。也可以如“*.html”表达拦截所有以html为扩展名祈求。
自此祈求已交给Spring Web MVC框架解决,因而咱们需要配备Spring配备文献,默认DispatcherServlet会加载WEB-INF/[DispatcherServletServlet名字]-servlet.xml配备文献。本示例为WEB-INF/ chapter2-servlet.xml。
BeanNameUrlHandlerMapping:表达将祈求URL和Bean名字映射,如URL为 “上下文/hello”,则Spring配备文献必要有一种名字为“/hello”Bean,上下文默认忽视。
SimpleControllerHandlerAdapter:表达所有实现了org.springframework.web.servlet.mvc.Controller接口Bean可以作为Spring Web MVC中解决器。如果需要其她类型解决器可以通过实现HadlerAdapter来解决。
InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
viewClass:JstlView表达JSP模板页面需要使用JSTL标签库,classpath中必要包括jstl有关jar包;
prefix和suffix:查找视图页面前缀和后缀(前缀[逻辑视图名]后缀),例如传进来逻辑视图名为hello,则该该jsp视图页面应当存储在“WEB-INF/jsp/hello.jsp”;
org.springframework.web.servlet.mvc.Controller:页面控制器/解决器必要实现Controller接口,注意别选错了;后边咱们会学习其她解决器实现方式;
public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse resp) :功能解决办法,实现相应功能解决,例如收集参数、验证参数、绑定参数到命令对象、将命令对象传入业务对象进行业务解决、最后返回ModelAndView对象;
ModelAndView:包括了视图要实现模型数据和逻辑视图名;“mv.addObject("message","Hello World!");
”表达添加模型数据,此处可以是任意POJO对象;“mv.setViewName("hello");”表达设立逻辑视图名为“hello”,视图解析器会将其解析为详细视图,如前边视图解析器InternalResourceVi。wResolver会将其解析为“WEB-INF/jsp/hello.jsp”。
1. <init-param>
2. <param-name>contextConfigLocation</param-name>
3. <param-value>classpath*:/springMVC.xml</param-value>
4. </init-param>
指明了配备文献文献名,不使用默认配备文献名,而使用springMVC.xml配备文献。
其中<param-value>**.xml</param-value> 这里可以使用各种写法
1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml
2、<param-value>/WEB-INF/classes/springMVC.xml</param-value>
3、<param-value>classpath*:springMVC-mvc.xml</param-value>
4、各种值用逗号分隔
Servlet拦截匹配规则可以自已定义,拦截哪种URL适当?
当映射为@RequestMapping("/user/add")时,为例:
1、拦截*.do、*.htm, 例如:/user/add.do
这是最老式方式,最简朴也最实用。不会导致静态文献(jpg,js,css)被拦截。
2、拦截/,例如:/user/add
可以实现当前很流行REST风格。诸多互联网类型应用很喜欢这种风格URL。
弊端:会导致静态文献(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦某些。背面有解决办法还算简朴。
3、拦截/*,这是一种错误方式,祈求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。
展开阅读全文