配置SpringMVC中的映射器和适配器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/82775064

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
  1. 在用SimpleUrlHandlerMapping映射Handler时,url不用配置"/"
  2. prop key方式,key是URL模式,属性值是Handler的ID或者名字。
  3. 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

就可以访问到对应的视图了。

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/82775064