1.SpringMVC基础知识

SpringMVC基础知识

一,MVC设计模式

  • 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
  • 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
  • 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。

MVC应该是耳熟能详的基本知识,从最开始学习JavaEE开始,最早接触的就是JSP+JavaBean的开发模式,JSP 用于处理用户请求,JavaBean 用于封装和处理数据。

JSP+JavaBean

学过JSP+JavaBean之后又接触Servlet+JSP+JavaBean的开发模式

Servlet+JSP+JavaBean 模式的结构清晰,是一个松耦合架构模式

Servlet+JSP+JavaBean

我记得在这这本书,里面说Servlet消灭了大量的JSP中的代码,在实际学习过程中确实深有体会(但是仍然不能否认这是本十八流教材)。

image-20210808201937602

二.SpringMVC的特点

为了使Spring可插入的MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而在使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作为web开发的控制器框架

需要注意的是Spring基础上开发的框架所以在环境依赖就会有Spring的身影,并且在SpringMVC使用过程中会出现很多Spring 的设计思想(只是在学完配置环境时候的想法)

在C语言中文网教程中给出了Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架的评价

优点有

  • 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职,各负其责。
  • 灵活的配置功能,可以把类当作 Bean 通过 XML 进行配置。
  • 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
  • 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
  • 国际化支持
  • 面向接口编程
  • 与 Spring 框架无缝集成

说这么多,好用就完事儿了,比之前直接使用Servlet开发又快又优雅

三.SpringMVC的运行流程

数据流模型图

1.请求:从客户端来的信息到达DispatcherServlet,DispatcherServlet拦截所有请求发送给处理器映射

2.解析:数据从DispatcherServlet到处理器映射就是处理url中的信息,比如/后面的名字,比如/Sayhello 它会解析到Sayhello这个Controller,包括多种Controller跳转,如/Hello/Sayhello。

3.返回Controller信息,包括名字和参数。

4.传递Controller信息到处理器适配器,它会检索控制器。选择合适参数的对应控制器

5.根据处理器适配器的信息,发送信息到控制器

6.控制器做好数据处理,通常的步骤有

  • 收集数据

  • 调用业务对象

  • 响应处理

    做好处理之后会带着视图和数据模型(就是需要返回给用户并在浏览器上显示的信息,通常还会格式化)返回给处理器适配器

7.处理器适配器处理好视图名字(也就是return的字符串)给DispatcherServlet

8.DispatcherServlet带着视图名字给视图解析器,它会检索视图(比如JSP,HTML之类的),之后组装成URL.。

9.数据返回给DispatcherServlet

10.DispatcherServlet带着数据模型和URL组装成视图

11.响应:程序作出响应也就时我们看到了网页响应

注:SpringMVC的三大组件:处理器适配器,视图解析器,处理器映射器

四,第一个SpringMVC程序

1.环境配置

1.项目的创建

​ (坑)选择Module Webapp,注意不要选错了,是Maven标准的

image-20210808212516127

(坑)在此处可以最好更换为自己的仓库,以及加上archetypeCatalog=internal 否则构建项目极慢(因为下载不了某个配置文件)

image-20210808212729693

创建好项目之后记得补全Maven标准目录

image-20210808213014742

2.插件的准备

为了提高效率和心情愉悦,必须安排JRebel等热部署插件,大大缩短编码等待时间

image-20210808213429414

由于插件收费,作为初学者实在负担不起

所以如下步骤激活

1.生成一个GUID

​ 可以使用这个地址获取Generate GUIDs online (guidgen.com)

2.根据反向代理服务器地址拼接激活地址

​ 服务器地址: https://jrebel.qekang.com/{GUID}

​ 如果失效刷新GUID替换就可以

来自:博客园-工匠精神

3.Tomcat的配置

​ 在这里直接选择Tomcat即可,进入后选择自己的项目部署,不多说了。

image-20210808213855452

4.Maven依赖

​ 之前提到过需要Spring依赖,所以Spirng必须有再加上Spring-MVC和Spring-web以及Servlet-api,由于maven的特性会自动的下载相互依赖的Jar包所以只需要添加 SpringMVC和Servlet的依赖

2.配置SpringMVC

1.web.xml中配置DispatcherServlet

如下配置

<servlet>
     <!--配置Servlet -->
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
     <!--确定Spring配置文件 此处使用了通配的写法-->
      <param-value>classpath:/SpringMVC/SpringMvc_*.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
      <!--指定相对于Servlet的URL的路径,此处特别注意!-->  
    <url-pattern>/</url-pattern>
  </servlet-mapping>

细节:在指定指定相对于Servlet的URL的路径时,SpringMVC使用的是“/”,而不是“/*”

/ 模式下,Servlet不会拦截 .jsp(仅限于此,.html仍会被拦截)格式的请求;

而 /* 模式才是真正意义上的拦截所有形式的请求。

查看Tomcat的配置文件

发现web容器拦截了.jsp(Tomcat默认的servlet)

所以使用/*会发现转发不了页面,出现404

image-20210808225502877

2.配置SpringMVC_config.xml

SpringMVC是Spring的衍生产品,所以使用和Spring 一样的DTD即可,由于idea的自带模板不全所以直接用下面的DTD

<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-4.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 <beans/>

开发SpringMVC使用注解开发所以需要加入注解扫描、

 <!--注解扫描-->
<context:component-scan base-package="#方式自定"/>
<!--创建处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" id="requestMappingHandlerMapping"/>
<!--c'jian-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" id="requestMappingHandlerAdapter"/>
<!--创建视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
         <!--也就是转发到什么样的页面,比如页面的逻辑名字(Cotroller返回的字符串)为index则组装出来的Url为 /index.jsp-->
        <!--组装前缀-->
        <property name="prefix" value="/"/>
        <!--组装后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

配置方案mvc:annotation-driven

但是SpringMVC加入< mvc:annotation-driven/>配置方案,可以让初学都快速应用默认配置方案,包括了

  • 会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter
  • 提供了数据绑定支持
  • @NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能

所以我们可以写成

 	<context:component-scan base-package="#方式自定"/>
    <mvc:annotation-driven/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

3.编写Controller

1.@Controller和@RequestMapping

@Controller:是@Component的衍生注解,作用是创建对象

@RequestMapping:是请求路径,其中有个值为value,用于指定某个Controller的位置

  • 修饰范围: 用在方法或者类上
  • 注解作用: 用来指定类以及类中方法的请求路径
  • 注解位置:注解在类上则给所有方法给了一个统一的请求路径,在访问方法时需要加上类的路径

2.编写控制器类

@Controller("test")
//加在类上以后先访问类
//@RequestMapping(value = "HelloGroup")
public class TestController {
    @RequestMapping(value = "Sayhello")
    public  String SayHello(){
        System.out.println("TestController.SayHello");
        //页面逻辑名字
        return "index";
    }
}

3.测试

我们输入一下URL

image-20210808232451722

可以看见正常转发

接着取消第三行注释

image-20210808232551861

发现转发失败

再接着加上类的访问路径

image-20210808232633380

又可以看见正常转发

posted on 2021-08-08 23:36  NathenJames  阅读(113)  评论(0编辑  收藏  举报