当前位置: 首页 > news >正文

Solon MVC 的 @Mapping 用法说明

在 Solon Mvc 里,@Mapping 注解一般是配合 @Controller 和 @Remoting,作请求路径映射用的。且,只支持加在 public 函数 或 类上

1、注解属性

属性说明备注
value路径与 path 互为别名
path路径与 value 互为别名
method请求方式限定(def=all)可用 @Post@Get 等注解替代此属性
consumes指定处理请求的提交内容类型可用 @Consumes 注解替代此属性
produces指定返回的内容类型可用 @Produces 注解替代此属性
multipart申明支持多分片请求(def=false)如果为false,则自动识别

当 method=all,即不限定请求方式

2、支持的路径映射表达式

符号说明示例
**任意字符、不限段数**/user/**
*任意字符/user/*
?可有可无/user/?
/路径片段开始符和间隔符//user
{name}路径变量申明/user/{name}

路径组合(控制器映射与动作映射)及应用示例:

import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;@Mapping("/user") //或 "user",开头自动会补"/"
@Controller
public void DemoController{@Mapping("") //=/userpublic void home(){ }@Mapping("/") //=/user/,与上面是有区别的,注意下。public void home2(){ }@Mapping("/?") //=/user/ 或者 /user,与上面是有区别的,注意下。public void home3(){ }@Mapping("list") //=/user/list ,间隔自动会补"/"public void getList(){ }@Mapping("/{id}") //=/user/{id}public void getOne(long id){ }@Mapping("/ajax/**") //=/user/ajax/**public void ajax(){ }
}

提醒:一个 @Mapping 函数不支持多个路径的映射

3、参数注入

非请求参数的可注入对象:

类型说明
Context请求上下文(org.noear.solon.core.handle.Context)
Locale请求的地域信息,国际化时需要
ModelAndView模型与视图对象(org.noear.solon.core.handle.ModelAndView)

支持请求参数自动转换注入:

  • 当变量名有对应的请求参数时(即有名字可对上的请求参数)
    • 会直接尝试对请求参数值进行类型转换
  • 当变量名没有对应的请求参数时
    • 当变量为实体时:会尝试所有请求参数做为属性注入
    • 否则注入 null

支持多种形式的请求参数直接注入:

  • queryString
  • form-data
  • x-www-form-urlencoded
  • path
  • json body

其中 queryString, form-data, x-www-form-urlencoded, path 参数,支持 ctx.param() 接口统一获取。

import org.noear.solon.core.handle.Context;
import org.noear.solon.core.handle.ModelAndView;
import org.noear.solon.core.handle.UploadedFile;
import java.util.Locale;@Mapping("/user") 
@Controller
public void DemoController{//非请求参数的可注入对象@Mapping("case1")public void case1(Context ctx, Locale locale , ModelAndView mv){ }//请求参数(可以是散装的;支持 queryString, form;json,或支持的其它序列化格式)@Mapping("case2")public void case2(String userName, String nickName, long[] ids, List<String> names){ }//请求参数(可以是整装的结构体;支持 queryString, form;json,或支持的其它序列化格式Mapping@Mapping("case3")public void case3(UserModel user){ }//也可以是混搭的@Mapping("case4")public void case4(Context ctx, UserModel user, String userName){  }//文件上传    //注意与 <input type='file' name="file1" /> 名字对上@Mapping("case5")public void case5(UploadedFile file1, UploadedFile file2){ } //同名多文件上传@Mapping("case6")public void case6(UploadedFile[] file){ }  
}

提醒: ?user[name]=1&ip[0]=a&ip[1]=b&order.id=1 风格的参数注入,需要引入插件:solon-serialization-properties

4、带注解的参数注入

注解:

注解说明
@Param注入请求参数(包括:query-string、form)。起到指定名字、默认值等作用
@Header注入请求 header
@Cookie注入请求 cookie
@Path注入请求 path 变量(因为框架会自动处理,所以这个只是标识下方便文档生成用)
@Body注入请求体(一般会自动处理。仅在主体的 String, InputSteam, Map 时才需要)

注解相关属性:

属性说明适用注解
value参数名字@Param, @Header, @Cookie, @Path
name参数名字(与 value 互为别名)@Param, @Header, @Cookie, @Path
required必须的@Param, @Header, @Cookie, @Body
defaultValue默认值@Param, @Header, @Cookie, @Body
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.annotation.Header;
import org.noear.solon.annotation.Body;
import org.noear.solon.annotation.Path;@Mapping("/user") 
@Controller
public void DemoController{@Mapping("case1")public void case1(@Body String bodyStr){   }@Mapping("case2")public void case2(@Body Map<String,String> paramMap, @Header("Token") String token){ }@Mapping("case3")public void case3(@Body InputStream stream, @Cookie("Token") token){  }//这个用例加不加 @Body 效果一样@Mapping("case4")public void case4(@Body UserModel user){  } @Mapping("case5/{id}")public void case5(String id){  }//如果名字不同,才有必要用 @Path //否则是自动处理(如上)@Mapping("case5_2/{id}")public void case5_2(@Path("id") String name){  } @Mapping("case6")public void case6(String name){ }//如果名字不同,才有必要用 @Param //否则是自动处理(如上)@Mapping("case6_2")public void case6_2(@Param("id") String name){ } //如果要默认值,才有必要用 @Param@Mapping("case6_3")public void case6_3(@Param(defaultValue="world") String name){ }@Mapping("case7")public void case7(@Header String token){ }@Mapping("case7_2")public void case7_2(@Header String[] user){ } //v2.4.0 后支持
}

5、请求方式限定

可以1个或多个加个 @Mppaing 注解上,用于限定请求方式(不限,则支持全部请求方式

请求方式限定注解说明
@Get限定为 Http Get 请求方式
@Post限定为 Http Post 请求方式
@Put限定为 Http Put 请求方式
@Delete限定为 Http Delete 请求方式
@Patch限定为 Http Patch 请求方式
@Head限定为 Http Head 请求方式
@Options限定为 Http Options 请求方式
@Trace限定为 Http Trace 请求方式
@Http限定为 Http 所有请求方式
@Message限定为 Message 请求方式
@To标注转发目标
@WebSokcet限定为 WebSokcet 请求方式
@Sokcet限定为 Sokcet 请求方式
@All允许所有请求方式(默认)
其它限定注解说明
@Produces申明输出内容类型
@Consumes申明输入内容类型(当输出内容类型未包函 @Consumes,则响应为 415 状态码)
@Multipart显式申明支持 Multipart 输入

例:

import org.noear.solon.boot.web.MimeType;@Mapping("/user") 
@Controller
public void DemoController{@Get@Mapping("case1")public void case1(Context ctx, Locale locale , ModelAndView mv){ }//也可以直接使用 Mapping 的属性进行限定。。。但是没使用注解的好看@Mapping(path = "case1_2", method = MethodType.GET)public void case1_2(Context ctx, Locale locale , ModelAndView mv){ }@Put@Message@Mapping("case2")public void case2(String userName, String nickName){ }//如果没有输出申明,侧 string 输出默认为 "text/plain"@Produces(MimeType.APPLICATION_JSON_VALUE)@Mapping("case3")public String case3(){return "{code:1}";}也可以直接使用 Mapping 的属性进行限定。。。但是没使用注解的好看@Mapping(path= "case3_2", produces=MimeType.APPLICATION_JSON_VALUE))public String case3_2(){return "{code:1}";}//如果没有输出申明,侧 object 输出默认为 "application/json"@Mapping("case3_3")public User case3_3(){return new User();}}

6、输出类型

@Mapping("/user") 
@Controller
public void DemoController{//输出视图与模型,经后端渲染后输出最终格式@Maping("case1")public ModelAndView case1(){ModelAndView mv = new ModelAndView();mv.put("name", "world");mv.view("hello.ftl");return mv;}//输出结构体,默认会采用josn格式渲染后输出@Maping("case2")public UserModel case2(){return new UserModel();}//输出下载文件@Maping("case3")public Object case3(){return new File(...); //或者 return new DownloadedFile(...);}
}

7、父类继承支持

@Mapping("user")
public void UserController extends CrudControllerBase<User>{}public class CrudControllerBase<T>{@Post@Mapping("add")public void add(T t){...}@Delete@Mapping("remove")public void remove(T t){...}
}

相关文章:

Solon MVC 的 @Mapping 用法说明

在 Solon Mvc 里&#xff0c;Mapping 注解一般是配合 Controller 和 Remoting&#xff0c;作请求路径映射用的。且&#xff0c;只支持加在 public 函数 或 类上。 1、注解属性 属性说明备注value路径与 path 互为别名path路径与 value 互为别名method请求方式限定(defall)可用…...

uni-app表单⑪

文章目录 十七、用户登录-登录界面搭建一、结构样式代码编写 十八、用户登录-表单验证一、userRulesMixin 文件使用二、验证规则编写 十七、用户登录-登录界面搭建 一、结构样式代码编写 uni-forms 插件下载 下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id2773 s…...

PyQt5 加载UI界面与资源文件

步骤一: 使用 Qt Designer 创建 XXX.ui文件 步骤二: 使用 Qt Designer 创建 资源文件 步骤三: Python文件中创建相关类, 使用 uic.loadUi(mainwidget.ui, self ) 加载UI文件 import sys from PyQt5 import QtCore, QtWidgets, uic from PyQt5.QtCore import Qt f…...

【MySQL】数据库知识突破:数据类型全解析与详解

前言&#xff1a;本节内容讲述MySQL的数据类型&#xff0c; 我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作&#xff0c; 并没有对数据的内容进行操作&#xff0c;所以它叫做DDL。另外&#xff0c;还有…...

使用Golang实现开发中常用的【实例设计模式】

使用Golang实现开发中常用的【实例设计模式】 设计模式是解决常见问题的模板&#xff0c;可以帮助我们提升思维能力&#xff0c;编写更高效、可维护性更强的代码。 单例模式&#xff1a; 描述&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 优点&…...

【Java学习】电脑基础操作和编程环境配置

CMD 在Windows中用命令行的方式操作计算机。 打开CMD Win R输入CMD按下回车键 Win E 进入我的电脑 常用的CMD命令 盘符名称冒号 说明&#xff1a;盘符切换 举例&#xff1a;E:回车&#xff0c;表示切换到E盘 dir 说明&#xff1a;查看当前路径下的内容 cd目录 说明&a…...

AVL树解析

目录 一. AVL的概念 二 AVL树的插入 2.1先按二叉搜索树的规则插入 2.2 AVL的重点&#xff1a;平衡因子更新 3.1 更新后parent的平衡因子等于0。 3.2 更新后parent的平衡因子等于1 或 -1&#xff0c;需要继续往上更新。 3.3 更新后parent的平衡因子等于2 或 -2&#xff0c;需…...

栈和队列(Java)

一.栈&#xff08;Stack&#xff09; 1.定义 栈是限定仅在表尾进行插入或删除操作的线性表 一般的表尾称为栈顶 表头称为栈底 栈具有“后进先出”的特点 2.对栈的模拟 栈主要具有以下功能&#xff1a; push(Object item)&#xff1a;将元素item压入栈顶。 pop()&am…...

C#设计原则

文章目录 项目地址一、开放封闭原则1.1 不好的版本1.2 将BankProcess的实现改为接口1.3 修改BankStuff类和IBankClient类二、依赖倒置原则2.1 高层不应该依赖于低层模块2.1.1 不好的例子2.1.2 修改:将各个国家的歌曲抽象2.2 抽象不应该依于细节2.2.1 不同的人开不同的车(接口…...

easyfs 简易文件系统

easyfs easyfs 简易文件系统文件系统虚拟文件系统 VFS简易文件系统 easyfs磁盘布局超级块 easyfs 文件系统结构磁盘上的索引结构索引节点Inode 和 DiskInode 之间的关系举例说明读取文件的过程&#xff08; /hello &#xff09; 参考文档 easyfs 简易文件系统 文件系统 常规文…...

【架构论文-1】面向服务架构(SOA)

【摘要】 本文以我参加公司的“生产线数字孪生”项目为例&#xff0c;论述了“面向服务架构设计及其应用”。该项目的目标是构建某车企的数字孪生平台&#xff0c;在虚拟场景中能够仿真还原真实产线的动作和节拍&#xff0c;实现虚实联动&#xff0c;从而提前规避问题&#xff…...

刚刚!更新宁德时代社招Verify测评语言理解数字推理SHL题库、网盘资料、高分答案

宁德时代社招入职的Verify测评主要分为两大块&#xff1a;语言理解和数字推理。语言理解部分包括阅读理解、逻辑填空和语句排序&#xff0c;要求在17分钟内完成30题。数字推理部分包括数字序列、数学问题解决和图表分析&#xff0c;同样要求在17分钟内完成18题。这些测评题目旨…...

C++笔记---智能指针

1. 什么是智能指针 1.1 RALL设计思想 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是一种资源管理类的设计思想&#xff0c;广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…...

CentOS 7系统中更改YUM源为阿里云的镜像源

引言 更换阿里的镜像源可以带来诸多好处&#xff0c;包括提高下载速度、提升稳定性、同步更新、简化配置、节省带宽资源以及增强系统安全性等。因此&#xff0c;对于使用CentOS系统的用户来说&#xff0c;更换阿里的镜像源是一个值得考虑的选择。 1.备份yum源 mv /etc/yum.r…...

Python酷库之旅-第三方库Pandas(206)

目录 一、用法精讲 961、pandas.IntervalIndex.mid属性 961-1、语法 961-2、参数 961-3、功能 961-4、返回值 961-5、说明 961-6、用法 961-6-1、数据准备 961-6-2、代码示例 961-6-3、结果输出 962、pandas.IntervalIndex.length属性 962-1、语法 962-2、参数 …...

3.4CQU数学实验???

meshgrid 是一个用于生成网格点坐标的函数。它常用于在二维或三维空间中创建坐标网格&#xff0c;用于可视化和数据处理。 在二维情况下&#xff0c;meshgrid 函数接受两个一维数组作为输入&#xff0c;并返回两个二维数组&#xff0c;这两个数组中的元素分别表示了所有可能的…...

Linux(CentOS)开放端口/关闭端口

一、普通用户使用 sudo 操作&#xff0c;开放/关闭端口&#xff0c;80 1、检查端口是否开放 sudo firewall-cmd --zonepublic --query-port80/tcp 2、开放端口 sudo firewall-cmd --zonepublic --add-port80/tcp --permanent 3、重新加载&#xff08;开放或关闭端口后都需…...

GreenDao适配AGP8.7+

升级配置 工具版本Android StudioLadybug 2024.2.1 Path2AGP8.7.2KPG1.8.21GGP3.3.1明细 classpath "com.android.tools.build:gradle:$agp_version"classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kgp_version"classpath "org.greenrobot:g…...

【前端】Typescript从入门到进阶

以下是 TypeScript 的常用知识点总结&#xff0c;涵盖了从基础到入门的内容&#xff0c;并配有代码示例&#xff1a; 1. TypeScript 基础 1.1 安装和配置 安装 TypeScript 并初始化配置文件&#xff1a; npm install -g typescript tsc --init 1.2 基本类型 TypeScript 提供…...

在 RHEL 8 | CentOS Linux release 8.5.2111上安装 Zabbix 6

1. 备份YUM源文件 cd /etc/yum.repos.d/ mkdir bak mv C* ./bak/ wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo yum clean all yum makecache2. 将 SELinux 设置为宽容模式&#xff0c;如下所示。 sudo s…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...