SpringMVC框架的介绍与使用详解

目录
  • SpringMVC介绍
  • SpringMVC特点
  • SpringMVC框架部署
  • SpringMVC框架使用
  • 静态资源放行配置

SpringMVC介绍

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为ssm。Spring MVC是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互。
为什么叫MVC呢,这是因为,M是模型(Model):模型数据,主要处理业务逻辑;视图(View):呈现模型,主要用与用户进行交互;控制器(Controller):负责接收并处理请求,响应客户端

SpringMVC特点

上面介绍了SpringMVC的概念,接下来介绍它的特点:

  • SpringMVC遵守了MVC分层思想,上面提到有Model,View,Controller三层结构。
  • 采用了松耦合、插件式结构;相比较于我们封装的BaseServlet以及其他的一些MVC框架来说更灵活、更具扩展性
  • SpringMVC是基于Spring的扩展、提供了一套完善的MVC注解,如RequestMapping,RequestBody,ResponseBody等,后面会讲到。
  • SpringMVC在数据绑定、视图解析都提供了多种处理方式,可灵活配置
  • SpringMVC对RESTful URL设计方法提供了良好的支持,支持Restful风格。

因此,综上而言,SpringMVC的本质工作就是:
1.接收并解析请求
2.处理请求
3.数据渲染、响应请求

SpringMVC框架部署

首先创建一个Web工程,在Web工程中添加以下依赖:

<properties>
    <spring.version>5.2.13.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>

接下来创建的SpringMVC配置文件,在resources目录下创建名为spring-servlet.xml的文件

<?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:aop="http://www.springframework.org/schema/aop"
       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
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	<!--IoC采用注解配置-->
    <context:annotation-config/>
    <context:component-scan base-package="com.mvc"/>

    <!--  声明MVC使用注解驱动  -->
    <mvc:annotation-driven/>

</beans>

然后在web.xml中配置SpringMVC的前端控制器:
SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求交由SpringMVC处理。

<?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_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-servlet.xml</param-value> //添加配置文件的路径
        </init-param>
        <load-on-startup>1</load-on-startup> //初始化
    </servlet>
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

SpringMVC框架使用

首先创建一个控制器的类,在SpringMVC中,我们把接收用户请求、处理用户请求的类称之为Controlelr(控制器)
我们创建一个控制器:

  • 创建一个名为com.mvc.controllers的包(包需要在Spring注解扫描的范围内)
  • 创建一个类(无需做任何的继承和实现)
  • 在类上添加@Controller注解声明此类为SpringMVC的控制器
  • 在类上添加@RequestMapping("访问路径")声明此控制器类的请求url(可以省略)
@Controller
@RequestMapping("/book")
public class BookController {
}

在控制器类中定义处理请求的方法

  • 在一个控制器类中可以定于多个方法处理不同的请求
  • 在每个方法上添加@RequestMapping("访问路径")用于声明当前方法请求的url
@Controller
@RequestMapping("/book")
public class BookController {

    @RequestMapping("/add")
    public void addBook(){
        System.out.println("---book add");
    }

    @RequestMapping("/list")
    public void listBooks(){
        System.out.println("---book list");
    }
}

接下来部署静态资源:
静态资源是指项目中的HTML、css、js、图片、字体等

