Spring MVC相关注解运用 —— 下篇

news2024/12/24 9:25:31

目录

一、@ResponseBody、@RestController

1.1. JSP页面

1.2 放行静态资源

1.3 编写实体类

1.4 控制器方法

1.5 添加依赖

1.6 测试结果

1.7 @RestController 

二、静态资源映射

2.1 配置静态资源筛查器

2.2 配置静态资源资源映射器

2.3 配置默认Servlet处理静态资源

三、@RequestBody

3.1 AJAX请求发送JSON格式的参数

3.2 控制器方法

3.3 测试结果

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章 


一、@ResponseBody、@RestController

作用:方法返回的对象转换为JSON格式,并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可以处理Ajax请求。
位置:方法上方或方法返回值前

1.1. JSP页面

编写jsp页面,发送ajax请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ajax请求</title>
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
        $(function (){
            $("#btn").click(function (){
                var name = $("#name").val();
                var sex = $("#sex").val();
                $.get("/c8/addStudent",{"name":name,"sex":sex},function (data){
                    console.log(data);
                });
            });
        });
    </script>
</head>
<body>
    姓名:<input id="name"/><br/>
    性别:<input id="sex"/><br/>
    <input type="button" value="提交" id="btn">
</body>
</html>

1.2 放行静态资源

由于jsp页面中引入jQuery的js文件(该.js文件可以去我的资源里面去下载),而SpringMVC会拦截所有资源,造成jquery.js失效,需要在SpringMVC核心配置文件中放行静态资源。

<!-- 放行静态资源 -->
    <mvc:default-servlet-handler />

1.3 编写实体类

编写结果实体类,该实体类会封装一个请求的结果

package com.example.domain;

// 请求的结果对象
public class Result {
    // 请求是否成功
    private boolean flag;
    // 请求提示信息
    private String message;

    public Result(boolean flag, String message) {
        this.flag = flag;
        this.message = message;
    }

    public Result(){}

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

1.4 控制器方法

package com.example.controller;

import com.example.domain.Result;
import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/c8")
public class MyController8 {

    @GetMapping ("addStudent")
    @ResponseBody
    public Result addStudent(String name,String sex){
        // 输出接受的参数,模拟添加学生
        System.out.println(name+":"+sex);
        // 返回添加结果
        Result result = new Result(true,"添加学生成功!");

        return result;
    }
}

1.5 添加依赖

在pom.xml文件添加对应依赖,SpringMVC会将Result对象转为JSON格式写入输出流,而
SpringMVC默认使用的JSON转换器是jackson,需要在pom中添加jackson依赖。

    <!-- jackson -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.11.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.11.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.11.3</version>
    </dependency>

1.6 测试结果

当我们访问jsp时,访问路径:http://localhost:8080/ajax-request.jsp

点击提交之后:打开开发者工具,可以看到控制台都成功打印了,说明已经成功转为json格式了。

1.7 @RestController 

如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转,可以使用@RestController代替@Controller,此时每个方法上的@ResponseBody都可以省略。

二、静态资源映射

当在DispatcherServlet的 <url-pattern> 中配置拦截 “/” 时,除了jsp文件不会拦截以外,其他所有的请求都会经过前端控制器进行匹配。此时静态资源例如css、js、jpg等就会被前端控制器拦截,导致不能访问,出现404问题。想要正常映射静态资源共有三种方案:

2.1 配置静态资源筛查器

在SpringMVC的配置文件中配置<mvc:default-servlet-handler />后,会在Spring容器中创建一个资源检查器,它对进入DispatcherServlet的URL进行筛查,如果不是静态资源,才由
DispatcherServlet处理。
修改SpringMVC核心配置文件:

<mvc:default-servlet-handler/> 

2.2 配置静态资源资源映射器

SpringMVC模块提供了静态资源映射器组件,通过 <mvc:resources> 标签配置静态资源映射器,配置后的路径不会由DispatcherServlet处理。
修改SpringMVC核心配置文件:

<!-- 配置静态资源映射器 -->
    <!-- mapping:配置请求的URL location:资源路径 -->
    <mvc:resources mapping="/img/" location="/img/"/>
    <mvc:resources mapping="/js/" location="/js/"/>

2.3 配置默认Servlet处理静态资源

在web.xml可以配置默认Servlet处理静态资源,该Servlet由tomcat提供,它会直接访问静态资源不进行其他操作。这样就避免了使用DispatcherServlet对静态资源的拦截:
修改web.xml:

