SpringMVC学习笔记1----了解底层执行原理

1.SprIngMVC简介

1.为什么要学SprIng MVC?

  • 轻量级,简单易学
  • 高效,基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定大于配置
  • 功能强大:Restful,数据验证,格式化,本地化,主题等
  • 简介灵活

2.SpringMVC执行原理

1.MVC执行原理:

1.用户发送一个请求,

2.控制器接收一个请求,这里控制器的作用就是,接收请求,调用业务类,派发页面

3.控制器将请求交给模型层去处理,模型层就是dao,service,entity

4.控制器返回一个处理的结果给控制器。

5.控制器视图渲染给视图层。

6.在响应给用户。

2.Spring和SpringMvc的关系:

SpringMVC是一个MVC的开源框架,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说SpringMVC和Spring无缝集成,其实SpringMVC就是Spring的一个子模块,所以根本不需要同spring进行整合。

3.SpringMVC中的组件:

前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。

处理器映射器(HandlerMapping):根据URL去查找处理器

处理器(Handler):(需要程序员去写代码处理逻辑的)

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)

视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

4.SpringMvc底层原理

Springmvc核心三要素:

  • 处理器映射器
  • 处理器适配器
  • 视图解析器

案例理解:

准备工作:

需要导入的包

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

    </dependencies>

1.配置web.xml

 <!--注册一个DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个spring mvc的配置文件,springmvc-servlet.xml-->
        <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>

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

<mark>这里是/,它不会包含.jsp</mark>

如果是/*它会包含.jsp页面,会无限了包含.jsp.jsp最后在过滤中会出现死循环。

1 和服务器一起启动。

2.配置springmvc-servlet.xml

 <!--配置一个处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

   <!--配置一个处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

    <!--配置一个视图解析器,DispatcherServlet给它的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--配置前缀和后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
     </bean>


    <bean id="/hello" class="com.kuang.controller.HelloController"></bean>

<mark>注意这里的的前缀和后缀的配置中,后面的jsp/的后面杠不能丢。</mark>

这个表示在我们请求时,只用写一个hello就可以了,它自动配置为/WEB-INF/jsp/hello.jsp

BeanNameUrlHandlerMapping这个映射器就是专门来映射bean id=“/hello”的。还有很多映射器

3.配置HelloController

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 httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
   
       //新建一个模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在模型和视图中
        mv.addObject("msg","helloSpringmvc");

        //封装要跳转的视图,防止ModelAndView中。访问的地址就是/WEB-INF/jsp/hello.jsp
        mv.setViewName("hello");


        return mv;
    }
}

这里的Controller是导入的spring的接口包。不是其他的Controller注解

这里主要是给它哦那个模型和视图,给一个对象消息和访问的地址,最后返回就可以。

4.在/WEB-INF/jsp/下建立一个hello.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>消息</title>
</head>
<body>
${msg}

</body>
</html>

当用户请求/hello时,就可以看到在页面上的hellospringmvc消息。

<mark>执行流程:</mark>

1.先进入web.xml,找到DispatcherServlet,找到对象的配置文件,springmvc-servlet.xml

2.在springmvc-servlet.xml中,我们找到其处理器映射器,获取一个handler对象,返回。在找到一个处理器适配器HandlerAdapter,执行handler,在控制中执行,返回一个modelandview对象。

3.将MV对象交给视图层解析器去解析,返回一个解析后视图逻辑。这里就是解析前缀和后缀,并将其和hello进行拼接,找到在WEB-INF/jsp/hello.jsp文件,

4.HelloController只负责把消息丢进去,在指定的文件名上发送就可以了,最后返回一个ModerAndView对象给视图层。即第三步。

可能遇到的错误:

如果启动过程中发现有404错误,

  • 先看文件的地址有没有写对,value="/WEB-INF/jsp/"这里一个斜杠都不能少。
  • 在idea中找到project Structure->点击artifacts—>找到对应的war包----点击----看看WEB-INF中有没有出现lib,没有就自己建一个lib,----点击+号,library files—>全选包,然后导入apply应用一下即可。在重启之后就会成功。
全部评论

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务