Struts request param 去除空格 TrimInterceptor

本文介绍了一个自定义的Struts2拦截器,用于在请求处理前对所有参数进行修剪操作,避免传递空字符串等问题。该拦截器还提供了一种机制来排除不需要修剪的参数。
package com.ehi.struts.interceptor.servicemanagement;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
import org.apache.commons.lang.StringUtils;

/**
* An interceptor to trim all the parameters. <br>
* It's bascially adapted from the book, <br/>
* 'Apache Struts 2 Web Application Development'
*
* @author candicew
*
*/
@SuppressWarnings("serial")
public class TrimInterceptor extends MethodFilterInterceptor {

private List<String> excluded = new ArrayList<String>();

protected String doIntercept(ActionInvocation invocation) throws Exception {
Map<String, Object> parameters = invocation.getInvocationContext().getParameters();

for (String param : parameters.keySet()) {
if (shouldTrim(param)) {
doTrim(parameters, param);
}
}

return invocation.invoke();
}

void doTrim(Map<String, Object> parameters, String param) {
Object val = parameters.get(param);
if(val == null){
return;
}
if (val instanceof String) {
trimString(parameters, param, val);
} else {
trimStringArray(parameters, param, val);
}
}

private void trimString(Map<String, Object> parameters, String param, Object val) {

String value = (String) val;
value = StringUtils.trimToNull(value);
parameters.put(param, value);

}

private void trimStringArray(Map<String, Object> parameters, String param, Object val) {

String[] vals = (String[]) val;
boolean allNull = true;
for (int i = 0; i < vals.length; i++) {
vals[i] = StringUtils.trimToNull(vals[i]);
allNull = allNull && (vals[i] == null);
}
if (allNull) {
parameters.put(param, null);
}

}

private boolean shouldTrim(String param) {
for (String exclude : excluded) {
if (param.equalsIgnoreCase(exclude)) {
return false;
}
}

return true;
}

public void setExcludedParams(String excludedParams) {
for (String s : StringUtils.split(excludedParams, ",")) {
excluded.add(s.trim());
}
}

}
<think>我们正在处理关于request.param的问题。根据用户的问题,用户想了解request.param的用途和使用示例。根据引用[1]和引用[2],我们注意到它们讨论了Request.Params[]和request.getParameter(),这些是Web开发中获取请求参数的方法,但用户的问题是关于request.param,这可能是在测试框架(如pytest)中使用的,因为引用[3]提到了request.config.getoption,这通常出现在测试框架的上下文中。在pytest测试框架中,request是一个fixture,它提供了请求测试的上下文信息。其中,request.param用于参数化测试中,当使用@pytest.mark.parametrize标记时,可以通过request.param来获取每个测试用例的参数值。因此,我们推断用户可能是在使用pytest进行参数化测试时遇到了问题,想了解request.param的用法。下面我们将围绕pytest中的request.param进行回答。</think>### request.param 用途及使用示例 `request.param` 是测试框架中用于参数化测试的关键对象,**主要用于在测试用例中动态获取参数值**。它常见于 Python 测试工具(如 `pytest`)的参数化测试场景中,通过 `@pytest.mark.parametrize` 标记实现多组数据驱动测试。 --- ### **核心用途** 1. **参数化测试** - 为同一测试函数提供多组输入参数和预期结果,避免重复代码。 - 每次测试运行时,`request.param` 自动传递当前参数组的值。 2. **动态生成测试用例** - 结合外部数据源(如列表、字典、文件),批量生成测试用例。 --- ### **使用示例** #### 场景 1:基本参数化测试 ```python import pytest # 定义参数化数据 test_data = [("user1", "pass123"), ("user2", "abc456")] @pytest.mark.parametrize("username, password", test_data) def test_login(request, username, password): # 通过 request.param 获取当前参数组(等效于直接使用 username, password) print(f"测试账号: {request.param[0]}, 密码: {request.param[1]}") # 执行登录验证逻辑 assert len(password) > 5 ``` **说明**: - `@pytest.mark.parametrize` 声明参数名称和数据集 `test_data`。 - 测试函数中可通过 `request.param` 访问当前参数组(如 `("user1", "pass123")`)。 #### 场景 2:复杂参数结构 ```python import pytest # 字典参数化(含预期结果) test_cases = [ {"input": 2, "expected": 4}, {"input": -3, "expected": 9} ] @pytest.mark.parametrize("case", test_cases, indirect=True) def test_square(request, case): data = request.param # 获取字典参数 result = data["input"] ** 2 assert result == data["expected"] ``` **说明**: - `indirect=True` 允许通过 `request.param` 传递完整参数对象。 - 直接通过 `request.param["input"]` 和 `request.param["expected"]` 访问数据。 #### 场景 3:结合 Fixture 动态生成数据 ```python import pytest # 定义生成参数的 Fixture @pytest.fixture(params=[10, 20, 30]) def dynamic_data(request): return request.param * 2 # 返回加工后的数据 def test_dynamic_value(dynamic_data): assert dynamic_data % 10 == 0 # 验证是否为10的倍数 ``` **说明**: - Fixture 的 `params` 列表自动生成多组测试。 - Fixture 内部通过 `request.param` 获取原始参数值(如 `10`),加工后返回给测试用例。 --- ### **常见问题解决** 1. **`request.param` 未定义?** - 确保测试函数或 Fixture 添加了 `request` 参数。 - 检查是否遗漏 `@pytest.mark.parametrize` 或 `params` 声明。 2. **参数传递错误?** - 若参数为复杂对象,需设置 `indirect=True`。 - 通过 `pytest --collect-only` 命令预览生成的参数化用例。 --- ### **对比其他参数获取方式** | 方法 | 适用场景 | |---------------------|----------------------------------| | `request.param` | 参数化测试(动态数据驱动) | | `request.get_param()` | HTTP 请求参数(如 Web 框架) | | `request.config.getoption()` | 命令行选项(如 `pytest --env=prod`)[^3] | > 提示:在 Web 开发中(如 Flask/Django),应使用 `request.args` 或 `request.form` 获取参数,而非 `request.param`[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值