SpringMVC的注解

news2024/10/7 14:33:46

文章目录

  • 前言
  • 前期准备
    • @ResponseBody 返回JSON
    • @RequestMapping 映射控制器
    • @GetMapping、@PostMapping


前言

提示:这里可以添加本文要记录的大概内容:

SpringMVC框架只需要少量的配置即可快速实现Web应用程序开发,不需要大量的XML配置文件。

不必再写转型,统一JSON格式(前后端分离项目)

前期准备

第一步:新建项目Maven项目
在这里插入图片描述
在下一步中勾选第一个选项,创建一个简单的项目,最后填写相关信息后完成
请添加图片描述
项目创建完后后有个报错,缺个配置文件

增加一个插件即可

第二步:完善 pom.xml 文件

项目建成后在 pom.xml 文件中导入相关代码,比如:

缺什么加什么

<dependencies>
    <!-- 此依赖会关联引用Spring中的所有基础jar包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>
    <!-- spring-webmvc会依赖spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
   <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.2.2</version>
   </dependency>
  <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
  </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- 单元测试Junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

等插件下载完后如果项目还有错,那是因为项目和插件之间不是实时更新,接下来选择强制更新一下
请添加图片描述
第三步:config 配置

在src/main/java 文件夹下新建包 com.springmvc,然后再新建 config 包

在 config 包下新建两个类:

MvcConfig.java

package com.springmvc.config;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.*;

import com.springmvc.interceptor.MyInterceptor;


@Configuration
// 当包名被改变时,这里也需要被改变
@ComponentScan("com.springmvc")
@EnableWebMvc //使用EnableWebMvc开启springmvc注解方式配置
public class MvcConfig implements WebMvcConfigurer {
 
	 /**
     * 跨域设置
     */
    public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
            .allowedHeaders("*")
            .allowedOrigins("*")
            .allowCredentials(true);
    }
 
    /**
     * 添加拦截器(可以添加多个)
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }

    /**
     * 配置文件上传解析器
     */
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        // 设置上传单个文件的大小限制,单位:字节     倒序:KB*MB*10,这里是10MB
        commonsMultipartResolver.setMaxUploadSizePerFile(10 * 1024 * 1024);
        // 设置上传文件的总大小,单位:字节    这里是100MB
        commonsMultipartResolver.setMaxUploadSize(100 * 1024 * 1024);
        return commonsMultipartResolver;
    }
    
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    	StringHttpMessageConverter converter = new StringHttpMessageConverter();
    	converter.setDefaultCharset(Charset.forName("UTF-8"));
    	List<MediaType> list = new ArrayList<MediaType>();
    	list.add( MediaType.APPLICATION_JSON);
    	converter.setSupportedMediaTypes(list);
    	converters.add(converter);
    	// JSON转换器
    	converters.add(new MappingJackson2HttpMessageConverter()); 
    }
}

MvcInit.java

package com.springmvc.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
import javax.servlet.Filter;
 
/**
 * ①:1、创建Mvc初始化类,需要继承AbstractAnnotationConfigDispatcherServletInitializer类
 */
