不同的处理器映射器对URL处理的方式也不相同。
Spring MVC提供的处理器映射器:
-
BeanNameUrlHandlerMapping
此时无需使用注解
@RequestMapping("/student")
,控制器的URL路径就是控制器类的name
值。public class BeanNameUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping { // 父类除外,类中无成员变量,构造方法也只有无参构造方法。 // ...... }
配置方式是只需在Spring MVC的配置文件中通过bean标签声明处理器映射器即可。
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
使用如下:
-
spring-servlet.xml
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!--注意:name属性值需以"/"开始--> <bean name="/student" class="controller.StudentController" />
-
StudentController.java
package controller; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; // import org.springframework.stereotype.Controller; // 注意导入的Controller接口的来源,别导错了包(如上所示,此为使用@Controller注解需导入的包。如下才是使用Controller接口需导入的包)。 import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView; // 需要实现Controller接口。 public class StudentController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView("/tips.jsp"); } }
-
运行结果
根据spring-webmvc-6.0.11.jar\org\springframework\web\servlet\DispatcherServlet.properties文件可知,
BeanNameUrlHandlerMapping
为默认的处理器映射器。# Default implementation classes for DispatcherServlet's strategy interfaces. # Used as fallback when no matching beans are found in the DispatcherServlet context. # Not meant to be customized by application developers. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\ org.springframework.web.servlet.function.support.RouterFunctionMapping org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\ org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\ org.springframework.web.servlet.function.support.HandlerFunctionAdapter org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\ org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\ org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
-
-
SimpleUrlHandlerMapping
public class SimpleUrlHandlerMapping extends AbstractUrlHandlerMapping { private final Map<String, Object> urlMap = new LinkedHashMap(); // ...... public void setMappings(Properties mappings) { CollectionUtils.mergePropertiesIntoMap(mappings, this.urlMap); } public void setUrlMap(Map<String, ?> urlMap) { this.urlMap.putAll(urlMap); } // ...... }
与
BeanNameUrlHandlerMapping
不同的是,SimpleUrlHandlerMapping
处理器解析器解析的URL路径与控制器的id
及name
无关,即控制器类的路径可自行随意设置,与其id
和name
属性无关。<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <!-- 通过上述类中的setMappings(Properties mappings)方法可知, 我们可通过Properties方式来为类中成员变量urlMap赋值。 --> <property name="mappings"> <props> <!--key为控制器类的路径值,value为控制器类的id值。--> <prop key="/student">studentController</prop> </props> </property> </bean> <bean id="studentController" class="controller.StudentController" />
控制器类的实现与上述StudentController.java一致。
在Spring中,Controller注解(@Controller
)用于指示Spring类的实例是一个控制器,相对于实现Controller接口变得更加简单。实现Controller接口只能处理一个单一的请求,而使用@Controller
注解可以支持同时处理多个请求动作,更加灵活。@Controller
用于标记一个类,使用他标记的类就是一个SpringMVC Controller对象,即一个控制器类,Spring使用扫描机制查找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解,使用了@RequestMapping
注解的方法才是真正处理请求的处理器。