浅析struts2源码中对requset的封装

 

 当前台发送来HttpServletRequest的请求的时候,struts2是用StrutsPrepareAndExecuteFilter的doFilter来接收并处理的.

(现在web.xml的配置都是StrutsPrepareAndExecuteFilter了吧)

而struts2刚开始就对request和response进行了封装

 

prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);

 设置编码:

        if (defaultEncoding != null) {
            encoding = defaultEncoding;
        }

 

       if (encoding != null) {
            try {
                request.setCharacterEncoding(encoding);
            } catch (Exception e) {
                LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);
            }
        }

 

        Locale locale = null;
        if (defaultLocale != null) {
            locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale());
        }

 

       if (locale != null) {
            response.setLocale(locale);
        }

 

而默认编码defaultEncoding,在初始化Dispatcher的时候被设置如下:

    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
    public void setDefaultEncoding(String val) {
        defaultEncoding = val;
    }

 STRUTS_I18N_ENCODING就是"struts.i18n.encoding"

在default.properties中struts.i18n.encoding=UTF-8

所以set request默认的编码是UTF-8

 

而Locale默认是null,貌似是因为required=false(仅是推断,没有验证)

    @Inject(value=StrutsConstants.STRUTS_LOCALE, required=false)
    public void setDefaultLocale(String val) {
        defaultLocale = val;
    }

 

 

继续回到StrutsPrepareAndExecuteFilter的doFilter

开始生成新的request (StrutsRequestWrapper类型) 

request = prepare.wrapRequest(request);

 在Dispatcher中,直接返回StrutsRequestWrapper:

else {
            request = new StrutsRequestWrapper(request);
        }

        return request;

 

那么原先从前台传来的HttpServletrequest在哪呢

 

回到:

prepare.createActionContext(request, response);
 ActionContext ctx;
 ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
 stack.getContext().putAll(dispatcher.createContextMap(request, response, null, servletContext));
 ctx = new ActionContext(stack.getContext());
ActionContext.setContext(ctx);

 在方法里生成了一个新的ActionContext 而HttpServletRequest就存放ActionContext 中,

首HttpServletRequest由RequestMap接收

其次RequestMap ApplicationMap 又经过一次put放在Map<String,Object> extraContext中:

extraContext.put(StrutsStatics.HTTP_REQUEST, request);

而extraContext被putAll进ValueStack 的Map中,最终被ActionContext接收

 

 
 

 

获取HttpServletrequest的方法:

1)
ActionContext context = ActionContext.getContext();   
HttpServletRequest request=(HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);   
HttpServletResponse response = (HttpServletResponse)context.get(ServletActionContext.HTTP_RESPONSE);   
2)
HttpServletRequest request = ServletActionContext.getRequest();

 

两种方法实际是相同 的:

 

    public static HttpServletRequest getRequest() {
        return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);
    }

 

 

 

以上,不知道有哪点理解的不对  希望大家指出

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码) 数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994 立即下载

相关推荐

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Struts学习----封装请求参数

struts2使用servletapi的3种方式 1.action类实现 ServletContextAware,ServletRequestAware,ServletResponse 这三个接口 public class Demo1Action extends ActionSupport implements ServletRequestAware,Se...

nonpricklycactus的博客 261

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

struts2----对对象数据的封装

对对象的数据封装有三种方法 一、通过原始的方法 package com.tui; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class Form1DemoAction3 extends ActionSupport implemen

qq_38345598的博客 282

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

如何利用东南大学齿轮箱数据集进行故障诊断?从数据采集到模型训练全流程解析

本文详细解析如何利用东南大学齿轮箱数据集进行故障诊断,涵盖从数据采集到模型训练的全流程。通过信号预处理、特征工程构建及多种机器学习模型对比,帮助开发者高效实现工业设备健康管理。特别适合希望将AI技术应用于工业场景的Python开发者。

m2n3b4v5c6的博客 377

Struts2如何封装请求参数

众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得 这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。    要完成这个功能,有很

shannonlee的专栏 1000

微信4.1.5.16升级后,你的自动化脚本失灵了?手把手教你用C#让UI树“复活”

微信4.1.5.16版本更新导致自动化脚本失效?本文深入解析微信UI树隐藏的原因,并提供C#实战解决方案,通过UIAutomation技术恢复UI树结构,帮助开发者重新实现自动化操作。涵盖技术原理、代码实现及优化策略,适合RPA开发者和自动化脚本编写者参考。

weixin_30879169的博客 519

struts的request包装替换的思想

request包装替换的思想   StrutsRequestWrapper包装了HttpServletRequestWrapper,所以在struts中用的request是StrutsRequestWrapper 想这种要包装原有的: 1,覆盖,重写         2,重写包装,在后面这个之前传入重写的类(用多态的方式)   传入时机是使用前即可,对于request就在最...

yuhui666666的博客 404

PCL点云库入门(第1讲)——PCL库简介和安装(Win10/11+VS2019+PCL 1.12.0)

PCL,全称为,即点云库,是一个专注于2D/3D图像和点云处理的大型开源项目。该项目最初由斯坦福大学的杰出计算机视觉专家Radu博士及其团队开发和维护,经过十余年的发展,目前(2024年12月)已更新至1.14.1版本。PCL点云库集成了众多尖端的点云处理算法,这些算法不仅包括基础的滤波、特征估计、表面重建、配准、模型拟合和分割等,还涵盖了更高级的功能,如点云数据的语义理解、场景解析以及动态环境下的实时处理。这些算法能够对含有噪声的点云数据进行有效过滤,去除异常值;

qq_36812406的博客 1万+

