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 错误, 但是也确实是跟其他教程学过…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...