首页 > 其他分享 >Solon Web 开发:四、认识请求上下文(Context)

Solon Web 开发:四、认识请求上下文(Context)

时间:2023-07-04 11:23:19浏览次数:59  
标签:Web Solon String int 获取 session 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:Context
        return "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 获取当前动作

标签:Web,Solon,String,int,获取,session,Context,默认值
From: https://www.cnblogs.com/noear/p/17525246.html

相关文章

  • WebSocket 协议详解
    一、WebSocket协议背景早期,在网站上推送消息给用户,只能通过轮询的方式或Comet技术。轮询就是浏览器每隔几秒钟向服务端发送HTTP请求,然后服务端返回消息给客户端。轮询技术一般在浏览器上就是使用setInerval或setTimeout这种方式的缺点:需要不断的向服务端发送HTTP......
  • 2023/7/4常见WEB漏洞原理分析
    一、SQL注入漏洞SQL注入攻击(SQLInjection),简称注入攻击、SQL注入,被广泛用于非法获取网站控制权,是发生在应用程序的数据库层上的安全漏洞。在设计程序,忽略了对输入字符串中夹带的SQL指令的检查,被数据库误认为是正常的SQL指令而运行,从而使数据库受到攻击,可能导致数据被窃取、更改、......
  • Vue3学习-01_前端工程化与webpack
    背景最近在学习Vue知识,参照的教程是黑马程序员官网提供的免费前端教程,这里记录一下自己的学习笔记以及遇到的相关问题。前端工程化的概念及优点前端工程化指的是:在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。最终落实到细节上,就是实......
  • 让IIS支持.NET Web Api PUT和DELETE请求
    前言    有很长一段时间没有使用过IIS来托管应用了,今天用IIS来托管一个比较老的.NETFx4.6的项目。发布到线上后居然一直调用不同本地却一直是正常的,关键是POST和GET请求都是正常的,只有PUT和DELETE请求是有问题的。经过一番思考忽然想起来了IIS默认情况下拒绝处理PUT和DELETE......
  • Python web 框架对比:Flask vs Django
    哈喽大家好,我是咸鱼今天我们从几个方面来比较一些现在流行的两个pythonweb框架——Flask和Django,突出它们的主要特性、优缺点和简单案例到最后,大家将更好地了解哪个框架更适合自己的特定需求参考链接:https://djangocentral.com/flask-vs-django-selecting-the-perfect-pyt......
  • word文档的图片怎么保存到eWebEditor上
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......
  • Delphi 通过WebBrowser调用JS方法
    Delphi通过WebBrowser调用JS时,为防止版本问题导致调用失败,需要在html中增加 <metahttp-equiv="X-UA-Compatible"content="IE=edge"/>示例html代码<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <metahttp-eq......
  • web
    Tomcat文件夹信息bin:启动和关闭的脚本文件conf:配置lib:依赖的jar包logs:日志temp:临时文件webapps:存放网站的可以配置启动的端口号tomcat的默认端口号:8080mysql:3306http:80https:443可以配置主机的名称默认的主机名为:localhost->127.0.0.1......
  • 6Javaweb基础—尚硅谷(购物车模块,订单模块) 没有做完
                               ......
  • 开心档之C++ Web 编程
    C++Web编程目录C++Web编程什么是CGI?Web浏览CGI架构图Web服务器配置第一个CGI程序实例HelloWorld!这是我的第一个CGI程序HTTP头信息CGI环境变量实例C++CGI库GET和POST方法使用GET方法传递信息简单的URL实例:Get方法实例简单的表单实例:G......