/* 和 / 的区别

/* 拦截所有的HTTP请求,包括.jsp的请求,都做为控制器类的请求路径来处理

/ 拦截所有的HTTP请求,但不包括.jsp的请求,不会放行静态资源的请求(html/css/js/图片)

静态资源放行配置

在springMVC的配置文件,添加如下静态资源放行的配置

<!--配置静态资源放行-->
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/imgs/**" location="/imgs/"/>
<mvc:resources mapping="/pages/**" location="/pages/"/>

前端提交数据到控制器
输入框需要提供name属性,SpringMVC控制器是通过name属性取值的

<body>
    <h3>添加图书</h3>
    <form action="book/add" method="post">
        <p>图书名称:<input type="text"/></p>
        <p>图书作者:<input type="text"/></p>
        <p>图书价格:<input type="text"/></p>
        <p><input type="submit" value="提交"/></p>
    </form>
</body>

URL提交

<a href="book/add?bookName=Java" rel="external nofollow" >URL提交</a>

AJAX提交:请求行、请求头、请求体都可以用来传值

<input type="button" value="ajax提交" id="btn1"/>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
    $("#btn1").click(function(){
        var obj = {};
        obj.bookName = "Java";
        obj.bookAuthor="张三";
        obj.bookPrice = 3.33;

        $.ajax({
            url:"book/add",
            type:"post",
            headers:{

            },
            contentType:"application/json",
            data:obj,
            success:function(res){
                console.log(res);
            }
        });
    });
</script>

控制器接收前端提交的数据

@RequestParam 接收请求行传值

  • 表单提交
  • URL提交
  • $.ajax()请求的url传值
  • . p o s t ( ) / .post()/.post()/.get()中的{}传值

**@RequestParam**注解用于接收请求行传递的数据

前端提交数据

<form action="book/add" method="post">
    <p>图书名称:<input type="text" name="name"/></p>
    <p>图书作者:<input type="text" name="author"/></p>
    <p>图书价格:<input type="text" name="price"/></p>
    <p><input type="submit" value="提交"/></p>
</form>

控制器接收数据

/*接收请求行数据*/
@RequestMapping("/add")
public void addBook(@RequestParam("name") String a,
                    @RequestParam("author") String b,
                    @RequestParam("price") double c){
    System.out.println("---book add");
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
}

注意如果控制器方法中接收数据的参数名与请求行传值的key一致,则@RequestParam注解可省略

@RequestMapping("/add")
public void addBook(String name,String author, double price){
    System.out.println("---book add");
    System.out.println(name);
    System.out.println(author);
    System.out.println(price);
}

前端:

<input type="button" value="ajax提交" id="btn1"/>
    <script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
    <script type="text/javascript">
        $("#btn1").click(function(){
            $.ajax({
                url:"book/list",
                type:"post",
                headers:{
                    token:"wahahaawahaha"
                },
                success:function(res){
                    console.log(res);
                }
            });
        });
    </script>

控制器

@RequestMapping("/list")
public void listBooks(@RequestHeader("token") String token){
    System.out.println("---book list");
}

ajax封装请求体数据

$.ajax({
    ...,
    contentType:"application/json",
    data:obj,,
    ...
})

**@RequestBody**注解用于接收请求行头传递的数据

前端:

<input type="button" value="ajax提交" id="btn1"/>
    <script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
    <script type="text/javascript">
        $("#btn1").click(function(){
            var obj = {};
            obj.bookName = "Python";
            obj.bookAuthor="杰哥";
            obj.bookPrice = 2.22;

            var s = JSON.stringify(obj); //将对象转换成JSON格式

            $.ajax({
                url:"book/update",
                type:"post",
                contentType:"application/json",
                data:s,   //如果data的值为json格式字符串,contentType必须设置为"application/json"
                success:function(res){
                    console.log(res);
                }
            });
        });
    </script>

@RquestBody 将前端请求体提交的JSON格式数据转换成Java对象,依赖jackson包

导入jackson依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
</dependency>

控制器

@RequestMapping("/update")
public void update(@RequestBody Book book){
    System.out.println("---book update");
    System.out.println(book);
}

控制器响应前端请求

控制器响应同步请求

同步请求:form、超链接

处理同步请求的方法的返回类型定义为String或者ModelAndView,以实现页面的跳转

返回类型为String

转发

@RequestMapping("/add")
public String addBook(String name, String author, double price){
    System.out.println("---book add");
    return "/tips.jsp";
}

重定向

@RequestMapping("/add")
public String addBook(String name, String author, double price){
    System.out.println("---book add");
    return "redirect:/tips.jsp";
}

返回类型为 ModelAndView

转发

