SpringMVC-01-HelloSpringMVC

1、所需依赖

相关说明都写在了注释上

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bing</groupId>
    <artifactId>SpringMVC</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>SpringMVC-01-servlet</module>
    </modules>

    <dependencies>
<!--        junit:4.12-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
<!--        MVC的包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
<!--        servlet2.5-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>

<!--        支持jsp中的一些表达式的-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

</project>

2、HelloSpringMVC

2.1、跟着官网敲一遍

1、配置 DisparateServlet,web.xml

  • 作用:它用来管理所有的Controller层的servlet,让我们以后的servlet都不要配置了
<!--1.注册DispatcherServlet-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--启动级别-1-->
    <load-on-startup>1</load-on-startup>
</servlet>

<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

2、配置bean

  • 处理映射器

  • <!--添加 处理映射器-->
     <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>

3、编写Controller,并把它配置到Spring中

public class ControllerDemo01 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

        //封装对象,放在ModelAndView中。Model
        mv.addObject("msg","HelloSpringMVC!");
        //封装要跳转的视图,放在ModelAndView中
        mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
        return mv;
    }
}
  • 装配到Spring中
<bean id="/hello" class="com.bing.controller.ControllerDemo01"/>

4、测试

5、遇到的问题

发现代码都没写错,缺报错很可能是idea项目结构中没导入jar包的问题,为什么会出现这个问题呢?因为我们一上来建的是普通的maven项目,所以idea不会自动添加依赖到项目中

像jar问题之前还遇到过servlet的jar包和Tomcat不匹配的情况

而此时解决方案是:在项目结构中手动导入

SpringMVC-01-HelloSpringMVC

问题解决~

2.2、解释原理

SpringMVC-01-HelloSpringMVC

0、知识补充

全部的SpringMVC是围绕着DispatcherServlet进行展开的,翻译是调度Servelt

0.1、分析url

其实url是由很多部分组成:举例子:

http://localhost:8080/SpringMVC/hello

片段 作用
http/https 网络协议
localhost:8080 服务器域名
SpringMVC 表示部署在服务器上的站点
hello hello表示控制器

1、DispatcherServlet

  • HanderMapping:由DispatcherServlet调用,来查找所对应的hander

  • HanderExcute:用HanderMapping调用,来查找具体的控制器,本例中就是hello,并携带它返回给DispatcherServlet

  • HanderAdapter:DispatcherServlet调用HanderAdapter,其按照特定的规则去执行HandlerHandler让具体的Controller执行 在由这个适配器通过hander携带的信息调用对应的控制层controller,携带或者解析控制层传过来的信息在传递给DispatcherServlet,如ModelAndView

  • 视图解析器:DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

    视图解析器将解析的逻辑视图名传给DispatcherServlet。

    DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

    最终视图呈现给用户。

2.3、运行过程

1、客户访问url,之间请求DispatcherServlet

SpringMVC-01-HelloSpringMVC

说明:<url-pattern>/</url-pattern> 中填/ 和/* 的区别:

  • / 代表很处理所有/ 下的controller
  • / * 范围更大包括了jsp html css···

所以我们选用 ‘/’

2、到springmvc-servlet.xml中寻找

找到这个控制器(/hello)封装成handler对象返回给DispatcherServlet

SpringMVC-01-HelloSpringMVC

3、通过HanderAdapter找到controller并执行

SpringMVC-01-HelloSpringMVC

返回ModleAndView给DiapatcherServlet

4、携带ModleAndView访问视图过滤器

SpringMVC-01-HelloSpringMVC

视图过滤器渲染页面又返回给DiapatcherServlet

2.3、精简一下

  1. 配web.xml

  2. BeanNameUrlHandlerMapping
    
  3. SimpleControllerHandlerAdapter
    
  4. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
  5. <!--    控制器-->
        <bean id="/hello" class="com.bing.controller.ControllerDemo01"/>
    
上一篇:描述一下 DispatcherServlet 的工作流程?


下一篇:7.【原创】Spring Mvc自定义DispatcherServlet类,处理404异常