spring与servlet注解,servlet和mvc的关系
在此图像中,HTTP请求向dispatcher servlet发送了一些内容。
我的问题是dispatcher servlet要做什么。
就像从网页上获取信息并扔进控制器一样吗?
dispatcher servlet的工作是获取传入的URI,找到处理程序(通常是Controller类上的方法)和视图(通常是JSP )的正确组合,并形成应该在该位置找到的页面或资源
我可能有
文件/WEB-INF/jsp/pages/Home.jsp
类上的方法
@ request mapping (value='/pages/home.html ' ) )
私有模型地图构建主页(
return somestuff;
}
当浏览器请求页面时,dispatcher servlet是一个“确定”调用方法的比特,它通过组合与该比特匹配的JSP文件来创建html文档。
这取决于您的配置和Spring版本。
也没有理由最终结果必须是网页。 找到RMI端点并处理SOAP请求和可能进入servlet的操作也可以这样做。
伟大的riposte现在成了问题。 dispatcher servlet也如何识别类名和方法名? 是否可以查看两个类和两个方法的名称以及显示dispatcher servlet如何捕获正确请求的配置示例?
实际上,它会在启动时扫描类路径以查找注释,并将“/pages/Home.html”映射到“类方法”。 两种方法都包含'/pages/Home.html ',如果注释没有其他限制,则会出现错误并抛出异常。 对于旧式学校,也可以将其与XML相关联。
使用基于注释的@RestController时,是否需要dispatcher servlet XML文件?
即使使用了注释或xml配置,也必须在web.xml的@viper中配置调度程序servlet。
在Spring MVC中,所有传入请求都通过单个servlet。 此servlet-dispatcher servlet -是前端控制器。 前端控制器是web APP应用程序开发中的典型设计模式。 在这种情况下,一个servlet将接收所有请求并将其转发给APP应用程序的所有其他组件。
dispatcher servlet的任务是向特定的Spring MVC控制器发送请求。
通常有很多控制器,dispatcher servlet通过浏览以下映射器之一来确定目标控制器:
BeanNameUrlHandlerMapping;
controllerbeannamehandlermapping;
controllerclassnamehandlermapping;
defaultannotationhandlermapping;
简单握手映射。
如果配置未运行,则缺省情况下,dispatcher servlet将使用BeanNameUrlHandlerMapping和defaultannotationhandlermapping。
确定目标控制器后,dispatcher servlet将发送请求。 控制器根据需要执行一些工作
或委托给其他对象,然后返回到具有模型名称和视图名称的dispatcher servlet。
视图的名称只是逻辑名称。 然后使用逻辑名称查找实际的View (以避免控制器与特定View合并)。 然后,dispatcher servlet引用ViewResolver并将View的逻辑名称映射到View的特定实现。
ViewResolver的一些可能实现如下:
BeanNameViewResolver;
内容导航查看器;
FreeMarkerViewResolver;
内部资源查看器;
JasperReportsViewResolver;
ResourceBundleViewResolver;
TilesViewResolver;
UrlBasedViewResolver;
VelocityLayoutViewResolver;
VelocityViewResolver;
XmlViewResolver;
XsltViewResolver。
dispatcher servlet确定了要显示结果的视图后,会将其作为响应进行显示。
最后,dispatcher servlet将Response对象返回给客户端。
dispatcher servlet是Spring MVC对前端控制器模型的实现。
在这里看Sp
ring文档中的描述。
本质上,它是一个servlet,它接收传入的请求,并将对该请求的处理委托给多个处理程序之一,这些处理程序的映射在DispatcherServlet配置中是特定的。
这是Flex中的事件吗,我从一个MXML向另一个或服务器分配事件。我的应用程序中可以有多个DispatcherServlet吗?每个类文件都有单独的DispatcherServlet吗?
通常只有一个前端控制器。这与您拥有的模型和视图无关。它只是将特定的模型和视图组合在一起。
@theband:如果您的体系结构更有意义,则可以有多个DispatcherServlets,但通常没有理由。
我知道这个问题已被标记为已解决,但是我想添加一个更新的图像来详细解释此模式(来源: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)运回到客户端。
我见过的最出色的Dispatcher servlet解释。先生那太好了。
我有一个问题,在返回我们在浏览器中看到的JSON对象的情况下,它如何选择视图?如果未选择逻辑视图,它会返回相同的URI吗?
@Nesrin自问起已经很久了,但是这里有一个答案:您在@Controller方法上方放置了一个特殊的注释,称为@ResponseBody,指示返回的响应应直接写在HTTP响应主体上,而不是放在模型中或以任何观点解决。
我们可以说像DispatcherServlet一样处理Spring MVC中的所有事情。
在Web容器启动时:
DispatcherServlet将通过调用来加载和初始化
init()方法
DispatcherServlet中的init()将尝试识别弹簧
具有命名约定的配置文档,例如
"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);
}
...
}
因此,通常在DispatcherServlet中捕获请求URI并移交给HandlerMapping。 HandlerMapping使用控制器方法搜索映射bean,其中控制器返回逻辑名(视图)。然后,此逻辑名由HandlerMapping发送到DispatcherServlet。然后DispatcherServlet通过附加前缀和后缀告诉ViewResolver提供视图的完整位置,然后DispatcherServlet将视图提供给客户端。
这是一个很好的解释。您的第二点说,DispatcherServlet将尝试使用诸如" servlet_name-servlet.xml"的命名约定来识别Spring Configuration Document。但是,我看到的项目仅使用了" dispatcher"之类的名称,并且效果很好。我也尝试过。但是我不知道为什么?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
图中显示了Dispatcher Controller,所有传入的请求都被充当前端控制器的分派器servlet拦截。
调度程序servlet从XML文件获取处理程序映射的条目,并将请求转发到Controller。