public class MvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * springmvc容器的父容器spring配置类
     * 实际工作中我们的项目比较复杂,可以将controller层放在springmvc容器中
     * 其他层,如service层、dao层放在父容器了,bean管理起来更清晰一些
     * 也可以没有父容器,将所有bean都放在springmvc容器中
     *
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
 
    /**
     * ②:2、设置springmvc容器的spring配置类
     *
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }
 
    /**
     * ③:3、配置DispatcherServlet的url-pattern
     *
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
 
    /**
     * ④:4、注册拦截器
     *
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        //添加拦截器,解决乱码问题
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceRequestEncoding(true);
        characterEncodingFilter.setForceResponseEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }
}

提示:以下是本篇文章正文内容,下面案例可供参考

@ResponseBody 返回JSON

在src/main/java 文件夹下新建 controller包,在controller包下新建一个类

@Controller
public class HelloController {
	// URL请求地址
	@RequestMapping("/hello") 
	//转JSON格式
	@ResponseBody 
	public String hi() {
		System.out.println("请求已到达");
		return "还好吧";
	}
}

Tomcat启动,有这条信息代表启动成功(初始化 dispatcher )
在这里插入图片描述
运行结果:
在这里插入图片描述

原来在写controller包时,只能指定一个路径,现在可以指定多个

再写一个方法:

	@RequestMapping("/test") 
	@ResponseBody
	public String test() {
		System.out.println("test请求已到达");
		return "abcdefg";
	}

在这里插入图片描述

@RequestMapping 映射控制器

@RequestMapping注解在处理器类上可以设置请求URL的父路径,而在处理器类的某个方法上使用@RequestMapping注解则可以设置请求URL的第二级访问目录,这样可以实现更细粒度的控制。这样做可以实现URL的模块化管理,提高代码的可维护性和可扩展性。

先写 po 包:

public class Food {
	private Integer foodId;
	private String foodName;
	private Double foodPrice;
	// 自动生成 Getter、Setter、toString()、有参无参方法
}

再写 controller 包:

@Controller
@RequestMapping("/food")
public class MapperController {

}

增加食品请求:

	@RequestMapping("/add")
	@ResponseBody
	public String add() {
		System.out.println("处理增加食品请求");
		return "增加成功";
	}

测试:
在这里插入图片描述

删除食品请求:

	@RequestMapping("/remove")
	@ResponseBody
	public String remov() {
		System.out.println("处理删除食品请求");
		return "删除成功";
	}

测试:

在这里插入图片描述

修改食品请求:

	@RequestMapping("/update")
	@ResponseBody
	public String update() {
		System.out.println("处理修改食品请求");
		return "修改成功";
	}

测试:
在这里插入图片描述

查询食品请求:

	@RequestMapping("/query")
	@ResponseBody
	public List<Food> query(){
		System.out.println("处理查询食品请求");
		List<Food> list = new ArrayList<Food>();
		list.add(new Food(1, "羊肉锅", 49.9));
		list.add(new Food(2, "小龙虾", 46.8));
		list.add(new Food(3, "肚包肉", 39.8));
		return list;
	}

在这里插入图片描述

@GetMapping、@PostMapping

@GetMapping:只处理 get 请求
@PostMapping:只处理 post 请求

比如把上面的增加删除方法改一下,把@RequestMapping分别改成@GetMapping@PostMapping

	@PostMapping("/add")
	@ResponseBody
	public String add() {
		System.out.println("处理增加食品请求");
		return "增加成功";
	}

添加测试:这样添加方法就只能选择POST了
在这里插入图片描述

如果还是 get 请求会引起 405 报错(方法用错了)
在这里插入图片描述

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

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

相关文章

【ES】笔记-简化对象写法箭头函数及声明特点

简化对象写法&箭头函数及声明特点 简化对象写法箭头函数及声明特点 简化对象写法 ES6 允许在大括号里面&#xff0c;直接写入变量和函数&#xff0c;作为对象的属性和方法.这样的书写更加简介 声明变量和和函数 let name南昌大学;let changefunction(){console.log(我可以改…

如何使用Kafka构建事件驱动的架构

事件驱动的架构(EDA)是一种软件设计模式&#xff0c;它关注事件的生成、检测和使用&#xff0c;以支持高效和可扩展的系统。在EDA中&#xff0c;事件是组件之间通信的主要手段&#xff0c;允许它们实时交互和响应更改。这种架构促进了松散耦合、可扩展性和响应性&#xff0c;使…

Semantic Kernel 入门系列:突破提示词的限制

无尽的上下文 LLM对自然语言的理解和掌握在知识内容的解读和总结方面提供了强大的能力。 但是由于训练数据本身来自于公共领域&#xff0c;也就注定了无法在一些小众或者私有的领域能够足够的好的应答。 因此如何给LLM 提供足够多的信息上下文&#xff0c;就是如今的LLM AI应…

el-table合并表头、动态合并列、合并尾部合计

在有些情况下&#xff0c;我们会有合并表头、合并列、合并尾部合计的需求&#xff0c;这篇文章是为了记录&#xff0c;如何进行合并&#xff0c;方便日后翻阅。 效果图 el-table合并表头 el-table合并列&#xff08;动态合并&#xff09; el-table合并尾部合计 el-table合并表…

64x8com的LCD液晶屏驱动芯片IC,VK1625完美兼容市面所有1625驱动芯片

产品型号&#xff1a;VK1625 产品品牌&#xff1a;VINKA/元泰 封装形式&#xff1a;QFP100 LQFP100 DICE/裸片 COB邦定片 定制COG 专业工程服务&#xff0c;技术支持&#xff01;用芯服务&#xff01; 概述: VK1625B是一个64x8的LCD駆动器. 可软件程控使其适用于多样化的…

在 Amazon SageMaker 上使用 Amazon Inferentia2 实现 AI 作画

在前一篇文章中&#xff0c;我们介绍了如何使用 Amazon EC2 Inf2 实例部署大语言模型&#xff0c;有不少用户询问 Amazon Inf2 实例是否支持当下流行的 AIGC 模型&#xff0c;答案是肯定的。同时&#xff0c;图片生成时间、QPS、服务器推理成本、如何在云中部署&#xff0c;也是…

【数学建模】--聚类模型

聚类模型的定义&#xff1a; “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计&#xff0c;分析或预测&#xff1b;也可以探究不…

bigemap如何添加高清在线地图?

说明&#xff1a;批量添加可以同时添加多个在线地图&#xff0c;一次性添加完成&#xff08;批量添加无法验证地址是否可以访问&#xff09; 添加后如下图&#xff1a; 第一步 &#xff1a; 制作地图配置文件&#xff1a;选择添加在线地图&#xff08;查看帮助&#xff09;。 …

Linux6.33 Kubernetes kubectl详解

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes kubectl详解一、陈述式资源管理方法1.基本信息查看2.项目的生命周期&#xff1a;创建-->发布-->更新-->回滚-->删除 二、声明式管理方法 计算机系统 5G云计算 第三章 LINUX Kubernetes kubectl详解 一、陈述…

【力扣每日一题】2023.8.7 反转字符串

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个字符数组形式的字符串&#xff0c;让我们直接原地修改反转字符串&#xff0c;不必返回。 给出的条件是使用O(1)的额外空间…

JS进阶-Day3

&#x1f954;&#xff1a;永远做自己的聚光灯 JS进阶-Day1——点击此处&#xff08;作用域、函数、解构赋值等&#xff09; JS进阶-Day2——点击此处&#xff08;深入对象之构造函数、实例成员、静态成员等&#xff1b;内置构造函数之引用类型、包装类型等&#xff09; 更多JS…

工业以太网交换机-SCALANCE X200 环网组态

1.概述 SCALANCE X200 系列交换机自从2004年8月推入市场&#xff0c;当时交换机只能接入环网&#xff0c;不能做环网管理器。在各个工业现场得到了广泛的应用。2007年5月发布了X200系列新的硬件版本平台&#xff0c;普通交换机可以用HSR&#xff08;高速冗余&#xff09;方法做…

[虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密

本插件可以在虚幻引擎中使用蓝图对字符串&#xff0c;字节数组&#xff0c;文件进行Base64的加密和解密。 目录 1. 节点说明 String To Base64 Base64 To String Binary To Base64 Base64 To Binary File To Base64 Base64 To File 2. 案例演示 3. 插件下载 1. 节点说…

【用于全变分去噪的分裂布雷格曼方法】实施拆分布雷格曼方法进行总变异去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

FFmpeg 使用总结

FFmpeg 简介 FFmpeg的名称来自MPEG视频编码标准&#xff0c;前面的“FF”代表“Fast Forward”&#xff0c;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。包括如下几个部分&#xf…

iframe 标签的作用是什么?用法是什么?属性有什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ iframe 标签是什么&#xff1f;⭐ iframe 标签的作用什么&#xff1f;⭐ iframe 标签的用法⭐ iframe 标签的属性⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你…

HTTP连接之出现400 Bad Request分析

1、400简介 400是一种HTTP状态码&#xff0c;告诉客户端它发送了一条异常请求。400页面是当用户在打开网页时&#xff0c;返回给用户界面带有400提示符的页面。其含义是你访问的页面域名不存在或者请求错误。主要分为两种。 1、语义有误&#xff0c;当前请求无法被服务器理解…

PPT忘记密码如何解除?

PPT文件所带有的两种加密方式&#xff0c;打开密码以及修改权限&#xff0c;两种密码在打开文件的时候都会有相应的提示&#xff0c;但不同的是两种加密忘记密码之后是不同的。 如果忘记了打开密码&#xff0c;我们就没办法打开PPT文件了&#xff1b;如果是忘记了修改密码&…

RAR压缩包密码,如何删除?

Rar压缩包设置了密码&#xff0c;需要输入正确密码才能够解压文件&#xff0c;这有效保护了文件内容&#xff0c;不过文件可能不再需要加密了&#xff0c;那么我们应该如何删除压缩包密码呢&#xff1f; Rar格式问题&#xff0c;即使有些带有删除密码功能的压缩软件也不支持ra…

【ChatGPT 指令大全】怎么使用ChatGPT来帮我们写作

在数字化时代&#xff0c;人工智能为我们的生活带来了无数便利和创新。在写作领域&#xff0c;ChatGPT作为一种智能助手&#xff0c;为我们提供了强大的帮助。不论是作文、文章&#xff0c;还是日常函电&#xff0c;ChatGPT都能成为我们的得力助手&#xff0c;快速提供准确的文…