You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay项目中获取HTML表单值返回空/Null的问题求助

解决方案

1. 确认Controller处理的是Action请求而非Render请求

Liferay Portlet的请求分为Action请求(处理表单提交、数据操作)和Render请求(负责页面渲染)。表单提交的参数只会存在于ActionRequest中,若你在doView、render这类渲染阶段的方法里用renderRequest获取参数,必然拿不到值。

  • JSP中需生成Action URL作为表单提交目标:
    <portlet:actionURL var="submitBrandUrl" name="submitBrands" />
    <form action="<%= submitBrandUrl %>" method="post">
        <input type="checkbox" name="selectedBrand" value="Roadster" /> Roadster
        <input type="checkbox" name="selectedBrand" value="LOCOMOTIVE" /> LOCOMOTIVE
        <button type="submit">提交</button>
    </form>
    
  • Controller中定义对应Action方法:
    @ProcessAction(name = "submitBrands")
    public void submitBrands(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {
        String[] selectedBrands = ParamUtil.getStringValues(actionRequest, "selectedBrand");
        // 业务逻辑处理
    }
    

2. 规范使用ParamUtil工具类

若已在Action方法中,检查以下细节:

  • 必须传入ActionRequest而非RenderRequest
  • 参数名称需完全匹配(Liferay参数区分大小写)
  • 可指定默认值避免空数组问题:
    String[] selectedBrands = ParamUtil.getStringValues(actionRequest, "selectedBrand", new String[0]);
    

3. 处理Portlet命名空间问题

若portlet.xml中requires-namespaced-parameters设为true(默认配置),表单参数会自动添加Portlet命名空间,此时需调整参数名称:

  • JSP中给表单元素名称添加命名空间:
    <input type="checkbox" name="<portlet:namespace />selectedBrand" value="Roadster" /> Roadster
    
  • Controller中带命名空间获取参数:
    String namespace = actionRequest.getNamespace();
    String[] selectedBrands = ParamUtil.getStringValues(actionRequest, namespace + "selectedBrand");
    

4. 直接从参数Map提取

若以上方法无效,可尝试直接从ActionRequest的参数Map中取值:

Map<String, String[]> paramMap = actionRequest.getParameterMap();
String[] selectedBrands = paramMap.get("selectedBrand");

内容的提问来源于stack exchange,提问作者Vishwanath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:21