[WEB前端开发]-关于Velocity中Map与List操作-解决velocity无法识别Map对象key的问题

本文介绍如何在Velocity模板中使用List和Map初始化复选框的状态。通过Java代码获取物流列表,并利用Map来标记哪些复选框应当被选中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:初始化复选框

1.通过一个List列表,列出所有的复选框。
2.通过一个Map参数,初始化选中的复选框。

场景总结

在velocity中,Map对象的key必须是string才能识别到,一开始用Long型总是无法识别。以下看代码详细:

VM代码:

<div class="span8">
    <div class="pull-right">
        <label class="control-label superLable">物流关系:</label>
        <div class="controls">
            <input type="checkbox" id="all"> 
            <input type="button" value="全选" class="btn" id="selectAll"> 
        </div>
        <div class="controls">
        <ul id="list"> 
        #foreach($param in $expressList)
                    #if($!shopexpressMap.get($!{param.id}))
                        <li><label><input type="checkbox" value="$!{param.id}" checked>$!{param.expressFullName}</label></li> 
                    #else 
                        <li><label><input type="checkbox" value="$!{param.id}">$!{param.expressFullName}</label></li> 
                    #end
        #end
        </ul>
        </div>
    </div>
</div>

Java代码

    {
        LogUtil.info(MODULE, "========= 编辑店铺物流信息      开始 ============");

        //获取所有物流列表信息
        BaseExpressReqDTO sdto = new BaseExpressReqDTO();
        List<BaseExpressRespDTO> expressListBack = baseExpressRSV.fetchAllExpressInfo(sdto);
        List<TmpTestVO> expressList = new ArrayList<TmpTestVO>(expressListBack.size());

        for(BaseExpressRespDTO dto: expressListBack)
        {
            TmpTestVO vo = new TmpTestVO();
            vo.setId(String.valueOf(dto.getId()));
            vo.setExpressFullName(dto.getExpressFullName());
            vo.setExpressName(dto.getExpressName());
            expressList.add(vo);
        }
        //获取该店铺对应的物流列表
        Map<String, ShopExpressResDTO> shopexpressMap = shopInfoRSVDubbo.listShopExpress(Long.valueOf(shopId));


        model.addAttribute("expressList", expressList);
        model.addAttribute("shopexpressMap", shopexpressMap);

        LogUtil.info(MODULE, "========= 编辑店铺物流信息      结束 ============");

        return "/staff/shop/express/shop-express";
    }

效果

勾选的就是初始化的复选框

<think>好的,我现在要解决用户关于Velocity模板引擎中使用#set语法初始化Map变量的问题。首先,我需要回忆Velocity模板引擎的基本语法,特别是变量定义的部分。记得Velocity使用#set来声明变量,但用户问的是如何定义Map,可能需要特定的语法结构。 首先,我应该查阅Velocity的官方文档或者可靠资料,确认是否支持直接定义Map。根据用户提供的引用,比如引用[3]提到了可以设置ListMap,但没有具体说明语法。引用[4]中的示例展示了设置字符串和拼接,但没涉及Map。可能需要结合这些信息推断。 接下来,思考如何在Velocity中创建Map。通常,在Java中,Map是键值对的集合,但Velocity的语法可能同。可能需要使用类似Java的语法,比如使用大括号和键值对。例如:#set($myMap = { "key1": "value1", "key2": "value2" })。过,确定Velocity是否支持这种字面量初始化。 另外,用户提供的引用中没有直接提到Map的定义方法,但引用[3]指出可以设置Map类型,所以应该存在相应的语法。可能需要使用Velocity的工具类或者内置方法来创建Map实例,比如使用$util或类似工具,但用户可能没有这些扩展,所以需要基础方法。 再考虑Velocity是否允许直接赋值键值对。例如,是否可以先创建一个空的Map对象,然后逐个添加键值对。但#set可能只能赋值一次,所以可能需要一次完成。或者,使用数组的方式,如#set($myMap.key = "value"),但这样可能隐式创建Map结构。 查找类似的问题或示例,比如在Velocity中初始化List,通常使用#set($list = ["a", "b"]),那么Map可能是使用花括号和冒号分隔键值对。例如:#set($map = { "name": "Lee", "age": 30 })。这种情况下,用户可以直接在模板中定义Map。 然后,验证这种语法是否有效。可能需要测试,但根据引用[3]提到可以设置Map类型,应该支持。因此,正确的做法可能是使用大括号和冒号来初始化Map,每个键值对用逗号分隔,整个结构放在#set语句中。 最后,总结步骤,并生成示例代码,确保语法正确。同时,提醒用户注意逗号分隔和可能的转义字符,以及访问Map元素的方式,如$map.get("key")或$map.key。</think>在Velocity模板引擎中,可以通过$!{}和#set语法结合Java语法规则初始化Map变量。具体实现方式如下: **定义Map变量的标准语法:** ```velocity #set($myMap = { "name": "Lee", "age": 30, "skills": ["Java", "Velocity"] }) ``` **访问Map元素的方法:** 1. 直接通过键名访问:`$myMap.name` 2. 使用get方法访问:`$myMap.get("age")` 3. 嵌套结构访问:`$myMap.skills[0]` **注意事项:** 1. 键值对必须用英文逗号分隔 2. 字符串类型的键需要加引号 3. 支持嵌套List/Map等复杂结构[^3] 4. 可通过put方法动态添加元素:`$myMap.put("newKey","value")` **完整示例:** ```velocity #set($employee = { "id": "E1001", "department": { "name": "R&D", "floor": 5 }, "projects": ["AI", "BigData"] }) 员工ID:$employee.id 部门楼层:$employee.department.floor 首个项目:$employee.projects.get(0) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值