003 - 接收参数_中文问题

本文介绍Struts2框架中三种不同的参数接收方式:通过Action属性接收、使用DomainModel接收以及采用模型驱动(ModelDriven)接收,并提供了解决中文乱码的方法。

1)接收参数

1. 用属性接受参数给Action

   注意Action里的属性名就尽量与要传递的属性名相同

(注意不是直接给Action中的同名属性直接赋值)

 

   如链接:     <a href="user/user!add?name=a&age=8">添加用户</a>
   它用调UserAction的setName(),和setAge()方法   然后再调add()方法

 

相应在struts.xml中的配置:

   <package name="user" extends="struts-default" namespace="/user">
        <action name="user" class="user.action.UserAction">
                        <result>/user_add_success.jsp</result>
          </action>
</package>
 
 
 

2. 使用DomainModel接受参数给Action.

 

如链接:   <a href="user/user!add?user.name=a&user.age=8"> 

 

这时struts2 会在struts.xml中找到相应的Action(即下面的UserAction),

然后 new UserAction().setUser().setName()

之后再调用Action的add()方法

 

注意一定要把DMI 打开,在struts.xml中加入

<constant name="struts.enable.DynamicMethodInvocation" value="true" /> ,否则会出现下面信息

 

严重: Could not find action or result
There is no Action mapped for namespace /user and action name user!add. - [unknown location]

....

 

 

 

struts.xml的配置同上

//UserAction.java

public class UserAction extends ActionSupport {
 

 private User user;

 public String add() {

  System.out.println("name=" + user.getName());
  System.out.println("age=" + user.getAge());
  return SUCCESS;

}

 public User getUser() {
          return user;
 }

 public void setUser(User user) {
          this.user = user;
 }


}

 
当前台的属性跟DomainModel(即User) 不能完全匹配时,可用DTO来解决
解决办法:
Action中用UserDTO 来接受前台传来的属性,然后再 new User(UserDTO) ,之后可能就是save(User user)
.

3. 用模型驱动来接受参数(ModelDriven)

这时Action应实现ModelDriven
链接写法:<a href="user/user!add?name=a&age=8">添加用户</a>

 
过程: 当前台请求被struts2的filter拦截后,new UserAction().getModel()
把得到的Model(即User)返回给struts2
之后,user().setName() , user().setAge()
这样就把参数接受过来了
 
struts.xml的配置同上
//UserAction.java
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();  //注意要自己new
 
 public String add() {
        System.out.println("name=" + user.getName());
        System.out.println("age=" + user.getAge());
        return SUCCESS;
 }
 @Override
 public User getModel() {
        return user;
 }
}

 

2) 中文问题

在struts.xml中加入   <constant name="struts.i18n.encoding" value="GBK" />  即可

 

struts2.1.16 这样加不行,本身的bug

 

另处,constant 中的常量可以在 struts.core.2.1.18.jar引入包 ->static文件夹 ->default.properties文件中查到

 

 

