3

我正在尝试在 Glassfish 3.1.2 服务器上使用带有 jsf 2.1 和 Facelets 的 HTML5 文档类型。

我见过很多我们可以用 html5 doctype 替换 xhtml doctype 的地方

 <!DOCTYPE html>

并将 xhtml 的 xmlns 留在 -tag 中。在一些论坛上,他们说就是这样。但事实并非如此,至少 Firefox 不同意,因为它将页面呈现为“HTML 专有”而不是 HTML5。

似乎没有一个教程考虑 html 页面文件扩展名?这是浏览器关心的事情吗?我尝试将其从 *.xhtml 更改为 *.html,从 -tag 中删除 xhtml 命名空间,并在 web.xml 中更改

 <context-param>
   <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
   <param-value>.xhtml</param-value>
</context-param>

 <context-param>
   <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
   <param-value>.html</param-value>
</context-param>

并为 html 添加了 servlet 映射。这根本不起作用。

好的,然后我将所有内容恢复为默认值(xhtml/facelets),仅替换了 doctype-tag 并删除了引用 xhtml 的 xmlns(从所有文件/模板中)。现在我收到很多警告,例如:

 Warning: This page calls for XML namespace declared with prefix li but no taglibrary   exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix li but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix li but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix body but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix ul but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix form but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix a but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix a but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix a but no taglibrary exists for that namespace.
 Warning: This page calls for XML namespace declared with prefix a but no taglibrary exists for that namespace.

好吧,这看起来并不乐观。在 web.xml 中,我将项目阶段从开发更改为生产。

 <context-param>
     <param-name>javax.faces.PROJECT_STAGE</param-name>
     <param-value>Production</param-value>
 </context-param>

警告消失了,w3c 的验证器说这是有效的 html5。

有人对此有更好的解决方案吗?jsf/facelets 是否要求文件具有扩展名 xhtml?

4

2 回答 2

3

警告:此页面要求使用前缀 (...) 声明的 XML 命名空间,但该命名空间不存在标记库。

您需要将定义 HTML 元素的 XML 命名空间声明为全局 XML 命名空间。

那是,

<html xmlns="http://www.w3.org/1999/xhtml">
于 2013-06-17T11:17:17.357 回答
0

就我而言,添加命名空间不是一个好的解决方案:

<html xmlns="http://www.w3.org/1999/xhtml">

上述内容确实让 Facelets 解析器满意,但命名空间被写入生成的 HTML,W3C 验证器没有正确地将其检测为 HTML5。

不使用命名空间可以正常工作并且可以很好地验证,但是对于我的 .xhtml 文件中使用的每个纯 HTML 标记,上面当然会出现一个警告。

为了摆脱这些警告,我不得不创建一个自定义FacesContext

public class Html5FacesContextImpl extends FacesContextWrapper {

    private final FacesContext wrapped;

    public Html5FacesContextImpl(FacesContext wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public FacesContext getWrapped() {
        return wrapped;
    }


    private final static String XML_NAMESPACE_MSG_FILTER = "Warning: This page calls for XML namespace";

    @Override
    public void addMessage(String clientId, FacesMessage message) {
        if ( !message.getSummary().startsWith(XML_NAMESPACE_MSG_FILTER) ) {
            wrapped.addMessage(clientId, message);
        }
    }


}

工厂:

public class Html5FacesContextFactory extends FacesContextFactory {

    private FacesContextFactory delegate;

    public Html5FacesContextFactory(FacesContextFactory facesContextFactory) {
      delegate = facesContextFactory;
    }

    @Override
    public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle) throws FacesException {
        return new Html5FacesContextImpl(delegate.getFacesContext(context, request, response, lifecycle));
    }

}

faces-config.xml

<factory>
    <faces-context-factory>ca.gc.agr.common.web.jsf.context.Html5FacesContextFactory</faces-context-factory>
</factory>

这似乎有效。

于 2015-07-07T18:37:50.823 回答