@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
    System.out.println("---book add");
    ModelAndView modelAndView = new ModelAndView("/tips.jsp");
    return modelAndView;
}

重定向

@RequestMapping("/add")
public ModelAndView addBook(String name, String author, double price){
    System.out.println("---book add");
    ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp");
    return modelAndView;
}

控制器响应异步请求

异步请求:ajax请求

使用response中的输出流进行响应

  • 控制器方法的返回类型为void
  • 控制器方法添加 HttpServletResponse response参数
  • 在方法中通过response获取输出流,使用流响应ajax请求
@RequestMapping("/update")
public void update(@RequestBody Book book, HttpServletResponse response) throws IOException {
    System.out.println("---book update");
    System.out.println(book);

    //使用ObjectMapper将对象转换成JSON格式字符串
    String s = new ObjectMapper().writeValueAsString(book);
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    out.println(s);
    out.flush();
    out.close();
}

直接在控制器方法返回响应的对象

  • 控制器方法的返回类型设置为响应给ajax请求的对象类型
  • 在控制器方法前添加@ResponseBody注解,将返回的对象转换成JSON响应给ajax请求
  • 如果一个控制器类中的所有方法都是响应ajax请求,则可以直接在控制器类前添加@ResponseBody注解
@RequestMapping("/update")
@ResponseBody
public List<Book> update() {
    System.out.println("---book update");
    List<Book> books = new ArrayList<Book>();
    books.add(new Book(1,"Java","老张",2.22));
    books.add(new Book(2,"C++","老李",3.22));
    return books;
}

控制器响应同步请求的数据传递

对于同步请求的转发响应,我们可以传递参数到转发的页面

返回类型为String:

//1.在控制器方法中定义一个Model类型的参数
//2.在return页面之前,向model中添加键值对,添加的键值对就会被传递到转发的页面
@RequestMapping("/add")
public String addBook(String name, String author, double price,Model model){
    model.addAttribute("key1","value1");
    model.addAttribute("book",new Book(1,"Java","老张",2.22));
    return "/tips.jsp";
}

//除了使用Model对象传值外,还可以直接使用HttpServletRequest对象
@RequestMapping("/add")
public String addBook(String name, String author, double price,HttpServletRequest request){
    request.setAttribute("key1","value1");
    request.setAttribute("book",new Book(1,"Java","老张",2.22));
    return "/tips.jsp";
}

返回类型为ModelAndView:

@RequestMapping("/add2")
public ModelAndView addBook2(String name, String author, double price){

    ModelAndView modelAndView = new ModelAndView("/tips.jsp");
    modelAndView.addObject("key1","value1");
    modelAndView.addObject("book",new Book(1,"Java","老张",2.22));
    return modelAndView;
}

