html:messages的使用

博客介绍了消息(错误)显示的代码实现。通过创建ActionMessages对象添加消息,利用<html:messages>标签显示所有消息或指定消息,还可定制header/footer。将Messages换成Errors可用于错误显示,也常用<html:errors/>简化操作。
消息(错误)显示

ActionMessages messages = new ActionMessages();
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("userForm.insert", info.getUserName());
messages.add("activationDate", new ActionMessage("userForm.active", info.getDateLength());

如下可以显示所有消息,并用<li>将它们放入一个list,再加上可定制的header/footer
<html:messages id="message" header="errors.header" footer="errors.footer">
   <li><bean:write name="message"/></li>
</html:messages>

如下可以指定只显示某种message
<html:messages id="message" property="<%= org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %>">
   <li><bean:write name="message"/></li>
</html:messages>

把Messages换成Errors就是错误显示,为了简便,经常一个<html:errors/>了事
 
<think>好的,用户的问题是关于在JSF中使用PrimeFaces的`<p:messages>`组件实现换行输出。之前用户问过关于`<p:growl>`的换行问题,现在转到了`<p:messages>`,可能是在开发中遇到了类似的显示问题。 首先,我需要回忆一下`<p:messages>`和`<p:growl>`的区别。`<p:messages>`通常用于显示表单验证错误或其他消息,位于页面特定位置,而`<p:growl>`是浮动的通知。两者的换行处理可能有相似之处,但具体实现可能不同。 用户之前的问题提到使用`<br>`标签或`\n`换行符无效,所以需要分析`<p:messages>`的渲染方式。可能的原因包括是否启用了HTML转义,或者CSS样式是否阻止了换行符的解析。 接下来,我需要考虑解决方案。对于`<p:messages>`,常见的换行方法可能包括: 1. 使用`<br>`标签并设置`escape="false"`,但需要确认该属性是否存在。PrimeFaces的`<p:messages>`是否有这个属性?可能需要查阅文档。如果没有,可能需要其他方式处理。 2. 使用`\n`换行符,并结合CSS的`white-space`属性,比如`pre-line`或`pre-wrap`,这在之前的回答中提到过。 3. 检查消息内容的构造方式,是否正确地将换行符包含进去,比如在Java代码中使用`System.lineSeparator()`或直接添加`\n`。 另外,用户可能遇到的问题是消息被转义,导致HTML标签被显示为文本而不是解析。因此需要确认如何禁用转义,或者是否有其他属性控制这个行为。 还需要考虑PrimeFaces版本的问题,不同版本可能有不同的属性支持。比如,某些旧版本可能不支持某些CSS样式或属性,导致换行无效。 可能的示例代码包括: - 在XHTML中设置`<p:messages>`的样式,使用`white-space: pre-line`。 - 后端生成消息时添加`\n`,或者在消息中使用`<br>`并确保转义被禁用。 - 如果`<p:messages>`不支持`escape`属性,可能需要通过其他方式处理,比如使用富文本或自定义渲染。 同时,需要提醒用户注意安全性,如果使用HTML内容,确保没有XSS漏洞,尤其是在处理用户输入时。 最后,总结步骤,分点说明不同的解决方案,并提供相关问题供用户进一步参考。确保回答结构清晰,符合用户之前示例的格式要求。</think>在 JSF 中使用 PrimeFaces `<p:messages>` 组件实现换行输出,需结合 **HTML 标签** 或 **CSS 样式** 处理换行逻辑。以下是分步解决方案: --- ### **1. 使用 `\n` 换行符 + CSS 样式** - **核心原理**:通过 CSS 的 `white-space` 属性解析换行符。 - **代码示例**: ```xhtml <p:messages id="messages" style="white-space: pre-line;" /> ``` 后端 Java 代码: ```java FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("第一行\n第二行\n第三行")); ``` - **样式说明**: - `white-space: pre-line`:保留换行符,自动合并空白符。 - `white-space: pre-wrap`:保留所有空格和换行符。 - `white-space: pre`:保留格式但不自动换行。 --- ### **2. 使用 `<br>` 标签强制换行** - **关键点**:`<p:messages>` 默认会转义 HTML 标签,需通过其他方式实现。 - **解决方案**: - **自定义渲染器**:继承 `MessagesRenderer` 并禁用转义。 - **直接插入 HTML**:通过 JavaScript 动态修改消息内容。 ```xhtml <p:messages id="messages" /> <script> // 假设消息内容已包含 <br> 标签 document.querySelectorAll('.ui-messages li').forEach(li => { li.innerHTML = li.textContent.replace(/\\n/g, '<br>'); }); </script> ``` --- ### **3. 分离摘要(Summary)和详细内容(Detail)** - **适用场景**:通过 `showDetail="true"` 显示多行内容。 - **代码示例**: ```xhtml <p:messages id="messages" showDetail="true" /> ``` 后端 Java 代码: ```java FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("摘要", "详细内容\n换行示例")); ``` - **效果**: - 摘要(Summary):单行显示。 - 详细(Detail):支持 `\n` 换行(需结合 CSS)。 --- ### **4. 动态 JavaScript 插入 HTML** - **适用场景**:完全控制消息内容。 - **代码示例**: ```xhtml <p:messages id="messages" /> <script> function showCustomMessage() { const message = '第一行<br>第二行'; const li = document.createElement('li'); li.innerHTML = message; document.querySelector('.ui-messages').appendChild(li); } </script> ``` --- ### **常见问题排查** 1. **检查 HTML 转义**: - 默认情况下,`<p:messages>` 会转义 HTML 标签,需通过 `escape="false"`(如果支持)或 JavaScript 处理。 2. **CSS 样式冲突**: - 确认 `white-space` 样式未被覆盖,使用浏览器开发者工具检查元素。 3. **PrimeFaces 版本限制**: - 旧版本(如 6.x)可能不支持 `white-space`,建议升级至 10+。 4. **消息内容构造**: - 后端代码需确保换行符正确插入(如 `System.lineSeparator()`)。 --- ### **完整验证示例** ```xhtml <h:form> <p:messages id="messages1" style="white-space: pre-line;" /> <p:messages id="messages2" showDetail="true" /> <p:commandButton value="触发消息" action="#{bean.showMessage}" update="messages1 messages2" /> </h:form> ``` 后端 Java 代码: ```java public void showMessage() { FacesMessage message1 = new FacesMessage("文本换行\n成功"); FacesMessage message2 = new FacesMessage("摘要内容", "详细内容\n换行示例"); FacesContext.getCurrentInstance().addMessage(null, message1); FacesContext.getCurrentInstance().addMessage(null, message2); } ``` --- ### **注意事项** - **安全性**:避免直接插入用户输入的 HTML,防止 XSS 攻击。 - **样式兼容性**:不同浏览器对 `white-space` 支持略有差异,建议测试。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值