Archief - JSF: XHTML wil niet parsen.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Enira

Legacy Member
Waarschijnlijk doe ik iets verkeerd maar mijn tweede xhtml pagina wil niet 'parsen'. Alle code die ik geschreven heb staat pal in de pagina zoals bijvoorbeeld de <h:form> tag, terwijl deze juist wel wordt geparsed in de index.xhtml pagina.

Moet ik hier iets extra voor instellen (in de web.xml)?

Ik gebruik netBeans en GlassFish. Dit is de eerste keer dat ik in een lange tijd terug JSF vastneem (drie jaar geleden was gebruikte ik Tomcat met IntelliJ).

Just me

Legacy Member
Je moet ervoor zorgen dat de JSF wordt opgestart. De simpelste manier om dit te doen is in u web.xml:
Code:
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

Dan zet je in u index.jsp:
Code:
<jsp:forward page="login.jsf"/>

Op die manier ga je vanaf dan altijd JSF kunnen gebruiken.

Enira

Legacy Member
Just me zei:
Je moet ervoor zorgen dat de JSF wordt opgestart. De simpelste manier om dit te doen is in u web.xml:
Code:
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

Dan zet je in u index.jsp:
Code:
<jsp:forward page="login.jsf"/>

Op die manier ga je vanaf dan altijd JSF kunnen gebruiken.

Dankje deze heeft het inderdaad gedaan :) Weet je soms hoe ik de directe toegang tot*.xhtml bestanden kan stoppen?

Zo ziet mijn huidige web.xml eruit.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>AppletServiceServlet</servlet-name>
        <servlet-class>be.fedict.eid.applet.service.AppletServiceServlet</servlet-class>
        <init-param>
            <param-name>IncludeAddress</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>IncludePhoto</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>IncludeCertificates</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>PhotoServlet</servlet-name>
        <servlet-class>be.fedict.eid.applet.service.PhotoServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AppletServiceServlet</servlet-name>
        <url-pattern>/applet-service</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>PhotoServlet</servlet-name>
        <url-pattern>/photo.jpg</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

Parnakra

Legacy Member
Bestanden in de WEB-INF map kunnen normaal niet rechtstreeks aangeroepen worden.

Just me

Legacy Member
Inderdaad, alles wat in webapp staat kan wel rechtstreeks aangeproken worden (denk ik).
Volgens mij ligt het aan de manier waarop je (vanuit u servlets?) naar de volgende pagina doorstuurt met een requestdispatcher of redirect.

Wolf2000me

Legacy Member
Jspx en xhtml worden waarschijnlijk door een andere filter gemapt (en dus een andere servlet die geen JSF parset). Welke JSF implementatie(s) gebruik je?

Wanneer ik xhtml gebruik met JSF is het altijd met Facelets. Zoek daar eens configuratie voor op. Mogelijk ga je dan ook nog een tag library moeten gebruiken. Mijn ervaring (2 jaar geleden) leert mij wel dat meerdere extensies, dus bv. jspx en xhtml gaan gebruiken een world of pain is qua config.

Maar als je enkel xhtml wil gebruiken dien je gewoon:

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

in je web.xml in te stellen.

Enira

Legacy Member
Wolf2000me zei:
Maar als je enkel xhtml wil gebruiken dien je gewoon:

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

in je web.xml in te stellen.
Zo ga ik het nu uitvoeren dit voldoet aan wat ik verwachtte dankje :)


Bon soit, ik ben tot de conclusie gekomen dat de dingen die ik wil doen best wel enorm lastig zijn voor de kleine kennis die ik over het onderwerp bezit. Ik bezit kleine kennis over bepaalde delen maar daartussen is nog een gapend gat van kennis die ik niet beheers.

Heeft er hier iemand goede en grondige tutorials over Facelets? Maar dan ook echt heel grondige, want aan tutorial die eindigt met een hello worldje heb ik niks :)

Ik heb voorlopig al even wat opgezocht om enkele dingen te doen die ik wil doen, maar vooral op het AJAX stuk hink ik enorm hard achter.

Zo wil ik een deel van mijn pagina verversen wanneer ik op een knop druk maar ik slaag hier blijkbaar niet in.

Voorbeeldje: in mijn bean is een boolean genaamd 'scan' en als ik op een knop druk dan zet die de scan boolean op true in mijn bean en zou ie een stuk code op de pagina moeten verversen.


Code:
<h:commandLink action="#{registerBean.toggle}" value="Scan">
  <f:ajax render="scan"/>