<think>我们遇到了一个参数错误:缺少必填参数--json_dir和--output_dir。这通常是因为在运行脚本时没有正确指定这两个参数。 让我们回顾一下脚本的使用方法: 根据脚本中的argparse配置: parser.add_argument('--json_dir', required=True, help='JSON文件目录') parser.add_argument('--output_dir', required=True, help='Mask输出目录') 因此,运行脚本时必须提供这两个参数。 正确的使用方式是在命令行中指定这两个参数,例如: ```bash python json_to_mask.py --json_dir /path/to/json_files --output_dir /path/to/output_masks ``` 其中: --json_dir: 指向存放LabelMe生成的JSON文件的目录 --output_dir: 指向你想要保存生成的mask图像的目录 如果仍然出现错误,请检查: 1. 命令中是否确实包含了这两个参数? 2. 参数名称是否正确(注意是下划线,不是短横)? 3. 路径是否正确?如果路径包含空格,请用双引号括起来。 例如,如果路径中有空格: ```bash python json_to_mask.py --json_dir "C:/My Data/json" --output_dir "C:/My Data/masks" ``` 另外,请确保脚本名称正确(这里是json_to_mask.py)。 如果问题仍然存在,请检查脚本中argparse部分的代码是否正确。下面是脚本中关于参数解析的部分: ```python if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description='LabelMe JSON转Mask') parser.add_argument('--json_dir', required=True, help='JSON文件目录') parser.add_argument('--output_dir', required=True, help='Mask输出目录') args = parser.parse_args() json_to_mask(args.json_dir, args.output_dir) ``` 如果这段代码被修改过,可能会导致问题。请确保required=True没有被意外修改。 如果用户是在IDE中运行,可能需要通过配置运行参数来添加这两个参数。 例如,在PyCharm中: 1. 打开Run/Debug Configurations 2. 在Parameters一栏填写:`--json_dir /path/to/json_files --output_dir /path/to/output_masks` 在Jupyter Notebook或类似环境,则不适合使用argparse,需要修改脚本直接调用函数。 因此,请根据您的运行环境选择合适的方式传递参数。 如果问题已解决,您可以继续使用该脚本进行转换。如果还有其他问题,请提供具体的错误信息。</think>### 解决参数错误问题 当运行 `json_to_mask.py` 脚本时出现 **"缺少必填参数--json_dir和--output_dir"** 错误,说明您未正确指定输入输出路径。以下是正确使用方式: #### 正确命令格式 ```bash python json_to_mask.py --json_dir [JSON文件路径] --output_dir [输出目录路径] ``` #### 示例命令 ```bash # Windows 示例 python json_to_mask.py --json_dir "C:\labelme_data\jsons" --output_dir "D:\dataset\masks" # Linux/macOS 示例 python json_to_mask.py --json_dir "/home/user/labelme_jsons" --output_dir "/home/user/mask_output" ``` #### 关键参数说明 | 参数 | 必需 | 说明 | 示例值 | |------|------|------|--------| | `--json_dir` | 是 | LabelMe生成的JSON文件目录 | `"C:\dataset\jsons"` | | `--output_dir` | 是 | 转换后的mask输出目录 | `"D:\masks\train"` | #### 常见错误解决方案 1. **路径包含空格** → 用双引号包裹路径 ```bash # 错误:路径中的空格导致参数截断 python json_to_mask.py --json_dir C:\my data\jsons # 正确:用引号包裹含空格路径 python json_to_mask.py --json_dir "C:\my data\jsons" ``` 2. **相对路径问题** → 使用绝对路径或明确相对位置 ```bash # 从父目录执行(推荐绝对路径) python scripts/json_to_mask.py --json_dir data/raw --output_dir data/masks ``` 3. **参数拼写错误** → 检查参数名称 ```bash # 错误:参数名拼写错误 python json_to_mask.py --json_dirs ... # 应为--json_dir ``` #### 验证脚本参数 在脚本开头添加调试语句确认参数接收: ```python if __name__ == "__main__": ... args = parser.parse_args() print(f"JSON目录: {args.json_dir}") # 添加验证 print(f"输出目录: {args.output_dir}") json_to_mask(args.json_dir, args.output_dir) ``` #### 自动化脚本示例 创建批处理文件简化操作(Windows): ```batch @echo off set JSON_DIR="C:\dataset\jsons" set MASK_DIR="D:\masks\train" python json_to_mask.py --json_dir %JSON_DIR% --output_dir %MASK_DIR% pause ``` ### 相关问题 1. 如何解决路径中包含中文或特殊字符导致的转换失败? 2. 转换后的mask图像出现类别ID不连续问题如何修复? 3. 当JSON文件与原始图像分离时如何确保尺寸匹配? 4. 如何扩展脚本支持多通道mask输出? 5. 转换过程中出现内存不足错误如何优化? > 提示:路径问题是最常见的错误原因,建议始终使用英文路径和双引号包裹[^1]。若问题持续,可检查脚本中的`argparse`模块实现是否完整[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值