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
相关产品推荐
相关产品推荐

