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 错误, 但是也确实是跟其他教程学过…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...