默认情况下,JSF 将所有模型值作为XSS attack prevention 的一部分进行 HTML 转义。您的具体问题表明您对此一无所知。您可以使用 <h:outputText> 并将 escape 属性设置为 false 来“解决”它。
<h:outputText value="#{bean.message}" escape="false" />
但是,您的具体问题更大。您处于 JSF/MVC 的角度,基本上在这里犯了两个主要的设计错误:
- 在模型中而不是在视图中编写 HTML 代码。
- 在操作方法中而不是在验证器中执行验证。
您应该在视图中编写 HTML 代码,而不是在模型中。您应该使用普通的 JSF 验证器执行验证。 JSF 有很多内置的验证器。
此外,不是真正的设计错误,而是用户体验错误,还有第三个错误:使用 JavaScript 警报显示验证消息。这简直就是 1990 年和 Web 1.0。我们现在是 2013 年,我们学到了很多,很多当时的用户体验失败。使用 JavaScript 警报来显示验证消息就是其中之一。
这是使用 JSF 提供的验证工具的正确方法:
<h:form>
<h:selectOneMenu value="#{bean.docProcessId}" required="true"
requiredMessage="Please Select Doc Process Name">
<f:selectItems ... />
</h:selectOneMenu>
<h:inputText value="#{bean.refTypeName}" required="true"
requiredMessage="Enter Reference Type Name" />
<h:commandButton value="submit" />
<h:messages />
</h:form>
就是这样。 required="true" 告诉 JSF 这些输入是必需的。 requiredMessage 属性允许您为所需的验证指定自定义消息。消息将显示在<h:messages> 声明的位置。您可以通过layout 属性和CSS 方式(如infoClass、errorClass 等)自定义布局。您甚至可以手动循环它并为每条消息手动创建烦人的警报,而不是使用<h:messages>:
<ui:repeat value="#{facesContext.messageList}" var="message">
<script>alert("#{message.summary}");</script>
</ui:repeat>