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

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 架构&#xff0c;是Solon Web 的基础。在 Context &#xff08;org.noear.solon.core.handle.Context&#xff09;里可以获取&#xff1a; 请求相关的对象与接口会话状态相关的对象与接口响应相关的对象与接口 或者理解所有请求与响应相关的&#xff0c;都在…...

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三个注解的区别和使用

总结&#xff1a; 在后端的同一个接收方法里&#xff0c;RequestBody与RequestParam()可以同时使用RequestBody最多只能有一个&#xff0c;而RequestParam()可以有多个RequestBody 接收的是请求体里面的数据&#xff0c;所以一般用POST请求&#xff1b;而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 调度&…...

新的开始(开始更新笔记)

首先感谢关注我的小伙伴&#xff0c;以后在求职或者选择方向的时候&#xff0c;感觉迷茫的时候&#xff0c;可以加我聊聊。 一路走来&#xff0c;跌跌撞撞&#xff0c;磕磕碰碰&#xff0c;经历了很多&#xff0c;记得上一次的更新笔记还是2021年。 首先说一下我的经历&#…...

爬虫工具-替换js文件ReRes插件/Gores插件

目录 一、ReRes插件二、Gores插件 一、ReRes插件 用途&#xff1a;爬虫逆向过程中一些文件需要替换时 ① 原始网站js文件有无限debugger&#xff0c;复制原始网站js文件&#xff0c;删掉无限debugger相关代码保存为新的js文件&#xff1b;用ReRes插件进行替换② 原始网站js文件…...

多任务学习用于多模态生物数据分析

目前的生物技术可以同时测量来自同一细胞的多种模态数据&#xff08;例如RNA、DNA可及性和蛋白质&#xff09;。这需要结合不同的分析任务&#xff08;如多模态整合和跨模态分析&#xff09;来全面理解这些数据&#xff0c;推断基因调控如何驱动生物多样性。然而&#xff0c;目…...

使用less命令搜索文件中的关键字

目录 介绍常用搜索技巧实例 介绍 less 与 more 类似&#xff0c;less 可以随意浏览文件&#xff0c;支持翻页和搜索&#xff0c;支持向上翻页和向下翻页。 语法 less [参数] 文件 参数说明&#xff1a; -b <缓冲区大小> 设置缓冲区的大小 -e 当文件显示结束后&#xff…...

【kubernetes系列】Kubernetes之Taints和tolerations

概述 节点亲和性是pod的一种属性&#xff08;优先选择或硬性要求&#xff09;&#xff0c;它使 pod 被优先分配到一类特定的节点上。而Taint则相反&#xff0c;它使节点能够排斥一类特定的 pod。 Taints&#xff08;污点&#xff09;与tolerations&#xff08;容忍度&#xf…...

宝剑锋从磨砺出 梅花香自苦寒来(高考志愿篇)

各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&#xff0c;也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么&#xff1f;针对这些疑问&#xff0c;你对正在选志愿的毕业生们有什么建议吗&…...

Jtti:怎样进行sql server2000 日志传送

在 SQL Server 2000 中&#xff0c;日志传送是指将事务日志从一个主服务器传送到一个或多个备份服务器的过程。这个过程确保备份服务器上的数据库保持与主服务器上的数据库同步。 要进行 SQL Server 2000 的日志传送&#xff0c;需要进行以下步骤&#xff1a; 配置主服务器&…...

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三次握手建立连接时三次握手工作过程

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…...

【UE5 Cesium】03-Cesium for Unreal 添加本地数据集

上一篇&#xff1a;【UE5 Cesium】02-Cesium for Unreal 添加在线数据集 步骤 1. 在官网&#xff08;Adding Datasets – Cesium&#xff09;上下载一个示例 下载的是一个名为“Tileset.zip”的压缩文件 解压后文件内容如下 2. 打开虚幻编辑器&#xff0c;点击“Blank 3D Tiles…...

数通王国历险记之地址分析协议(ARP)

系列文章目录 数通王国历险记&#xff08;4&#xff09; 目录 前言 一&#xff0c;什么是地址解析协议&#xff08;ARP&#xff09; 二&#xff0c;封装和解封装 三&#xff0c;为什么需要地址解析协议&#xff08;ARP&#xff09; 四&#xff0c;ARP的验证实验 4.1&#x…...

Mac端显示服务器上show的内容

Mac端显示服务器上show的内容 1. 需求描述 在Mac端&#xff08;终端和PyCharm中&#xff09;编写代码&#xff0c;在服务器端运行程序。需要在Mac端显示服务器端运行的内容&#xff0c;比如&#xff0c;运行的视频等。 2. 常见报错 SSH 运行命令时报错示例。 (cv) czjing…...

