SpringMVC的简单讲解

什么是MVC

MVC : 模型、视图、控制器 , 是一种软件设计规范,说明不是设计模式;

本质:将业务逻辑 , 数据 , 显示 分离的方式来编写代码; 前后端分离;

Model:数据模型,提供要展示的数据,一般我们都会把这两个分离开来 , 数据Dao,服务层Service。

View :负责进行数据的渲染和展示;客户端想要看到的东西

Controller:接收用户请求,交给Model处理,从Model更新后的数据或者结果,返回给前端。调度员

面向接口编程;

最典型的案例就是:JSP:View + Servlet:Controller + JavaBean:Model;

Model1

在早期的Web开发中,就是用的Model1模式

只有两层:视图层和模型层;

在这里插入图片描述优点:架构简单,适合小型项目开发;

缺点:JSP职责不单一 , 承受它不该承受的压力,不便于维护;

Model2

将项目分为三个模块:M:模型 V:视图 C :控制器

在这里插入图片描述职责分析:

controller:

  • 取得表单的数据
  • 调用业务的逻辑方法
  • 转向指定的页面

Model:

  • Dao:操作数据库
  • Service:业务逻辑
  • 保存数据的更新状态

View:

  • 显示页面

Model2优化了Model1时代的缺点,让所有层职责更加分明;降低了维护难度,

SpringMVC

Struct1/2 :比较简单 , 更简单SpringMVC;

在这里插入图片描述

什么是是SpringMVC

SpringMVC 是 Spring的一部分,是基于Java实现的MVC的轻量级Web框架

我们为什么要学习SpringMVC

  • 趋势,使用的人多。
  • 简单,易学,轻量级
  • 高效,基于请求和响应的MVC框架;
  • 约定优于配置;
  • 功能强大:RestFul、数据验证、格式化{json}、主题,本地化、异常处理…

官网上说Spring的web模块提供了大量独特的功能,包括:

清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(form object)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都可以由一个专门的对象(类)来实现。< Bean>

强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,而且支持跨多个context 的引用。

可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。

可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象, 需要手动解析它并转换到业务对象。

可定制的handler mapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。

灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。

可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。

简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大灵活性。

JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。

Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 准确的说,这并非Spring MVC框架本身特性,而应归属于Sping MVC使用的WebApplicationContext容器。

正因为SpringMVC较Struct2好 , 简单 , 便捷 , 易学 , 天生和Spring无缝集成(使用SpringIoC和Aop) , 使用约定优于配置 . 能够进行简单的junit测试 . 支持Restful风格 .异常处理 , 本地化 , 国际化 , 数据验证 , 类型转换 , 拦截器 等等…所以我们要学习 .

SpringMVC框架围绕着DispatcherServlet(Servlet请求分发器)设计;

The DispatcherServlet

在这里插入图片描述在这里插入图片描述

SpringMVC的实现

SpringMVC项目的创建

1.我们先要创建好web项目,和之前的创建maven项目非常相似,但是这里需要导入模板,也就是在Create from archetype那一栏需要勾选上,如箭头1所示

之后再下面的模板中选择箭头2所指的,需要注意,我们选择的模板在下面存在同名,我们选中的模板后最下面那一栏显示的内容应该想箭头3所指的一样,选择完成后点击next
在这里插入图片描述之后给项目起名
在这里插入图片描述第一栏就是我们安装好的maven文件的路径,点击下拉菜单可以选中,之后两个Override全部勾选;

第二栏选中的是apache-maven-3.6.1文件下的conf文件下的settings.xml文件;直接选中

第三栏是我们自己定义的仓库目录也就是Repository目录,我自己创建的仓库目录在apache-maven-3.6.1目录下,直接选中

选完后点击next
在这里插入图片描述查看项目名有无问题
在这里插入图片描述点击finish,项目创建完毕

2.在创建完成后,我们需要设置一下目录图标的颜色,以便进行区分,点击箭头所指的图标
在这里插入图片描述选择Modules一栏,选择需要标记的文件夹,选中后在Mark as一栏中选择颜色,这样就为需要标记的文件夹选好了颜色,选择完成后点击Apply,标记生效
在这里插入图片描述3.至此,我们的一些设置才完成,下面讲解代码实现

在项目下创建如图所示的目录
在这里插入图片描述
还有一点,需要打开Tomcat服务,这样在编写完程序我们才能进行测试,关于Tomcat如何安装及打开这里不再讲解,读者自行查阅

SpringMVC的代码实现

1.首先在pom.xml文件中添加我们需要的一些依赖

第一个就是

