Jsf 使用可选的facelet标记库
我有一个使用可选模块的web应用程序。这些模块是作为Web片段项目实现的,它们的JAR可能会也可能不会随war一起部署,这取决于构建概要文件 模块可以包含自己的Jsf 使用可选的facelet标记库,jsf,jsf-2,Jsf,Jsf 2,我有一个使用可选模块的web应用程序。这些模块是作为Web片段项目实现的,它们的JAR可能会也可能不会随war一起部署,这取决于构建概要文件 模块可以包含自己的module.taglib.xml和http://company.com/module名称空间和一些标记 war xhtml模板使用如下模块标记: <ui:composition ... xmlns:mod="http://company.com/module"> <c:if test="#{moduleDeploye
module.taglib.xml
和http://company.com/module
名称空间和一些标记
war xhtml模板使用如下模块标记:
<ui:composition ... xmlns:mod="http://company.com/module">
<c:if test="#{moduleDeployed}">
<mod:someTag />
</c:if>
问题
到目前为止,我计划以任何方式禁用警告:例如,如果必须,覆盖消息渲染器并检查消息字符串。如果问题2出现,请使构建为未部署的模块提供占位符taglib.xml文件。尽管占位符taglib似乎是一个不错的解决方案,但它们似乎也更难实现和维护 所以最后我还是过滤了这些信息。这可能是Mojarra特有的:消息文本,迭代器允许删除的事实(规范并不禁止,但也不是必需的)。众所周知,它与Mojarra 2.2.8到2.2.13一起工作
public class SuppressNoTaglibraryExistsFacesMessage implements SystemEventListener {
private static final Pattern PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE =
Pattern.compile("Warning: This page calls for XML namespace \\S+ declared with "
+ "prefix \\S+ but no taglibrary exists for that namespace.");
@Override
public void processEvent(SystemEvent event) {
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();
while (messages.hasNext()) {
String messageSummary = messages.next().getSummary();
if (PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE.matcher(messageSummary).matches()) {
messages.remove();
}
}
}
@Override
public boolean isListenerForSource(Object source) {
return true;
}
}
在faces-config.xml中:
<system-event-listener>
<system-event-listener-class><packages>.SubscribeListenersAfterApplicationPostConstructListener</system-event-listener-class>
<system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
</system-event-listener>
.SubscribeListenerAfterApplicationPostConstructListener
javax.faces.event.postconstructionApplicationEvent
尽管占位符标记库看起来是一个不错的解决方案,但它们似乎也更难实现和维护
所以最后我还是过滤了这些信息。这可能是Mojarra特有的:消息文本,迭代器允许删除的事实(规范并不禁止,但也不是必需的)。众所周知,它与Mojarra 2.2.8到2.2.13一起工作
public class SuppressNoTaglibraryExistsFacesMessage implements SystemEventListener {
private static final Pattern PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE =
Pattern.compile("Warning: This page calls for XML namespace \\S+ declared with "
+ "prefix \\S+ but no taglibrary exists for that namespace.");
@Override
public void processEvent(SystemEvent event) {
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();
while (messages.hasNext()) {
String messageSummary = messages.next().getSummary();
if (PTTRN_NO_TAGLIBRARY_EXISTS_FOR_NAMESPACE.matcher(messageSummary).matches()) {
messages.remove();
}
}
}
@Override
public boolean isListenerForSource(Object source) {
return true;
}
}
在faces-config.xml中:
<system-event-listener>
<system-event-listener-class><packages>.SubscribeListenersAfterApplicationPostConstructListener</system-event-listener-class>
<system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
</system-event-listener>
.SubscribeListenerAfterApplicationPostConstructListener
javax.faces.event.postconstructionApplicationEvent
为什么不确保“可选”模块始终存在?Waaaaay比所有这些类型的黑客更容易。就问题而言,这是一个要求。1.不希望向客户提供超过订购数量的产品。2.动态绑定材料,例如CDI替代品。3.执行动态绑定实现的正确性。占位符taglib实际上不是一个坏主意。占位符taglib是我最后的选择,因为我们使用Maven和所有东西(概要构建)也必须使用m2e。这不是一个坏主意,因为您的构建系统目前已经知道如何区分它们。我会认为这是一个“干净”的解决方案,而不需要在JSF API/IMPL中进行黑客攻击。另一个完全不同的选择是提供/指定包含文件作为入口点,并结合自定义资源处理程序,但这需要更改模板,使其不那么干净。为什么不确保“可选”模块始终存在?Waaaaay比所有这些类型的黑客更容易。就问题而言,这是一个要求。1.不希望向客户提供超过订购数量的产品。2.动态绑定材料,例如CDI替代品。3.执行动态绑定实现的正确性。占位符taglib实际上不是一个坏主意。占位符taglib是我最后的选择,因为我们使用Maven和所有东西(概要构建)也必须使用m2e。这不是一个坏主意,因为您的构建系统目前已经知道如何区分它们。我会认为这是一个“干净”的解决方案,而不需要在JSF API/IMPL中进行黑客攻击。另一种完全不同的方法是提供/指定include文件作为入口点,并结合自定义资源处理程序,但这需要更改模板,使其不那么干净。增加了一个关于这个的前言,当然。增加了一个序言。