【SQL】每类视频近一个月的转发量/率

【问题】 统计在有用户互动的最近一个月&#xff08;按包含当天在内的近30天算&#xff0c;比如10月31日的近30天为10.2~10.31之间的数据&#xff09;中&#xff0c;每类视频的转发量和转发率&#xff08;保留3位小数&#xff09;。 【数据】 用户-视频互动表 tb_user_video…...

chatgpt读论文

在当今的数字化时代&#xff0c;人工智能(AI)正在颠覆我们的生活方式。 OpenAI的GPT系列模型——尤其是最新一代的GPT-4和它的聊天机器人版本ChatGPT——是最近AI进步的显著代表。通过深度学习和海量数据训练&#xff0c;这些模型已经可以生成出色的人类般的文本。它们可以被用…...

关于visual studio 2010 及以上版本 引入boost库的最新解决方法

之前没有怎么用到boost库&#xff0c;出来实习需要去编译一些代码&#xff0c;需要引入boost第三方库&#xff0c;在这过程中&#xff0c;一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误&#xff0c; 但是也确实是跟其他教程学过…...

SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务

1.简介 “ 本文主要介绍SpringBoot2.1.5 Dubbo 2.7.3 Mybatis 3.4.2 Nacos 1.1.3 Seata 0.8.0整合来实现Dubbo分布式事务管理&#xff0c;使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据。 ” 如果你还对SpringBoot、Dubbo、Nacos…...

MongoDB使用

文档连接: link 创建表 不需要创建表的语句&#xff0c;当插入表的第一条语句时&#xff0c;会隐式的创建表。 增 插入一条 db.people.insertOne({ user_id: "bcd001", age: 45, status: "A" } )插入多条 db.collection.insertMany([ <document 1&g…...

C#文件安全管理解析

在实际的项目开发中&#xff0c;我们经常需要使用到文件的I/O操作&#xff0c;主要包含对文件的增改删查等操作&#xff0c;这些基本的操作我们都是很熟悉&#xff0c;但是较少的人去考虑文件的安全和操作的管理等方面&#xff0c;例如文件的访问权限管理&#xff0c;文件数据的…...

基于Dubbo分布式学校信息管理系统设计与实现

一、引言 1.1 课题背景 随着时代的发展与进步,计算机网络也随之日益完善,渐渐覆盖了我们生活的各个方面。在信息化和数字化的时代背景下,使用计算机管理学校信息来提升教育工作的质量和效率,是大势所趋,所以近年来,随着网络技术的不断发展,使用信息管理系统的学校越来…...

oracle面试问题和笔记整理

oracle面试笔记 ORACLE 面试问题-技术篇(2) 如何判断数据库的时区? 解答:SELECT DBTIMEZONE FROM DUAL; 解释GLOBAL_NAMES设为TRUE的用途 解答:GLOBAL_NAMES指明联接数据库的方式。如果这个参数设置为TRUE, 在建立数据库链接时就必须用相同的名字连结远程数据库 23。如何…...

Hadoop_Yarn实践 (三) => (Yarn的基础架构、原理、容量/公平调度器、Tool接口、Yarn常用命令、核心参数)

目录 Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (三)一、Hadoop_HDFS二、Hadoop_MapReduce三、Hadoop_Yarn1、Yarn资源调度1.1、基础架构1.2、Yarn的工作调度机制&#xff08;Job提交过程&#xff09;1.3、Yarn 调度器和调度算法1.3.1、先进先出调度器&#xff08;FIFO…...

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密

​专栏内容&#xff1a;postgresql内核源码分析 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 快照使用 快照是事务中使用&#xff0c;配合事务的隔离级别&#xff0c;体现出不同的可见性。…...

mysql(mariadb)读写分离部署

目录 一、原理 二、准备环境 三、部署mysql主从复制 1.五台服务器下载mariadb 2.修改master配置文件&#xff0c;重启数据库 3.登录mysql创建replication 4.从服务器登录验证 5.获得master服务器 DB的相关信息 6.备份master原有数据 7.修改slave1、slave2配置 8. 进入…...

ES-工作原理

前言 ​ 搜索引擎是对数据的检索&#xff0c;而数据总体分为两种&#xff1a;结构化数据和非结构化数据。而对于结构化数据&#xff0c;因为他们具有特定的结构&#xff0c;所以一般都是可以通过关系型数据库MySQL/oracle的二维表的方式存储和搜索&#xff0c;也可以建立索引。…...

C++小结(4)

C 字符串 C 提供了两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾的字…...