Kev*_*vin 176 java spring spring-mvc
在这张图片中(我从这里得到),HTTP请求向Dispatcher Servlet发送了一些内容.
我的问题是Dispatcher Servlet的作用是什么?
是否就像从网页上抛出信息并将其丢给控制器?
Aff*_*ffe 189
DispatcherServlet的工作是获取传入的URI并找到正确的处理程序组合(通常是Controller类上的方法)和视图(通常是JSP),它们组合起来形成应该在该位置找到的页面或资源.
我可能有
/WEB-INF/jsp/pages/Home.jsp
和课堂上的方法
@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
Run Code Online (Sandbox Code Playgroud)该调度的servlet是"知道"该位调用该方法,当浏览器请求的页面,其结果与匹配的JSP文件相结合,使HTML文档.
它如何实现这一点因配置和Spring版本而异.
最终结果也没有理由是网页.它可以做同样的事情来定位RMI端点,处理SOAP请求,任何可以进入servlet的东西.
Ale*_*kov 63
在Spring MVC中,所有传入的请求都通过一个servlet.这个servlet - DispatcherServlet
是前端控制器.前端控制器是Web应用程序开发中的典型设计模式.在这种情况下,单个servlet接收所有请求并将它们传输到应用程序的所有其他组件.
该任务的任务DispatcherServlet
是将请求发送到特定的Spring MVC控制器.
通常我们有很多控制器,并且DispatcherServlet
为了确定目标控制器而引用以下映射器之一:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
.如果没有配置执行的DispatcherServlet
用途BeanNameUrlHandlerMapping
和DefaultAnnotationHandlerMapping
默认.
识别目标控制器后,DispatcherServlet
向其发送请求.控制器根据请求执行一些工作(或将其委托给其他对象),然后返回到DispatcherServlet
带有Model和View的名称.
View的名称只是一个逻辑名称.然后使用此逻辑名称搜索实际视图(以避免与控制器和特定视图耦合).然后DispatcherServlet
引用ViewResolver
并将View的逻辑名称映射到View的特定实现.
一些可能的实现ViewResolver
是:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
.当DispatcherServlet
确定将显示结果的视图时,它将呈现为响应.
最后,DispatcherServlet
将Response
对象返回给客户端.
Edu*_*rdo 39
我知道这个问题已被标记为已解决,但我想添加一个更新的图像来详细解释这个模式(来源:spring in action 4):
说明
当请求离开浏览器(1)时,它携带有关用户要求的信息.至少,请求将携带请求的URL.但它也可能携带其他数据,例如用户以表格提交的信息.
请求旅行的第一站是Spring的DispatcherServlet.与大多数基于Java的Web框架一样,Spring MVC通过单个前端控制器servlet汇集请求.前端控制器是一种常见的Web应用程序模式,其中单个servlet将对请求的责任委托给应用程序的其他组件以执行实际处理.在Spring MVC的情况下,DispatcherServlet是前端控制器.DispatcherServlet的工作是将请求发送到Spring MVC控制器.控制器是处理请求的Spring组件.但是典型的应用程序可能有多个控制器,DispatcherServlet需要一些帮助来决定将请求发送到哪个控制器.因此,DispatcherServlet会查询一个或多个处理程序映射(2),以确定请求的下一个停止位置.处理程序映射在做出决策时特别关注请求所携带的URL.一旦选择了适当的控制器,DispatcherServlet就会以愉快的方式将请求发送到所选的控制器(3).在控制器处,请求丢弃其有效载荷(用户提交的信息)并在控制器处理该信息时耐心地等待.(实际上,设计良好的控制器本身很少或根本不执行处理,而是将业务逻辑的责任委托给一个或多个服务对象.)控制器执行的逻辑通常会导致一些需要传回的信息用户并在浏览器中显示.该信息称为模型.但是将原始信息发送回用户是不够的 - 它需要以用户友好的格式(通常是HTML)格式化.为此,需要将信息提供给视图,通常是JavaServer Page(JSP).控制器最后做的事情之一是打包模型数据并识别应该呈现输出的视图的名称.然后,它将请求以及模型和视图名称发送回DispatcherServlet (4).因此,控制器不会耦合到特定视图,传递回DispatcherServlet的视图名称不会直接标识特定的JSP.它甚至不一定表明视图是JSP.相反,它只带有一个逻辑名称,用于查找将产生结果的实际视图.DispatcherServlet查询视图解析器(5)以将逻辑视图名称映射到特定的视图实现,该实现可能是也可能不是JSP.既然DispatcherServlet知道哪个视图将呈现结果,那么请求的作业几乎已经结束.它的最后一站是视图实现(6),通常是JSP,它提供模型数据.请求的工作终于完成了.该视图将使用模型数据来呈现将由(不那么勤奋)响应对象(7)传送回客户端的输出.
我们可以说像DispatcherServlet
在Spring MVC中处理一切.
在Web容器启动时:
DispatcherServlet
将通过调用init()
方法加载和初始化
init()
的DispatcherServlet
会尝试与命名约定像识别Spring配置文件
"servlet_name-servlet.xml"
,然后所有的bean可以被识别.例:
public class DispatcherServlet extends HttpServlet {
ApplicationContext ctx = null;
public void init(ServletConfig cfg){
// 1. try to get the spring configuration document with default naming conventions
String xml = "servlet_name" + "-servlet.xml";
//if it was found then creates the ApplicationContext object
ctx = new XmlWebApplicationContext(xml);
}
...
}
Run Code Online (Sandbox Code Playgroud)
因此,通常DispatcherServlet
捕获请求URI并移交给HandlerMapping
.HandlerMapping
使用控制器方法搜索映射bean,其中控制器返回逻辑名称(视图).那么这个逻辑名称是发送到DispatcherServlet
通过HandlerMapping
.然后通过附加前缀和后缀DispatcherServlet
告诉ViewResolver
提供完整的视图位置,然后DispatcherServlet
给客户端查看.