</h:commandLink>

         
<h:outputText id="scan">
  <c:choose>
    <c:when test="${registerBean.scan == true}">
      <script>...</script>
      <c:set target="${registerBean}" property="scan" value="false"/>
    </c:when>
  </c:choose>
</h:outputText>

Ohjah als iemand enkele grafische ontwikkel tools heeft, dan is dit ook handig meegenomen. (Liefst compatibel met RichFaces)

Wolf2000me

Legacy Member
Eerst en vooral kan je in het vervolg beter een uitgebreidere beschrijving geven van je boolean pagina refresh probleem.
Op het eerste zicht zie ik nergens een submit die de lifecycle in gang zet. Mogelijk is je boolean enz wel gemanipuleerd maar is er nooit een response gerenderd, dus ververst je pagina niet. Mijn ervaring met RichFaces zelf is voorlopig wel uitermate beperkt.
Zijn er exceptions? Is er iets dat je ziet gebeuren in de server output? Wat doe je zelf als testuser en wat is het resultaat daarvan? Gebruik je Netbeans als server debugger?
Ik zou trouwens echt niet weten waarom je van IntelliJ naar Netbeans bent gegaan, maar dit geheel terzijde. IntelliJ is echt fantastisch, zeker de Ultimate edition, al is de Community edition ook heel goed. Deze laatste heeft nu wel geen Facelets parsing.


Nu, met een hello-world tutorial ben je al een heel eind eigenlijk, zeker omdat JSF met nu eenmaal veel configuratie vereist. Probeer eerst en vooral te begrijpen wat er juist gebeurt bij gebruik van JSF om tot de gerenderde "hello world" te komen. Ik heb het dan vooral over de alom beruchte "JSF lifecycle". Eens je een beter idee hebt van wat dat allemaal is en doet achter de schermen zal je de boel al een pak beter begrijpen.
Verder is basis HTML kennis ook wel best nuttig voor post en submit operaties, en de ingestelde scope (bv. session, etc).

In elk geval denk ik dat je teveel ineens probeert in gang te krijgen. RichFaces is allemaal mooi, maar zorgt voor meer variabelen die fout kunnen gaan. Daarkom kan het wel nuttig zijn van eerst tijdelijk een kleine feature op je pagina met basis JSF te doen werken. In dit geval dus een gewone commandbutton met submit operatie. Wanneer dat werkt, en je weet waarom, dan kan je dat altijd gemakkelijk uitbreiden.

En zorg ook dat je je lokale server kan debuggen en makkelijk naar kan deployen. Zo is het heel nuttig om bv. op je "toggle" en "scan" getters en setters van je backing bean een breakpoint te zwieren. Je zal dan al weten of je bean in gang wordt gezet etz.

Als tool om de presentatie te inspecteren gebruik ik Firebug als addon in Firefox.

Het is uiteraard ook mogelijk dat ik hier voor jou niks nieuw vertel, maar toch :)

Enira

Legacy Member
Wolf2000me zei:
Eerst en vooral kan je in het vervolg beter een uitgebreidere beschrijving geven van je boolean pagina refresh probleem.
Op het eerste zicht zie ik nergens een submit die de lifecycle in gang zet. Mogelijk is je boolean enz wel gemanipuleerd maar is er nooit een response gerenderd, dus ververst je pagina niet.
Weljah op dat gebied zijn er soms gapende gaten in mijn kennis. Ik vind meestal vrij praktische tutorials: doe dit, doe dat, klik daarna op dat.

Ff korte beschrijving: Ik wil een script laten draaien wanneer de gebruiker op een knop drukt. Moet ik dan mijn scriptje in de backing bean stoppen en zo via een submit (Iets wat ik gezien had in de tutorial) ophalen, of moet mijn script in de presentatie logica aanwezig zijn?

Wolf2000me zei:
Gebruik je Netbeans als server debugger?
Soms draai ik em in debugging mode :p

Wolf2000me zei:
Ik zou trouwens echt niet weten waarom je van IntelliJ naar Netbeans bent gegaan, maar dit geheel terzijde. IntelliJ is echt fantastisch, zeker de Ultimate edition, al is de Community edition ook heel goed.
Vroeger gebruikte ik ook altijd IntelliJ, super prachtig programma maar aangezien de basis tutorials allemaal met netBeans waren ben ik dus tijdelijk overgestapt. :p

