servlet — SpringMVC工作原理

如下图,所有实线的部分都由 SpringMVC 框架实现,我们的代码只需要处理虚线的部分:

【总结】:

DispatchServlet(请求分发器 / 前端控制器), 是SpringMVC的核心

1. 用户发起请求的时候调用前端控制器 DispatcherServlet;

2. DispatcherServlet 会根据用户的请求找到HandlerMapping 映射器,HandlerMapping 将映射的URL 返回给DispatcherServlet;

3. DispatcherServlet 调用 HandlerAdapter 适配器,根据映射的URL地址找到对应的Controller,Controller 执行后返回 ModelAndView 给 DispatcherServlet;

4. DispatcherServlet 调用视图解析器配置ModelAndView,视图解析器将结果返回给DispatcherServlet;

5. DispatcherServlet 将最终的 View 视图层页面返回给用户。

SpringMVC 的底层还是由 JavaWeb 中学过的 Servlet 实现的,利用SpringMVC框架我们可以将Servlet分离出来:

在 web.xml 配置DispatchServlet:

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <servlet>
        <servlet-name>servletDispatch</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        关联 spring 配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
<!--        启动级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>servletDispatch</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

配置完web.xml后,下面介绍 springmvc 中,servlet 的两种写法:

写法一:(不推荐)

在 springmvc-sevlet.xml 配置spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>-->
    <!--    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>-->

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

<!--    Handler-->
        <bean id="/hello" class="com.edward.controller.HelloController"/>
</beans>

在 HelloController 编写 Controller:

package com.edward.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {

        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "hello,controller");
        mv.setViewName("hello");
        return mv;
    }
}

写法二:(推荐!)

在 springmvc-sevlet.xml 配置spring配置文件:(bean自动装配, 去掉mapping配置)

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.edward.controller"/>
    <mvc:default-servlet-handler />
    <mvc:annotation-driven />

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

在 HelloController 编写 Controller:

package com.edward.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String test1 (Model model) {
        model.addAttribute("msg", "hello, controller2234");
        return "hello";
    }
}

最终的目录结构:

[踩坑]:

访问出现404:

1. 查看控制台输出,看一下是否少了什么jar包

2. 如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖

3. 重启 Tomcat 即可解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值