SpringMVC中的映射器到底是干什么的?
根据DispatcherServlet传递过来的url地址,找到对应的Handler处理器。(Controller,可以理解为web中的servlet)
适配器呢?
处理器适配器按照他要求的规则:比如实现Controller接口。
根据xml配置映射器的三种方法:
第一种:BeanNameUrlHandlerMapping
将Bean的name作为url进行查找,需要配置Handler时指定Bean的name就是url
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
根据fruits.action的url查找到FruitsController这个handler处理器。
<bean name="/fruits.action" class="controller.FruitsController"></bean>
第二种:SimpleUrlHandlerMapping
- 在用SimpleUrlHandlerMapping映射Handler时,url不用配置"/"
- prop key方式,key是URL模式,属性值是Handler的ID或者名字。
- BeanNameUrlHandlerMapping还可以配置拦截器,这里没写。
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="fruits.action">fruitsController</prop>
</props>
</property>
</bean>
<bean id="fruitsController" class="controller.FruitsController"></bean>
注意:
如果设置了两个不同的url映射,但是对应的都是同一个Controller配置,那么也就是说浏览器发出两个不同的URL请求,会得到相同的处理结果。
第三种:ControllerClassNameHandlerMapping
这个就不多介绍了,容易出错,个人觉得前两个就ok了。
根据xml配置适配器的两种方法:
方法1:只要处理器实现了Controller接口就执行它的具体方法
<!--配置适配器 只要编写了实现了Controller接口的控制器,适配器就会执行Controller的具体方法-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
方法2:SimpleControllerHandlerAdapter:不多介绍了。
总结:xml配置映射器和适配器:
但缺点也很明显,一个处理器只能编写一个方法,如果是大量请求的话,就很麻烦了。不过这种问题可以通过注解的映射器和适配器很好的解决。
使用注解配置映射器和适配器:
使用注解
才是大部分开发人员使用的主流配置方式,因为只需要在制定的地方声明一些注解信息即可。
第一步:声明映射器和适配器
和之前的非注解处理器映射器的配置一样,声明相关的bean。
方法1:手动配置
<!--注解配置映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!--注解配置适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
方法2:<mvc:annotation-driven>
标签自动注册处理器映射器和适配器。
还支持数据绑定支持,默认配置代替手动配置,更常用。
<mvc:annotation-driven></mvc:annotation-driven>
它添加的映射器和适配器:
映射器:RequestMappingHandlerMapping
适配器:RequestMappingHandlerAdapter
注意:有个问题会报错:
添加<mvc:annotation-driven></mvc:annotation-driven>
的时候,自动添加Bean内容:
xmlns:mvc="http://www.springframework.org/schema/cache"
解决方案:
参考:https://stackoverflow.com/questions/24816502/cachemanager-no-bean-found-not-trying-to-setup-any-cache
应该改为:
xmlns:mvc="http://www.springframework.org/schema/mvc"
还要在springmvc.xml中配置bean,为了让注解的处理器映射器和适配器可以找到注解的处理器。
有两种方法:
方法1:添加单个bean:
<bean class="controller.FruitsController"></bean>
方法2:使用扫描配置:
对一个包下的所有类进行扫描找出所有标识注解的处理器类:
<context:component-scan base-package="controller"></context:component-scan>
完整的springmvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven></mvc:annotation-driven>
<!--<bean class="controller.FruitsController"></bean>-->
<context:component-scan base-package="controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
因为使用了注解,所以不需要再xml中配置其他信息,处理类也不需要实现接口,只需要再处理类的java类中添加相应的注解就可以了。
控制器类:
//标识是一个控制器,可以被处理器适配器找到
@Controller
public class FruitsController {
private FruitService fruitService = new FruitService();
//@RequestMapping实现将queryList方法和url进行映射,一个方法对应一个url
//一般建议将url设置和方法写一样
@RequestMapping("/queryList")
public ModelAndView queryList() {
List<Fruit> list = fruitService.queryFruitsList();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("fruits",list);
System.out.println(modelAndView.getModelMap());
modelAndView.setViewName("/WEB-INF/jsp/fruitsList.jsp");
return modelAndView;
}
class FruitService{
public List<Fruit> queryFruitsList(){
List<Fruit> list = new ArrayList<Fruit>();
list.add(new Fruit("苹果",5));
list.add(new Fruit("火龙果",7));
list.add(new Fruit("雪莲果",4));
return list;
}
}
}
注意我的web.xml:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
所以:
http://localhost:8080/SpringMVC_test/queryList.action
就可以访问到对应的视图了。