• SpringMVC 配置文件详解


    HandlerMapping    处理器映射

    HTTP请求被DispatcherServlet拦截后,会调用HandlerMapping来处理,HandlerMapping根据 url<=>controller 之间的映射关系来确定要调用哪个controller来处理。

    有2种HandlerMapping:

    • BeanNameUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean name="/userController" class="com.chy.controller.UserController" />
    http://localhost:8080/springmvc_war_exploded/userController

    BeanNameUrl,顾名思义,映射关系是BeanName <=> Url,url地址对应bean的name,根据url中的beanname确定要调用的controller。

    • SimpleUrlHandlerMapping

        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <!-- 使用props配置url-controller之间的映射关系 -->
                <props>
                    <!-- 一个prop配置一个映射,key指定url,value指定bean的id或name。可使用多个prop。 -->
                    <prop key="/userController">userController</prop>
                </props>
            </property>
        </bean>
        
        <bean name="userController" class="com.chy.controller.UserController" />
    http://localhost:8080/springmvc_war_exploded/userController

    url是/userController,去<props>中找到key=/userController的<prop>,得到要调用的controller的name或id。


    HandlerAdapter   处理器适配器

    HandlerMapping确定要调用的controller后,将要调用的controller告诉DispatcherServlet,

    由DispatcherServlet调用controller所属的HandlerAdapter,再由HandlerAdapter来调用controller。

    HandlerAdapter有2种:

    • SimpleControllerHandlerAdapter(推荐)

        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
    public class UserController implements Controller {
        @Override
        public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
            //视图可以在构造器中指定,也可以先使用空参构造器,在调用setter方法设置
            ModelAndView mav = new ModelAndView("user_info");
            User user = new User();
            user.setUsername("chy");
            user.setPassword("abcd");
            //向视图传递数据
            mav.addObject("user", user);
            return mav;
        }
    }

    SimpleControllerHandlerAdapter,名字中有Controller,实现的自然是Controller接口。

    方法要返回一个ModelAndView类型的值。

    这个ModelAndView由controller返回给HandlerAdapter,再由HandlerAdapter返回给DispatcherServlet。

    DispatcherServlet调用配置的ViewResolver来解析ModelAndView,获取里面的model(数据)、view(视图名),并将数据、视图名返回给DispatcherServlet。

    DispatcherServelt对View进行渲染(把模型数据填入视图中),把渲染好的视图返回个浏览器。

    所以需要搭配ViewResolver使用:

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!--后缀-->
            <property name="suffix" value=".jsp" />
    </bean>

    视图解析器也有好几种,此处不再一一介绍。

    • HttpRequestHandlerAdapter

    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
    public class UserController implements HttpRequestHandler{
        @Override
        public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
            User user = new User();
            user.setUsername("chy");
            user.setPassword("abcd");
    
            //向视图传递数据
            httpServletRequest.setAttribute("user",user);
    
            //将请求转发到视图(地址栏的url不变)
            RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher("/WEB-INF/jsp/user_info.jsp");
            dispatcher.forward(httpServletRequest,httpServletResponse);
        }
    }

    适配器与实现的接口是对应的。使用请求转发实现,返回值是void。

    ViewResolver是解析ModelAndView用的,既然返回值是void,就不使用视图解析器,没有视图名的拼接,需要写视图的完整路径。

    此种方式是Servlet的实现方式,不建议使用。尽量使用ModelAndView的方式,更加符合mvc的思想。

  • 相关阅读:
    MySQL Thread Pool: Problem Definition
    MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
    Mysql源码目录结构
    android学习18——对PathMeasure中getPosTan的理解
    android学习17——命令行建gradle工程
    android学习16——library project的使用
    android学习13——android egl hello world
    ant编译java的例子
    android学习12——重载SurfaceView一些方法的执行顺序
    Visual Studio命令行创建库文件lib
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12241396.html
Copyright © 2020-2023  润新知