  <!-- 配置默认Servlet处理静态资源 -->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>

三、@RequestBody

作用:将请求中JSON格式的参数转为JAVA对象
位置:写在方法参数前

3.1 AJAX请求发送JSON格式的参数

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ajax请求</title>
    <script src="js/jquery-2.1.1.min.js"></script>
    <script>
        $(function (){
            $("#btn").click(function (){
                var name = $("#name").val();
                var sex = $("#sex").val();
                var param = JSON.stringify({"name":name,"sex":sex});
                $.ajax({url:"/c8/addStudent2",contentType:"application/json",
                    type:"post",
                    data:param,
                    success:function(data) {
                        console.log(data);
                    }
                })
            })
        })
    </script>
</head>
<body>
姓名:<input id="name"/><br/>
性别:<input id="sex"/><br/>
<input type="button" value="提交" id="btn">
</body>
</html>

3.2 控制器方法

package com.example.controller;

import com.example.domain.Result;
import com.example.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/c8")
public class MyController8 {
    @PostMapping("/addStudent2")
    @ResponseBody
    public Result addStudent2(@RequestBody Student student){
        System.out.println(student);
        // 返回添加结果
        Result result = new Result(true,"添加学生成功!");
        return result;
    }
}

3.3 测试结果

OK,可以看出确实是成功实现了,也打印出来了,说明请求中JSON格式的参数成功转为JAVA对象了

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章 

SpringMVC系列专栏Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇

Spring MVC相关注解运用 —— 中篇

Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Element UI日期组件-选择月份具体到当月最后一天

Element已有的月份选择组件&#xff0c;只能展示开始月份的1号到结束月份的1号&#xff08;例如&#xff1a;开始月份为3月&#xff0c;结束月份为3月&#xff0c;input框内只能展示2023-03-01至2023-03-01&#xff09;&#xff0c;但是我们的需求想要展示的是2023-03-01至2023…

AIGC - Stable Diffusion 超分辨率插件 StableSR v2 (768x768) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131582734 论文&#xff1a;Exploiting Diffusion Prior for Real-World Image Super-Resolution StableSR 算法提出了一种新颖的方法&#xff0…

【Java项目】Vue+ElementUI+Ceph实现多类型文件上传功能

文章目录 前端后端Java 前端 ElementUI 文件上传的页面使用的是ElementUI的 下面是index.vue页面&#xff0c;有点小bug&#xff08;但是我真改不动&#xff0c;前端还在学习中&#xff09; <template><div><el-uploadclass"upload-demo":action&qu…

1.浮动 ( float )

学习目标&#xff1a; 1.1 传统网页布局的三种方式 网页布局的本质——用 CSS来摆放盒子&#xff0c;把盒子摆放到相应位置 CSS提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序) : ●普通流(标准流) ●浮动 ●定位 1.2 标准流(普通流/文档流) 所谓的标准流&#xf…

Go基础知识学习

文章目录 介绍背景和起源特点和优势 安装和设置下载和安装Go语言配置Go环境变量GOROOT和GOPATHGOPROXY 编辑器、IDE等工具Hello, World!基本结构和数据类型关键字标识符变量常量基本数据类型类型转换 控制流程数组和切片数组切片 函数定义和调用函数函数参数和返回值 结构体和方…

Jmeter学习笔记

Jmeter学习笔记 1、安装 1.1、下载 官方地址&#xff1a;https://archive.apache.org/dist/jmeter/binaries/ 1.2、环境变量 此电脑 --> 属性 --> 高级系统设置 --> 环境变量 设置JMETER_HOME&#xff0c;值为jmeter的路径D:\apache-jmeter-4.0 设置Path&…

【设计模式】第十四章:策略模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

scanpy sc.pp.normalize_per_cell bug

今天遇到一个很奇怪的bug, 当今天跑covid_atlas数据集的时候&#xff0c;在123服务器总是报错&#xff0c;但是我记得在122服务器上是跑过没问题的 最终的测试结果如下 import scanpy as sc import numpy as np from QUEST import QUEST from QUEST.utils import get_free_…

【MySQL】简介 MySQL 事务

一、事务 ACID 原则 什么是事务呢&#xff1f;事务通常是一个或一组 SQL 组成的&#xff0c;组成一个事务的 SQL 一般都是一个业务操作&#xff0c;例如下单操作&#xff1a;【扣库存数量、增加订单详情记录、插入物流信息】&#xff0c;这一组 SQL 就可以组成一个事务。 而数据…

推特开始限制用户可以阅读的推文数量

推特正在限制用户可以阅读的推文数量&#xff0c;因为埃隆马斯克 (Elon Musk) 拥有的服务长期中断&#xff0c;阻碍了用户跟踪新帖子的能力。 在一条推文中&#xff0c;马斯克详细介绍了修改后的使用配额。 经过验证的帐户持有者每天最多可以浏览 6000 个帖子&#xff0c;而未…

docker的联合文件系统 UnionFS《深入docker底层原理》

介绍 docker最大的贡献就是定义了容器镜像的分层的存储格式&#xff0c;docker镜像技术的基础是联合文件系统(UnionFS)&#xff0c;其文件系统是分层的。这样既可以充分利用共享层&#xff0c;又可以减少存储空间占用。 联合挂载系统的工作原理&#xff1a;读&#xff1a;如果…

结束 guard else 只能使用 return ?

Guard 语句 A guard statement is used to transfer program control out of a scope if one or more conditions aren’t met. 如果一个或者多个条件不成立&#xff0c;可用 guard 语句来退出当前作用域 (guard所在的作用域)。 Statement Form 语句格式 guard condition1, co…

软件设计模式与体系结构-设计模式-行为型软件设计模式-中介者模式

三、中介者模式&#xff08;迪米特法则&#xff09; 概念 模式动机&#xff1a; 为了减少对象两之间复杂的引用关系&#xff0c;使之成为一个松耦合的系统&#xff0c;需要适用中介者模式 定义&#xff1a; 用一个中介对象来封装一系列的对象交互&#xff0c;中介者使各对象…

从0开始,手写Redis

说在前面 从0开始&#xff0c;手写一个Redis的学习价值在于&#xff1a; 可以深入地理解Redis的内部机制和原理&#xff0c;Redis可谓是面试的绝对重点和难点从而更好地掌握Redis的使用和优化帮助你提高编程能力和解决问题的能力手写一个Redis可以作为一个优质的简历轮子项目…

LVS和keepalived群集

LVS和keepalived群集 一、keepalived概述&#xff1a;1.keepalived服务的重要功能&#xff1a;2.高可用故障切换转移原理&#xff1a;3.keepalived实现原理剖析&#xff1a;4.keepalived体系主要模块及作用&#xff1a;5.keepalived的工作原理&#xff1a; 二、部署LVS和keepal…

Android JetPack深入分析DataBinding源码

前言 数据绑定库是一种支持库&#xff0c;借助该库&#xff0c;您可以使用声明性格式&#xff08;而非程序化地&#xff09;将布局中的界面组件绑定到应用中的数据源。 DataBinding支持双向绑定&#xff0c;数据变化的时候界面跟着变化&#xff0c;界面变化也同步给数据&…

华为6605AC控制器大型组网wlan pool技术应用(自动漫游)

AC命令行配置&#xff1a; dis current-configuration set memory-usage threshold 0 ssl renegotiation-rate 1 vlan batch 100 vlan pool vlan_pool_test vlan 11 to 12 diffserv domain default radius-server template default free-rule-template name default_free_rule …

win10通过conda安装pytorch gpu

1. 安装anaconda 到官网下载最新版的anaconda&#xff0c;下载对应的windows版本&#xff0c;地址&#xff1a;anaconda官网 下载后直接安装&#xff0c;安装完成后配置环境变量&#xff0c;具体可以百度anaconda安装说明。安装完成后&#xff0c;打开cmd&#xff0c;输入conda…

Leetcode - 352周赛详解

一&#xff0c;最长奇偶子数组 看题可知可以使用暴力求解&#xff0c;从头开始遍历数组&#xff0c;另设一个变量来记录满足条件的子数组长度的最大值&#xff0c;将该变量不断与新得到的子数组长度比较&#xff0c;最终得到子数组长度的最大值。但是这样依次遍历的话&#xff…

git 分支管理

目录 一. 理解分支 1. master分支 二. 分支的&#xff08;创建&#xff0c;切换、合并、删除&#xff09; 1.查看分支 2.创建分支 3. 切换分支 4. 合并分支 5. 删除分支 三. 合并冲突 四. 合并模式 五. bug 分支 六. 强制删除分支 一. 理解分支 1. master分支 在我们的…