前置控制器(DispatcherServlet)使用HandlerMapping来将URL映射到控制器类。因为想了解框架背后的原理,所以我没有使用注释。
为了达到这个目的,我创建了一个基于Spring MVC的简单Web应用程序,下面是代码:
Controller 代码:
public class SimpleSpringController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) throws Exception {
ModelAndView mw = new ModelAndView("welcome","welcomeMessage", "welcome user!");
return mw;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<display-name>FirstSpringMVCProject</display-name>
<servlet>
<servlet-name>spring-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Spring xml configuration
<beans>
<bean id="HandlerMapping1" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean name="/welcome" class="com.example.controller.SimpleSpringController"/>
<bean id="viewResolver1" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"> <value>/WEB-INF/</value> </property>
<property name="suffix"> <value>.jsp</value> </property>
</bean>
</beans>
应用程序按预期工作。
我无法理解的概念在于Spring配置文件中指定
HandlerMapping
和ViewResolver
实现的部分。例如,在上述Spring XML配置中,我们有以下bean定义:
<bean id="HandlerMapping1" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
在上面的xml配置中,
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
是HandlerMapping
接口的实现之一。这个bean的id是
HandlerMapping1
,只是一个随机标识符(我也可以选择MyHandlerMapping
)。以下是疑问:
谁读取这个配置文件?前端控制器读取这个配置文件吗?
框架如何知道上述情况下
HandlerMapping
实现的id是HandlerMapping1
。通常我们会使用getBean("beanId")来获取特定的bean id,我们如何知道spring框架自动推断出这是HandlerMapping
的实现类呢?