Solon MVC 的 @Mapping 用法说明

embedded/2024/11/14 4:36:11/

在 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}

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

java">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() 接口统一获取。

java">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
java">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 输入

例:

java">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、输出类型

java">@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、父类继承支持

java">@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){...}
}

http://www.ppmy.cn/embedded/136938.html

相关文章

【C++ 算法进阶】算法提升十四

目录 括号匹配问题 &#xff08;动态规划&#xff09;题目题目分析代码 子数组最接近某个数 &#xff08;动态规划&#xff09;题目题目分析代码 求出数组中缺失的最小正整数 &#xff08;贪心&#xff09;题目题目分析代码 恢复二叉搜索树 &#xff08;二叉树的性质&#xff0…

【Python】爬虫通过验证码

1、将验证码下载至本地 # 获取验证码界面html url http://www.example.com/a.html resp requests.get(url) soup BeautifulSoup(resp.content.decode(UTF-8), html.parser)#找到验证码图片标签&#xff0c;获取其地址 src soup.select_one(div.captcha-row img)[src]# 验证…

Qt:QPdfDocument渲染PDF文件时的信息丢失问题

背景 Qt自带了QPdfDocument可以用来打开并渲染PDF文件&#xff0c;同时Qt也提供了qtpdf multipage example&#xff0c;可以浏览多页PDF文件&#xff0c;如下图&#xff1a; 问题 但在使用过程中发现&#xff0c;对于某些PDF文件&#xff0c;QPdfDocument在渲染时会丢失部分信…

Golang | Leetcode Golang题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; type point struct{x, y int }var dirs []point{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func updateMatrix(mat [][]int) [][]int {var m, n len(mat), len(mat[0])var res make([][]int, m)var visited make([][]bool, m)var queue []poin…

Vivado+Vscode联合打造verilog环境

一、Vivado下载安装 详细参考我另一篇文章&#xff1a; Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章&#xff1a; VscodeAnacond…

Spring Boot基础教学:Spring Boot 简介

第一部分&#xff1a;Spring Boot 简介 1.1 什么是Spring Boot&#xff1f; Spring框架的简介Spring Boot与Spring框架的关系Spring Boot的优势 1.2 Spring Boot的核心特性 自动配置起步依赖内嵌服务器Spring Boot CLIActuator 1.3 Spring Boot的应用场景 微服务REST API…

(C++11)委托构造函数--C++

文章目录 委托构造函数为什么要有委托构造函数代码解释注意事项 委托构造函数 C11 引入了委托构造的概念&#xff0c;这使得构造函数可以在同一个类中一个构造函数调用另一个构造函 数&#xff0c;从而达到简化代码的目的。 就是委托其他构造函数帮忙构造。 为什么要有委托构…

nacos集群AP架构源码解析

1 心跳检测 核心类&#xff1a;ClientBeatCheckTask 核心方法&#xff1a;run public void run() {try {//1 集群状态下心跳处理if (!getDistroMapper().responsible(service.getName())) {return;}if (!getSwitchDomain().isHealthCheckEnabled()) {return;}List<Instance…