Solon Web 开发:四、认识请求上下文(Context)
Handler + Context 架构,是Solon Web 的基础。在 Context (org.noear.solon.core.handle.Context)里可以获取:
- 请求相关的对象与接口
- 会话状态相关的对象与接口
- 响应相关的对象与接口
或者理解所有请求与响应相关的,都在它身上。关于架构方面,可以再看看《想法与架构笔记》
1、三种获取 Context 的方式
a) 通过 Controller 获取
@Controller
public class HelloController{@Mapping("/hello")public String hello(Context ctx){//可以注入 ctx:Contextreturn "Hello " + ctx.param("name", "world");}
}
b) 通过 Handler 或 Filter 或 RouterInterceptor 接口方式获取
Solon.start(DemoApp.class, args, app->{app.get("/hello", ctx-> ctx.output("Hello " + ctx.param("name", "world")));
});//或者,用以组件方式编写
@Mapping("/hello")
@Component
public class HelloHandler implements Handler{public void handle(Context ctx) throws Throwable{ctx.output("Hello " + ctx.param("name", "world"));}
}
c) 直接获取(基于 ThreadLocal 实现)
Context ctx = Context.current();
2、关于 context-path 的类似效果(基于 pathNew 实现)
添加配置即可:(v1.11.2 后支持)
server.contextPath: "/test-service/"
也可以手动处理:
public class DemoApp{public static void main(String[] args){Solon.start(DemoApp.class, args, app->{//使用专用过滤器app.filter(-99, new ContextPathFilter("/xxx/"));//使用专用过滤器(原生路径将不能访问,不建议使用)//app.filter(-99, new ContextPathFilter("/xxx/", true)); });}
}
3、请求相关的接口
| 请求相关接口 | 说明 |
|---|---|
| -request()->Object | 原始请求对象 |
| -ip()->String | 获取源始请求ip(也可能是代理的ip) |
| -realIp()->String | 获取客户端真实IP |
| -isMultipart()-bool | 是否为分段内容 |
| -isMultipartFormData()->bool | 是否为分段表单数据 |
| -method()->String | 获取请求方式 |
| -protocol()->String | 获取请求协议 |
| -protocolAsUpper()->String | 获取请求协议并大写 |
| -url()->String | 获取请求的URL字符串 |
| -uri()->URI | 获取请求的URI |
| -path()->String | 获取请求的URI路径 |
| -pathNew(String) | 设置新路径 |
| -pathNew()->String | 获取新路径,不存在则返回原路径 |
| -pathMap(String)->NvMap | 获取请求的URI路径变量,根据路径表达式 |
| -pathAsUpper()->String | 获取请求的URI路径并大写 |
| -pathAsLower()->String | 获取请求的URI路径并小写 |
| -userAgent()>String | 获取请求的UA |
| -contentLength()->long | 获取内容长度 |
| -contentType()->String | 获取内容类型 |
| -queryString()->String | 获取查询字符串 |
| -accept()->String | 获取 Accept 头信息 |
| -body()->String | 获取body内容 |
| -body(String)->String | 获取body内容,并按指定字符串解码 |
| -bodyNew()->String | 获取新的body |
| -bodyNew(String) | 设置新的body |
| -bodyAsBytes()->byte[] | 获取body内容为byte[] |
| -bodyAsStream()->InputStream | 获取body内容为Stream |
| -paramValues(String)->String[] | 获取参数数组 |
| -param(String)->String | 获取参数 |
| -param(String, String)->String | 获取参数,并给定默认值 |
| -paramAsInt(String)->int | 获取参数并转为int |
| -paramAsInt(String, int)->int | 获取参数并转为int, 并给定默认值 |
| -paramAsLong(String)->long | 获取参数并转为long |
| -paramAsLong(String, long)->long | 获取参数并转为long,并给定默认值 |
| -paramAsDouble(String)->double | 获取参数并转为double |
| -paramAsDouble(String, double)->double | 获取参数并转为double,并给定默认值 |
| -paramAsDecimal(String)->BigDecimal | 获取参数并转为BigDecimal |
| -paramAsDecimal(String, BigDecimal)->BigDecimal | 获取参数并转为BigDecimal,并给定默认值 |
-paramAsBean(Class<T>)->T | 获取参数并转为Bean |
| -paramMap()->NvMap | 获取所有参数并转为map |
-paramsMap()->Map<String, List<String>> | 获取所有参数并转为Map |
| -paramSet(String, String) | 设置参数 |
| -paramsAdd(String, String) | 添加参数 |
-filesMap()->Map<String,List<UploadedFile>> | 获取所有上传的文件 |
-files(String)->List<UploadedFile> | 获取上传文件,可能有多个 |
| -file(String)->UploadedFile | 获取上传文件,第一个 |
| -cookie(String)->String | 获取 cookie |
| -cookie(String, String)->String | 获取 cookie, 并给定默认值 |
| -cookieMap()->NvMap | 获取 cookieMap |
| -header(String)->String | 获取 header |
| -header(String, String)->String | 获取 header,并给定默认值 |
| -headerValues(String)->String | 获取 header 数组 |
| -headerMap()->NvMap | 获取 headerMap |
-headersMap()->Map<String, List<String>> | 获取 headersMap |
4、响应相关的接口
| 响应相关接口 | 说明 |
|---|---|
| -response()->Object | 原始响应对象 |
| -charset(String) | 设置字符集 |
| -contentType(String) | 设置内容类型 |
| -contentTypeNew() | 获取设置的新内容类型 |
| -render(Object) | 渲染数据(比如将对象渲染为 Json 并输出) |
| -render(String, Map) | 渲染视图 |
| -renderAndReturn(Object)->String | 渲染数据并返回 |
| -output(byte[]) | 输出 字节数组 |
| -output(InputStream) | 输出 流对象 |
| -output(String) | 输出 字符串 |
| -output(Throwable) | 输出 异常对象 |
| -outputAsJson(String) | 输出为json文本 |
| -outputAsHtml(String) | 输出为html文本 |
| -outputAsFile(DownloadedFile) | 输出为文件 |
| -outputAsFile(File) | 输出为文件 |
| -outputStream()->OutputStream | 获取输出流 |
| -flush() | 冲刷 |
| -headerSet(String, String) | 设置 header |
| -headerAdd(String, String) | 添加 header |
| -cookieSet(String, String) | 设置 cookie |
| -cookieSet(String, String, int) | 设置 cookie |
| -cookieSet(String, String, String, int) | 设置 cookie |
| -cookieSet(String, String, String, String, int) | 设置 cookie |
| -cookieRemove(String) | 移徐 cookie |
| -redirect(String) | 302跳转地址 |
| -redirect(String, int) | 跳转地址 |
| -forward(String) | 服务端转换地址 |
| -status() | 获取输出状态 |
| -status(int) | 设置输出状态 |
5、会话相关的接口
| 会话相关接口 | 说明 |
|---|---|
| -sessionState()->SessionState | 获取 sessionState |
| -sessionId()->String | 获取 sessionId |
| -session(String)->Object | 获取 session 状态 |
| -session(String, T)->T | 获取 session 状态(类型转换,存在风险) |
| -sessionAsInt(String)->int | 获取 session 状态以 int 型输出 |
| -sessionAsInt(String, int)->int | 获取 session 状态以 int 型输出, 并给定默认值 |
| -sessionAsLong(String)->long | 获取 session 状态以 long 型输出 |
| -sessionAsLong(String, long)->long | 获取 session 状态以 long 型输出, 并给定默认值 |
| -sessionAsDouble(String)->double | 获取 session 状态以 double 型输出 |
| -sessionAsDouble(String, double)->double | 获取 session 状态以 double 型输出, 并给定默认值 |
| -sessionSet(String, Object) | 设置 session 状态 |
| -sessionRemove(String) | 移除 session 状态 |
| -sessionClear() | 清空 session 状态 |
6、其它查询
| 其它相关接口 | 说明 |
|---|---|
| +current()->Context | 获取当前线程的上下文 |
| -getLocale()->Locale | 获取地区 |
| -setLocale(Locale) | 设置地区 |
| -setHandled(bool) | 设置处理状态 |
| -getHandled() | 获取处理状态 |
| -setRendered(bool) | 设置渲染状态 |
| -getRendered() | 获取渲染状态 |
| -attrMap()->Map | 获取自定义特性并转为Map |
| -attr(String)->Object | 获取上下文特性 |
| -attr(String, T)->T | 获取上下文特性,并设定默认值 |
| -attrSet(String, Object) | 设置上下文特性 |
| -attrSet(Map) | 设置上下文特性 |
| -attrClear() | 清除上下文特性 |
| -remoting()->bool | 是否为远程调用 |
| -remotingSet(bool) | 设置是否为远程调用 |
| -result:Object | 用于在处理链中透传处理结果 |
| -errors:Throwable | 用于在处理链中透传处理错误 |
| -controller()->Object | 获取当前控制器 |
| -action()->Action | 获取当前动作 |
相关文章:
Solon Web 开发:四、认识请求上下文(Context)
Handler Context 架构,是Solon Web 的基础。在 Context (org.noear.solon.core.handle.Context)里可以获取: 请求相关的对象与接口会话状态相关的对象与接口响应相关的对象与接口 或者理解所有请求与响应相关的,都在…...
docker安装RocketMQ(附填坑经验connect to <172.17.0.3:10909> failed)
目录 一、docker部署RocketMQ1、简易说明2、docker拉取RocketMQ镜像\RocketMQ控制台3、获取RocketMQ配置文件4、RocketMQ配置文件描述5、docker启动RocketMQ6、进入RocketMQ控制台 二、填坑经验错误一: connect to <172.17.0.3:10909> failed错误二: maybe your broker m…...
GRU、LSTM、注意力机制(第八次组会)
GRU、LSTM、注意力机制(第八次组会) 一、 GRU二、 LSTM三、 深度RNN、双向RNN四、 注意力机制一、 GRU 二、 LSTM 三、 深度RNN、双向RNN...
问题杂谈(三十六)@RequestBody、@RequestParam和@PathVariable三个注解的区别和使用
总结: 在后端的同一个接收方法里,RequestBody与RequestParam()可以同时使用RequestBody最多只能有一个,而RequestParam()可以有多个RequestBody 接收的是请求体里面的数据,所以一般用POST请求;而RequestParam接收的是…...
Flutter学习四:Flutter开发基础(六)调试Flutter应用
目录 0 引言 1 调试Flutter应用 1.1 日志与断点 1.1.1 debugger() 声明 1.1.2 print和debugPrint 1.1.3 调试模式、中间模式、发布模式 1.1.4 断点 1.2 调试应用程序层 1.2.1 转储Widgets树 1.2.2 转储渲染树 1.2.3 转储Layer树 1.2.4 转储语义树 1.2.5 调度&…...
新的开始(开始更新笔记)
首先感谢关注我的小伙伴,以后在求职或者选择方向的时候,感觉迷茫的时候,可以加我聊聊。 一路走来,跌跌撞撞,磕磕碰碰,经历了很多,记得上一次的更新笔记还是2021年。 首先说一下我的经历&#…...
爬虫工具-替换js文件ReRes插件/Gores插件
目录 一、ReRes插件二、Gores插件 一、ReRes插件 用途:爬虫逆向过程中一些文件需要替换时 ① 原始网站js文件有无限debugger,复制原始网站js文件,删掉无限debugger相关代码保存为新的js文件;用ReRes插件进行替换② 原始网站js文件…...
多任务学习用于多模态生物数据分析
目前的生物技术可以同时测量来自同一细胞的多种模态数据(例如RNA、DNA可及性和蛋白质)。这需要结合不同的分析任务(如多模态整合和跨模态分析)来全面理解这些数据,推断基因调控如何驱动生物多样性。然而,目…...
使用less命令搜索文件中的关键字
目录 介绍常用搜索技巧实例 介绍 less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。 语法 less [参数] 文件 参数说明: -b <缓冲区大小> 设置缓冲区的大小 -e 当文件显示结束后ÿ…...
【kubernetes系列】Kubernetes之Taints和tolerations
概述 节点亲和性是pod的一种属性(优先选择或硬性要求),它使 pod 被优先分配到一类特定的节点上。而Taint则相反,它使节点能够排斥一类特定的 pod。 Taints(污点)与tolerations(容忍度…...
宝剑锋从磨砺出 梅花香自苦寒来(高考志愿篇)
各省高考成绩已出,又到一年高考季。张雪峰提到:“普通家庭不要光谈理想,也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么?针对这些疑问,你对正在选志愿的毕业生们有什么建议吗&…...
Jtti:怎样进行sql server2000 日志传送
在 SQL Server 2000 中,日志传送是指将事务日志从一个主服务器传送到一个或多个备份服务器的过程。这个过程确保备份服务器上的数据库保持与主服务器上的数据库同步。 要进行 SQL Server 2000 的日志传送,需要进行以下步骤: 配置主服务器&…...
MyBatis-Plus:条件构造器Wrapper
目录 1.Wrapper概述 1.1.Wrapper的继承关系 1.2.Wapper介绍 1.3.各个构造器使用区别 1.4.构造器常用方法 2.Wrapper常用构造器介绍 2.1.QueryWrapper 2.2.UpdateWrapper 2.3.LambdaQueryWrapper 2.4.AbstractWrapper 3. Lambda条件构造器 3.1.示例 4.鸣谢 MyBati…...
SNMP 计算机网络管理 实验1(二) 练习与使用Wireshark抓取SNMP数据包抓包之 任务三分析并验证TCP三次握手建立连接时三次握手工作过程
⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…...
【UE5 Cesium】03-Cesium for Unreal 添加本地数据集
上一篇:【UE5 Cesium】02-Cesium for Unreal 添加在线数据集 步骤 1. 在官网(Adding Datasets – Cesium)上下载一个示例 下载的是一个名为“Tileset.zip”的压缩文件 解压后文件内容如下 2. 打开虚幻编辑器,点击“Blank 3D Tiles…...
数通王国历险记之地址分析协议(ARP)
系列文章目录 数通王国历险记(4) 目录 前言 一,什么是地址解析协议(ARP) 二,封装和解封装 三,为什么需要地址解析协议(ARP) 四,ARP的验证实验 4.1&#x…...
Mac端显示服务器上show的内容
Mac端显示服务器上show的内容 1. 需求描述 在Mac端(终端和PyCharm中)编写代码,在服务器端运行程序。需要在Mac端显示服务器端运行的内容,比如,运行的视频等。 2. 常见报错 SSH 运行命令时报错示例。 (cv) czjing…...
【SQL】每类视频近一个月的转发量/率
【问题】 统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。 【数据】 用户-视频互动表 tb_user_video…...
chatgpt读论文
在当今的数字化时代,人工智能(AI)正在颠覆我们的生活方式。 OpenAI的GPT系列模型——尤其是最新一代的GPT-4和它的聊天机器人版本ChatGPT——是最近AI进步的显著代表。通过深度学习和海量数据训练,这些模型已经可以生成出色的人类般的文本。它们可以被用…...
关于visual studio 2010 及以上版本 引入boost库的最新解决方法
之前没有怎么用到boost库,出来实习需要去编译一些代码,需要引入boost第三方库,在这过程中,一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误, 但是也确实是跟其他教程学过…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