<!--解决资源导出问题-->
<resources>
  <resource>
    <directory>src/main/java</directory>
    <includes>
      <include>**/*.properties</include>
      <include>**/*.xml</include>
    </includes>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>src/main/resources</directory>
    <includes>
      <include>**/*.properties</include>
      <include>**/*.xml</include>
    </includes>
    <filtering>false</filtering>
  </resource>
</resources>

导入这个依赖是防止在资源导出时候出现问题

之后我们需要导入junit包、Spring MVC 及 Spring系列包、Servlet核心包以及JSTL包

<!--junit包单元测试-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

<!-- Spring MVC 及 Spring系列包 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>4.3.24.RELEASE</version>
</dependency>

<!--jstl 和 jsp的包-->

<!--Servlet核心-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

<!-- JSTL -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

在导入上面的所有包后所有的依赖导入完成

2.在导入依赖完成后我们需要在web.xml文件中进行一些注册

Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet ,能做的比这更多。它与Spring IOC容器做到了无缝集成,这意味着,Spring提供的任何特性,在Spring MVC中你都可以使用。 下图展示了Spring Web MVC的DispatcherServlet 处理请求的工作流。熟悉设计模式的朋友会发现, DispatcherServlet应用的其实就是一个“前端控制器”的设计模式(其他很多优秀的 web框架也都使用了这个设计模式)。
在这里插入图片描述>DispatcherServlet 其实就是个 Servlet (它继承自 HttpServlet 基类),同样也需要在你 web应用的 web.xml 配置文件下声明。你需要在web.xml文件中把你希望DispatcherServlet处理的请求映射到对应的URL上去。

我们在web.xml中

<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

所有路径以 / 开头的请求都会被名字为SpringMVC的DispatcherServlet处理

需要在第一个servlet标签中添加下面所示的代码:

<!--关联SpringMVC配置文件-->
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>

关联SpringMVC配置文件

为了让它和服务器一起启动,还需要第一个servlet标签中添加

<!-- load-on-startup,启动级别,数字越小级别越高!-->
<load-on-startup>1</load-on-startup>

我们还需要注册index.jsp

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

所以完整的web.xml中的内容为

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">


  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联SpringMVC配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!--这个东西要和服务器一起启动;
    load-on-startup,启动级别,数字越小级别越高!-->
    <load-on-startup>1</load-on-startup>
  </servlet>


  <!--所有请求都会经过这个DispatcherServlet请求分发器-->
  
  <!--
  /和/*的区别:
  < url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;
    即:.jsp不会进入spring的 DispatcherServlet类 。
  < url-pattern > /* </ url-pattern > 会匹配*.jsp,
    会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
  -->
  
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

3.因为在web.xml文件中有关联SpringMVC配置文件,所以我们还需要创建一个关联SpringMVC配置文件,因为遵循约定优于配置原则,所以这个配置文件中的大部分内容都是官方直接给出的,我们直接使用即可

文件的开头为:

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

直接从官网上面复制粘贴即可

在这个文件中我们还需要添加

1.
<!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
<context:component-scan base-package="com.kuang.controller"/>

2.
<!--annotation-driven:支持MVC注解驱动 -->
<mvc:annotation-driven/>

3.
<!--
视图解析器
作用;方便统一管理
-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
</bean>

上面的这3个部分是SpringMVC配置文件3个不能缺少的部分

至此SpringMVC配置文件配置文件编写完成,完整代码为

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

    <!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
    <context:component-scan base-package="com.kuang.controller"/>

    <!--静态资源过滤-->
    <mvc:default-servlet-handler/>

    <!--annotation-driven:支持MVC注解驱动 -->
    <mvc:annotation-driven/>
    
    <!--
    视图解析器
    作用;方便统一管理
    -->
    <bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>


</beans>

4.在完成上述代码的编写后我们就需要写controller包下的类了

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

    //请求映射("路径")
    @RequestMapping("/hello")
    public String hi(Model model){
        model.addAttribute("msg","Hello,SpringMVC");
        System.out.println("进入HELLO");
        return "hello"; //WEB-INF/jsp/hello.jsp
    }

}

5.因为在处理完请求后会返回到hello界面,所以我们这里还需要写上一个hello.jsp,这个文件的位置就放在WEB-INF下的jsp目录下,因为在WEB-INF下的文件不会被从外界访问到
文件中的代码为:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC</title>
</head>
<body>

${msg}

</body>
</html>

还有index.jsp文件中的内容为:

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

至此代码编写完成,我们进行测试

启动Tomcat服务,程序运行完成后跳转到浏览器界面
在这里插入图片描述显示的是index.jsp文件中写的内容

当我们在后面天上请求路径hello时
在这里插入图片描述可以看到跳转到我们在controller目录下的HelloWorldController类中写好的内容,程序测试完成

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值