Wolf2000me zei:
Nu, met een hello-world tutorial ben je al een heel eind eigenlijk, zeker omdat JSF met nu eenmaal veel configuratie vereist. Probeer eerst en vooral te begrijpen wat er juist gebeurt bij gebruik van JSF om tot de gerenderde "hello world" te komen. Ik heb het dan vooral over de alom beruchte "JSF lifecycle". Eens je een beter idee hebt van wat dat allemaal is en doet achter de schermen zal je de boel al een pak beter begrijpen.
Verder is basis HTML kennis ook wel best nuttig voor post en submit operaties, en de ingestelde scope (bv. session, etc).
Met de beans en servlets ervaar ik zeer weinig problemen. Bij wijze van spreken: vanaf dat het bestandje niet meer .java als extensie heeft stuit ik op problemen.

Wolf2000me zei:
In elk geval denk ik dat je teveel ineens probeert in gang te krijgen. RichFaces is allemaal mooi, maar zorgt voor meer variabelen die fout kunnen gaan. Daarkom kan het wel nuttig zijn van eerst tijdelijk een kleine feature op je pagina met basis JSF te doen werken. In dit geval dus een gewone commandbutton met submit operatie. Wanneer dat werkt, en je weet waarom, dan kan je dat altijd gemakkelijk uitbreiden.
RichFaces heb ik al enorm hard naar achter geduwd in tijd maar het leek me handig om te vragen of iemand een design tool had :p

Inderdaad ik heb wel de neiging om enorm veel te doen ineens. Misschien komt dit omdat de code behind een vrij simpel werkje is.

Bon daarjuist een deftige(???) gevonden deze eens volgen: http://netbeans.org/kb/docs/web/hibernate-webapp.html

Wolf2000me

Legacy Member
Enira zei:
Weljah op dat gebied zijn er soms gapende gaten in mijn kennis. Ik vind meestal vrij praktische tutorials: doe dit, doe dat, klik daarna op dat.

Ff korte beschrijving: Ik wil een script laten draaien wanneer de gebruiker op een knop drukt. Moet ik dan mijn scriptje in de backing bean stoppen en zo via een submit (Iets wat ik gezien had in de tutorial) ophalen, of moet mijn script in de presentatie logica aanwezig zijn?

Scripting in de backing bean? Dat zou de eerste keer zijn dat ik dat zie, ik zou het dus niet aanraden. Functionaliteit in de backing bean is natuurlijk absoluut normaal :)

Je kan gemakkelijk scripting aan componenten toevoegen, daar is in de JSF tags een identifier voor. Zie de JSF reference daarvoor, maar onsubmit enz. is allemaal mogelijk. In elk geval is een submit nodig om data naar de backing bean te steken, AFAIK.

Dus voor de goede verstaander. Je duwt nu op de knop en er gebeurt niks? Ook in debug mode merk je geen activiteit op de backingbean?


Enira zei:
Vroeger gebruikte ik ook altijd IntelliJ, super prachtig programma maar aangezien de basis tutorials allemaal met netBeans waren ben ik dus tijdelijk overgestapt. :p

Starten en stoppen van servers kan je perfect met IntelliJ, deployen ook, enz. Zo'n tuturials kan je redelijk makkelijk porten naar je eigen favoriete IDE zenne, en je steekt er wat van op. Al geef ik toe dat Netbeans en Glassfish wel een toffe combinatie is, het gebruik ervan vind ik veel te niche. In development heb ik nog altijd het liefst een Tomcat of JBoss.

Enira

Legacy Member
Ik ben een maandje verder en het lukt me allemaal al vrij goed. Ik ben er in geslaagd om alle individuele pagina's aan te maken.

Maar nu zoek ik nog een manier om ervoor te zorgen dat ik kan navigeren naar verschillende pagina's met AJAX. (Zonder dat er refreshes van de hele pagina gebeuren). Mijn pagina bevat een template met header, footer en zijpanelen. Enkel de middelste pagina moet kunnen wijzigen (dmv AJAX).

Vroeger was deed ik dit met een <c:choose> (geen AJAX mogelijk mee), nu ben ik alles in paneltjes aan het stoppen en met de rendered tag aan het werken. Voorbeeldje: rendered="#{navigationBean.currentPage.equals('register')}

Echter ik heb enorm hard de indruk dat dit niet de beste manier is. De performantie van mijn GlassFish server is gekelderd en vraagt regelmatige herstarts. Wisselen tussen standaard run en debug mode zit er al helemaal niet meer in.

Iemand enig idee onder welke termen of voorbeeldjes ik deze feature zou kunnen vinden?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan