Struts2-获得servlet的api
一.如何在Action中获得原生servlet的api
1.struts提供了一个ActionContext(数据中心)来提供servlet的原生api
2.包括常见的api:
>request,response,session,sevletContext
>request域,session域,appication域(域被这里分离出来,全是map)
>param参数,attr域(requst,response,servletContext三个域的合并),valuestack
3.ActionContext本身也是一个map,每次请求时都会创建一个跟请求对应的ActionContext对象,请求结束销毁!
PS:ActionContext对象只是引用原生api的地址,销毁时是不会影响到api等的生命周期
Struts2提供了三种获取Servlet的原生api:
>通过ActionContext
>通过ServletActionContext(不推荐)
>通过实现接口方式(不推荐)
PS:后两者底层其实都是调用了ActionContext
二.ActionContext
1.struts2的设计是将创建的ActionContext对象与当前的线程绑定在一起,我们要获取对象,要从ThreadLocal中获取
2.通过ActionContext.getContext()即可获得actionContext对象,底层代码的获取就是从ThreadLocal<ActionContext>,如:
ActionContext.getContext().getSession();获取session域
ActionContext.getContext().getApplication();获取application域
ActionContext.getContext().get("request");获取request域比较麻烦一点还要指定键,不过struts2也没想让你用原生的requst域,原因如下:
ActionContext.getContext().put(String,String);因为ActionContext的生命周期跟request对象一样,所以struts2推荐用ActionContext代替request域来存取数据,从页面取出来的方式跟以前一样:${requestScope.value},为什么能从request域中取出在acitonContext的东西?其实是请求request发送经过我们核心过滤器类StrutsPrepareAndExecuteFilter,方法doFileter里WrapRequest(request)方法将request进行了替换,改装了原有request的getAttribute()的取值位置,本来只从request域取改装成了既可以到request域(先到这里找)拿,也可以在ActionContext(后找)取,这意味着使用el表达式在request域中取值的时候,若取不到,还会去值栈中找,所以el表达式间接地还可以从值栈拿数据!
PS:改装后的getAttribute(),会先从request域去找,如果找不到会去valueStack去找,先找root的栈开始找,其次是context部分的actionContext
三.ServletActionContext(struts是不推荐的,希望通过map的方式来获取原生api)
1.直接调用就行了,上例子:
>ServletActionContext.getRequest();获取request对象
>ServletActionContext.getResponse();获取response对象
>ServletActionContext.getRequest().getSession();获取session对象
>ServletActionContext.getServletContext();获取servletContext对象
四.实现接口方式(更不推荐)
1.举个例子:如果你想要获取request对象,可以实现ServletRequestAware接口,需要实现一个setServletRequest(HttpServletRequest request);没错,参数就是我们要的request对象,这样我们就拿到了
2.该setServletRequest(HttpServletRequest request)的参数request对象是通过拦截器中的ServletConfig拦截器对应的类的intercept方法中经过判断后获取原生request,并调用了该setServletRequest对象将原生对象传输。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~