This is my table:
<h:dataTable value="#{registerS.students}" var="registerS.student">
<h:column>
<f:facet name="header">Name</f:facet>
#{registerS.student.userName}
</h:column>
<h:column>
<f:facet name="header">Surname</f:facet>
#{registerS.student.userSurname}
</h:column>
<h:column>
<f:facet name="header">email</f:facet>
#{registerS.student.email}
</h:column>
<h:column>
<f:facet name="header">password</f:facet>
#{registerS.student.password}
</h:column>
<h:column>
<f:facet name="header">classCode</f:facet>
#{registerS.student.classCode}
</h:column>
</h:dataTable>
When opening a page with this page, I get this exception:
java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/sql/Result
javax.faces.component.UIData.getDataModel(UIData.java:1822)
javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:484)
javax.faces.component.UIData.setRowIndex(UIData.java:473)
com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:82)
javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:869)
javax.faces.component.UIData.encodeBegin(UIData.java:1133)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1854)
javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
How is this caused and how can I solve it?
JSF has a dependency on JSTL for several things. One of them is inspecting which DataModel
should be used behind <h:dataTable value>
. It also supports JSTL <sql:query var="result">
(which is discouraged since a decade, but that aside).
Apparently you're running a barebones servletcontainer instead of a real Java EE server. The stack trace hints that it's Tomcat. It ships only Servlets, JSP, EL and WS out the box. It doesn't ship all other Java EE stuff out the box such as JSF, JSTL, CDI, EJB, JPA, JTA, JMS, etc..etc.. You have to install it manually (or just move to a real Java EE server such as TomEE or WildFly).
You can find a link to the correct JSTL JAR and the correct Maven dependency in "Installing JSF" section of our JSF wiki page.