Jsf 2 使用引导重复行

Jsf 2 使用引导重复行,jsf-2,jstl,el,facelets,Jsf 2,Jstl,El,Facelets,我正在尝试格式化我的站点,以便很好地使用。问题是xml正在被解析,并且不喜欢我没有关闭div标记这一事实。这假设我的组中有3的倍数 代码(更新为我的完整代码): 错误: SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception [Error Parsing /index.xhtml: Error Traced[line: 31] The element typ

我正在尝试格式化我的站点,以便很好地使用。问题是xml正在被解析,并且不喜欢我没有关闭div标记这一事实。这假设我的组中有3的倍数

代码(更新为我的完整代码):


错误:

SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception [Error Parsing /index.xhtml: Error Traced[line: 31] The element type "div" must be terminated by the matching end-tag "</div>".] with root cause
javax.faces.view.facelets.FaceletException: Error Parsing /index.xhtml: Error Traced[line: 31] The element type "div" must be terminated by the matching end-tag "</div>".
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:450)
    at com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:433)
    at com.sun.faces.facelets.compiler.Compiler.metadataCompile(Compiler.java:130)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.createMetadataFacelet(DefaultFaceletFactory.java:495)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:106)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:205)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:203)
    at com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:97)
    at com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:92)
    at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
    at com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:146)
    at com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:63)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:316)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:246)
    at com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:113)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:241)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:70)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
路径为[]的上下文中Servlet[Faces Servlet]的
SEVERE:Servlet.service()引发了异常[Error Parsing/index.xhtml:Error tracked[line:31]元素类型“div”必须由匹配的结束标记“.”终止,并带有根本原因
javax.faces.view.facelets.FaceletException:错误解析/index.xhtml:错误跟踪[line:31]元素类型“div”必须由匹配的结束标记“”终止。
位于com.sun.faces.facelets.compiler.SAXCompiler.docomfile(SAXCompiler.java:450)
位于com.sun.faces.facelets.compiler.SAXCompiler.doMetadataCompile(SAXCompiler.java:433)
位于com.sun.faces.facelets.compiler.compiler.metadataCompile(compiler.java:130)
位于com.sun.faces.facelets.impl.DefaultFaceletFactory.CreateMataFacelet(DefaultFaceletFactory.java:495)
在com.sun.faces.facelets.impl.DefaultFaceletFactory.access$200(DefaultFaceletFactory.java:106)
位于com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:205)
位于com.sun.faces.facelets.impl.DefaultFaceletFactory$2.newInstance(DefaultFaceletFactory.java:203)
位于com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:97)
位于com.sun.faces.facelets.impl.DefaultFaceletCache$2.newInstance(DefaultFaceletCache.java:92)
位于com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
在java.util.concurrent.FutureTask.run(FutureTask.java:262)处
位于com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
位于com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:146)
位于com.sun.faces.facelets.impl.DefaultFaceletCache.getViewMetadataFacelet(DefaultFaceletCache.java:63)
位于com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:316)
位于com.sun.faces.facelets.impl.DefaultFaceletFactory.getMetadataFacelet(DefaultFaceletFactory.java:246)
在com.sun.faces.application.view.ViewMetadataImpl.createMetadataView(ViewMetadataImpl.java:113)
位于com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:241)
位于com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
位于com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:121)
在com.sun.faces.lifecycle.LifecycleImpl.execute上(LifecycleImpl.java:198)
位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
位于org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:70)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
位于org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
位于org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
位于org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
位于org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
位于org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:744)
更新


我尝试了匹配表达式,以及切换测试位置。它仍然抛出一个javax.faces.view.facelets.faceleException:错误解析/index.xhtml

第一个if和第二个if在同一索引上永远不会匹配,并且由于(status.index+1),它最终会出现在

所以你最终会和

</div>
    <div class="col-sm-6 col-md-4">
        ...
    </div>
<div>
</div>
    <div class="col-sm-6 col-md-4">
        ...
    </div>
</div>

...
...

或者类似的东西,可以解释您所遇到的错误。

我切换到的解决方案使用双精度
</div>
    <div class="col-sm-6 col-md-4">
        ...
    </div>
<div>
</div>
    <div class="col-sm-6 col-md-4">
        ...
    </div>
</div>
<c:forEach var="i" begin="1" end="#{(groups.getGroupRows(true).size() / 4) +(1-((groups.getGroupRows(true).size() / 4) %1))%1}">
                    <div class="row">
                        <c:forEach var="x" begin="${((i - 1) * 4)}" end="${(((i - 1) * 4) + 3)}">
                            <c:if test="${(groups.getGroupRows(true).size() - 1) ge x}">
                                <div class="col-sm-4 col-md-3">
                                    <div class="thumbnail">
                                        <ui:repeat value="#{groups.getGroupRows(true).get(x).getObject('imageFiles').files}" var="image">  
                                            <h:link outcome="viewClassesInGroup" id="group_name">
                                                <f:param name="group_id" value="#{groups.getGroupRows(true).get(x).getInteger('group_id')}"/>
                                                <img src="#{image.imageAbsoluteUrl('large')}"/>
                                            </h:link>
                                        </ui:repeat>
                                        <div class="caption">
                                            <h3><h:link outcome="viewClassesInGroup" value="#{groups.getGroupRows(true).get(x).getString('group_name')}">
                                                    <f:param name="group_id" value="#{groups.getGroupRows(true).get(x).getInteger('group_id')}"/>
                                                </h:link></h3>
                                            <p><h:outputText value="#{groups.getGroupRows(true).get(x).getString('group_description')}"/></p>
                                            <p><h:link outcome="viewClassesInGroup" styleClass="btn btn-primary" p:role="button" value="View Group">
                                                    <f:param name="group_id" value="#{groups.getGroupRows(true).get(x).getInteger('group_id')}"/>
                                                </h:link>
                                            </p>
                                        </div>
                                    </div>
                                </div>
                            </c:if>
                        </c:forEach>
                    </div>
                </c:forEach>
<div class="container">
  <ui:repeat step="3" value="#{bean.list}" varStatus="outerLoopIndex">
      <div class="row">
          <ui:repeat offset="#{outerLoopIndex.index}" size="#{(outerLoopIndex.index + 3) gt bean.list.size() ? bean.list.size() : outerLoopIndex.index + 3}" 
          var="item" value="#{bean.list}" varStatus="innerLoopIndex">
           <div class="col-4">
            <label class="btn btn-secondary active">
                #{innerLoopIndex.index} #{item.foo}
            </label>
           </div>
          </ui:repeat>
      </div>
  </ui:repeat>
</div> <!-- container -->
<ui:repeat step="COLUMNSPERROW" var="permission" value="#{bean.list}" varStatus="outerLoopIndex">
      <div class="row">
          <ui:repeat offset="#{outerLoopIndex.index}" size="#{(outerLoopIndex.index + COLUMNSPERROW) gt bean.list.size() ? bean.list.size() : outerLoopIndex.index + COLUMNSPERROW}" 
          var="item" value="#{bean.list}" varStatus="innerLoopIndex">
           <div class="col">