第1.2章 机器人SLAM计算机基础总结(二):VSCode教程及 AI等效率插件推荐

如何高效编写代码?怎样快速调试程序?**别担心,今天就给大家带来一款超强大的编程神器 ——VSCode,以及能让编程之路 “一马平川” 的实用插件推荐,无论你是新手小白还是资深大神,都能从中受益!

行知SLAM 1862

Struts2把session、request这些web对象封装起来

想要寻摸个自己惯用的、比较完善的框架出来。Struts2把session、request这些web对象封装起来,固然带来了很多便利,但有时也是个麻烦。用这个方法可以在自己的Action里获取到这些对象,并进行操作。 from:http://blog.youkuaiyun.com/puffCN/archive/2010/05/19/5607557.aspx Struts2 的Action中若希望访问Sess

king_min007的专栏 2455

PCL 循环体素滤波

本文提出了一种自动循环体素滤波算法,用于解决点云配准中分辨率差异大、参数设置复杂的问题。算法通过计算点云分辨率(公式1),采用迭代方式调整体素尺寸(公式2),逐步逼近目标分辨率。该方法在保留几何特征的同时有效精简数据量,实现了均匀分辨率的自动调整。实验通过PCL库实现,展示了原始点云与滤波结果的对比效果,验证了算法在减少数据规模方面的有效性。该方法为点云配准提供了预处理解决方案,相关成果已发表于SCI期刊。

点云侠的博客 282

struts2国际化--你知道LocalizedTextUtil吗?

今天在继续发邮件子系统时,遇到了一个问题,就是我们发邮件时也要国际化,就是同一封邮件,发给不同的用户,可能采用的语种也不同。如果有多少个语种就做多少模板,这是不现实的,因我们支持的语种比较多而且模板类型也比较多,这样数量就会大大增加,以后如果有需求更改,将是一个不小的工作量。   当然解决这个问题最好的方法,就是对这些模板里的信息进行国际化,关键是如何国际化。我不想为这个子系统专门建立一个单独的国...

kino 357

微信小程序视频内容服务类目审核不过?绕过审核的两种思路!

虽然不推荐绕过官方审核,但在实际项目中,总有一些特殊情况:比如,最近开发的小程序涉及视频播放,提交审核时,被官方要求补充“教育服务 - 在线视频课程”类目。但我们的内容只是车辆使用介绍,并非教育课程,无法提供相应资质。该怎么办?很多开发者发现,小程序开发不是最难的,审核才是最难的。 微信为了规避法律风险,要求某些功能必须提供资质。例如:然而,并不是所有公司都能轻松申请到这些资质,甚至有些资质根本不适用于我们的业务,导致审核卡住,无法上线。就像我遇到的这个问题,官方要求我们补充“在线视频课程”类目,但实际业务

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3248

网络工程师面试题汇总(二)

网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。而互联网(Internet)是全球范围的互连网。因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。地址解析协议 ARP(Address Resolution Protocol)

悦分享 185

Struts2对请求数据的处理(获取与封装)

1、Action的一些注意点: 自己编写的Action类一般需要继承ActionSupport Servet是单例存在的,也就是说servlet的实现类只会创建一次对象,但是Struts2中的Action是多例的,也就是说每一次请求都会有一个action实例,不需要担心共享数据的问题,可以在action中定义成员属性。 如果在配置文件中不指定action执行的方法,那么其会执行execute...

weixin_42577116的博客 422

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

Struts2请求参数封装三

Struts2请求参数封装三——模型驱动 模型驱动需要Action类实现ModelDriven接口并实现 getModel()方法,该方法返回值必须是T类型的实例。 总之:三种请求参数的封装都需要struts2框架去执行params拦截器,第三种模型驱动还有需要modeldriven拦截器的执行 具体实现代码如下: Action public class HelloAction extends ActionSupport implements ModelDriven<User>{ privat

Pamy的博客 189

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Structs2中的国际化

1.在Action类的类路径下,建Basename.language-country.properties文件 例如:zhang.en_US.properties,zhang.zh.CN.properties文件 2.在struct.xml文件中配置要读取的国际化资源文件 代码: 3.在页面上可以读取国际化资源文件的属性 <s:text name=“title”></s:text...

qq_43257103的博客 251

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

struts2 上传文件 parseRequest()解析request为空 解决办法

1、如果struts2是 status2.3.4 在配置文件struts.xml里加上 ? 1 2 3 4 bean type= "org.apache.struts2.dispatcher.multipart.MultiPartRequest" name= "myRequestPa

StackOverFLow 1435

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Struts2源码分析(二)Struts2运行流程分析

Struts2是很早之前学过的。刚刚学完Servlet之后就开始学习Struts2。学完Struts2的基础知识后就着手开始做了个小项目。现在正在学SpringMVC,感觉SpringMVC确实是比Struts2好用一点。现在一边学习SpringMVC,一边重新研究Struts2源码

不能说的秘密的博客 5155

Struts2和Servlet在上传文件时的区别

Struts2会解析封装Requset Servlet获取的Requset形式为 org.apache.catalina.connector.RequestFacade Struts2重新封装过的Request的形式为 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper 原本Servlet的保存文件的

u013812325的博客 2140

Windows 8引入的新的language tag导致的本地化问题

问题: http://jira.ahzti.com:8080/browse/SPINERP-146 Struts2的应用,本地化字符串在Windows 8+IE11时显示错误,为resource key。   Windows 8引入的新的language tag导致的本地化问题 > image2013-12-18 22:3:18.png" src="http://jira.ahz

Daily of programming 3904
下一篇: Ioc的学习
jcloud159
博客等级 码龄15年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值