到此这篇关于SpringMVC框架的介绍与使用的文章就介绍到这了,更多相关SpringMVC介绍与使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringMVC+Shiro的基本使用及功能介绍

    目录 一.介绍 二.基本功能 三.使用Maven包 四.用户登录 五.Reaml 六.登录失败次数限制 七.退出登录 八.创建Ecache缓存以及时效 一.介绍 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了.对于它俩到底哪个好,这个不必纠结,能更简单的解决项目问

  • SpringMVC使用MultipartFile 实现异步上传方法介绍

    目的是实现异步上传 1.添加pom依赖 添加pom依赖,因为用的ajax,数据需要转成json的格式进行传输,所以还有加入一个JSON jar包: <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>

  • SpringMVC配置与使用详细介绍

    目录 一.SpringMVC的使用 1.MVC模式 2.具体的坐标如下 3.配置DispatcheServlet 4.编写springmvc.xml的配置文件 二.SpringMVC原理 1.SpringMVC中心控制器 2.入门案例的执行流程 一.SpringMVC的使用 1.MVC模式 Spring mvc是基于Spring的一个模块,专门做web开发,可以理解为是Servlet的升级 在Spring MVC框架当中,Controller替代Servlet担负控制器的职能, **M:**指m

  • SpringMVC框架的介绍与使用详解

    目录 SpringMVC介绍 SpringMVC特点 SpringMVC框架部署 SpringMVC框架使用 静态资源放行配置 SpringMVC介绍 SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为ssm.Spring MVC是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互.为什么叫MVC呢,这是因为,M是模型(Mo

  • Django框架视图介绍与使用详解

    本文实例讲述了Django框架视图介绍与使用.分享给大家供大家参考,具体如下: 视图 视图:即一个python函数,可以叫 视图函数,或者简称 视图,定义在 应用/views.py 文件中. 作用:接收并处理请求,调用M和T,响应请求(返回HttpResponse或其子类) 每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,再返回html页面内容给浏览器显示. URL配置及匹配 作用:建立url地址和视图函数的对应关系,当用户请求某个url地址时,让django能找到对应的视图

  • IDEA SSM框架整合配置及步骤详解

    参考 狂神说SpringMVC05:整合SSM框架 https://mp.weixin.qq.com/s?__biz=Mzg2NTAzMTExNg==&mid=2247484004&idx=1&sn=cef9d881d0a8d7db7e8ddc6a380a9a76&scene=19#wechat_redirect 前言 根据自己的环境参考狂神的视频进行了SSM框架整合,用于备忘 SSM框架整合步骤 1. 创建数据库 2. IDEA创建maven项目.在pom.xml中设设置

  • Java Spring框架简介与Spring IOC详解

    目录 Spring简介和配置 1.Spring概述 1.1 spring 是什么 1.2 Spring发展历程 1.3 Spring的优势 (理解) \1. 方便解耦,简化开发 \2. AOP 编程的支持 \3. 声明式事务的支持 \4. 方便程序的测试 \5. 方便集成各种优秀框架 \6. 降低 JavaEE API 的使用难度 \7. Java 源码是经典学习范例 1.4 Spring的体系结构(了解) 2.Spring IoC快速入门 2.1 IoC的概念和作用 2.2 Spring Io

  • SpringMVC整合SSM实现异常处理器详解

    目录 异常处理器 项目异常处理方案 项目异常处理代码实现 根据异常分类自定义异常类 自定义异常编码(持续补充) 触发自定义异常 异常处理器 程序开发过程中不可避免的会遇到异常现象 出现异常现象的常见位置与常见诱因如下: 框架内部抛出的异常:因使用不合规导致 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时) 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等) 表现层抛出的异常:因数据收集.校验等规则导致(例如:不匹配的数据类型间导致异常) 工具类抛出的

  • springmvc与mybatis集成配置实例详解

    简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.ve

  • SpringMVC的执行流程及组件详解

    这篇文章主要介绍了SpringMVC的执行流程及组件详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.核心模块 数据库访问技术与集成:JDBC.XML等 Web与远程调用技术:SpringMVC.WebServlet.WebSocket等 面向切面编程:AOP 基础设施:Tomcat Spring核心容器:Beans.Core.Context.Expression.ContestSupport 测试:Test 二.执行流程 1.用户通过页

  • python框架flask表单实现详解

    这篇文章主要介绍了python框架flask表单实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 表单 表单用于注册,修改用户数据等场景. flask-wtf提供了一个包,可以创建表单:pip install flask-wtf 为了防止跨域请求,flask_wtf自己生成一个秘钥,用秘钥生成加密口令,然后用口令验证表单中的数据真伪(是否被篡改过) from flask import Flask from flask import req

  • springmvc处理模型数据ModelAndView过程详解

    这篇文章主要介绍了springmvc处理模型数据ModelAndView过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springmvc提供了以下几种途径来输出模型数据: (1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据. (2)Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMa

  • Java下Struts框架中的ActionForm类详解

    ActionForm的应用 (1) .创建一个form类必须继承四个父类中的一个.比如继承ActionForm. (2) .一个form类中的每一个属性都将和页面中form 表单中的每一个元素一一对应 例如. 一个表单为: <form> <input type="text" name="username"></input> <input type="password" name="passwor

随机推荐