Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[JSF]dynamisch met includes werken

Pagina: 1
Acties:

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 27-04 11:59
Ik heb nog niet heel veel ervaring met JSF, maar loop nu tegen een in mijn ogen simpel probleem op waar ik maar geen oplossing voor vind:

Ik heb een soort template jsp pagina, vanwaaruit, afhankelijk van bepaalde instellingen, een aantal pages zouden (bij voorkeur compile-time, maar runtime moet ook wel lukken als ik me wat meer in facelets ga verdiepen) moeten worden geinclude.

De pagina die moet worden geinclude moet uit een backing bean komen. Ik krijg het echter niet voor elkaar om die geparsed te krijgen. De volgende situatie werkt wel:

Java:
1
<%@include file="/WEB-INF/component/content.jsp"  %>


maar deze constructies werken allemaal niet:

Java:
1
2
3
4
5
6
7
<%@include file="${includeBean.contentURL}"  %>
<jsp:include page="${includeBean.contentURL}" />
<c:import url="${includeBean.contentURL}" />
<jsp:include file="<%=includeBean.contentURL%>" />
<%@include file="#{includeBean.contentURL}"  %>
<jsp:include page="#{includeBean.contentURL}" />
<c:import url="#{includeBean.contentURL}" />


De meldingen die ik met deze pogingen krijg komen allemaal neer op het niet hebben geparsed van de EL.

de includeBean ziet er zo uit:

Java:
1
2
3
4
5
6
public class includeBean {
   
   String contentURL = "/WEB-INF/component/content.jsp";

   [..] //getters en setters weggelaten
}


---------------------------------
Ik vond al deze guide van BalusC, die eigenlijk precies beschrijft waar ik mee bezig ben, maar 'het niet doet'.

Java:
1
<jsp:include page="${includeBean.contentURL}" />

geeft
Java:
1
java.lang.IllegalArgumentException: Resource /${includeBean.includePage} not found


Ik maak gebruik van een OC4J server, Tenzij deze ergens iets geks doet wat ik gemist heb, gebruik ik een vers gedownloade sun reference implementatie van jsf 1.1 met jsp 2.0

Ik vind de stacktrace bij bovenstaande foutmelding wel wat vreemd; ik weet zo niet waar de com.evermind.* classes vandaan komen (onderdeel van OC4J?), maar ik vind hierop geen vergelijkbare problemen.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
java.lang.IllegalArgumentException: Resource /${includeBean.includePage} not found
    at com.evermind.server.http.EvermindPageContext.include(EvermindPageContext.java:443)
    at _minimalMap._jspService(_minimalMap.java:161)
    at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:59)
    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:462)
    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:594)
    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:518)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.ServletRequestDispatcher.unprivileged_forward(ServletRequestDispatcher.java:259)
    at com.evermind.server.http.ServletRequestDispatcher.access$100(ServletRequestDispatcher.java:51)
    at com.evermind.server.http.ServletRequestDispatcher$2.oc4jRun(ServletRequestDispatcher.java:193)
    at oracle.oc4j.security.OC4JSecurity.doPrivileged(OC4JSecurity.java:284)
    at com.evermind.server.http.ServletRequestDispatcher.forward(ServletRequestDispatcher.java:198)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:346)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:152)
    at oracle.adfinternal.view.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:157)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
    at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:64)
    at com.esri.adf.web.util.ADFFilter.doFilter(Unknown Source)
    at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15)
    at com.esri.adf.web.util.ADFSessionTimeoutFilter.doFilter(Unknown Source)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:621)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:221)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:122)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:111)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:234)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:29)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:879)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)
    at java.lang.Thread.run(Thread.java:595)


Ik heb nog lichte verdenkingen ten opzichte van de gebruikte implementatie, maar dat zou er niet voor moeten zorgen dat opeens de hele expression language niet meer werkt voor een include. Wie weet waar ik nog naar kan kijken?

Localhost is where the heart is


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik vond al deze guide van BalusC, die eigenlijk precies beschrijft waar ik mee bezig ben, maar 'het niet doet'.
Je moet het omvatten in een JSF tag waarin de gewenste bean wordt aangeroepen (en indirect wordt aangemaakt). Zoals die h:panelGroup in desbettreffend artikel doet. JSP maakt de managed beans niet automatisch voor jou aan zoals JSF doet. De allereerste ${bean} aanroep zou anders een lege bean opleveren. Dit staat ook in de tekst van het artikel uitgelegd.

[ Voor 112% gewijzigd door BalusC op 20-10-2008 18:23 ]


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 27-04 11:59
Heh, ik had al ergens naar je artikeltje gelinkt. JSF 1.2 kan een optie zijn, maar dat zou wat uitzoekwerk vergen wb de impact op de rest van het project. Aangezien ik niet de enige ontwikkelaar ben, is een overstap niet het eerste waar ik aan denk.

De oplossing in je blog kreeg ik niet aan het werk (zie ook hierboven). Omdat je er alsnog naar refereerde ben ik er nog eens heel goed doorheen gaan lezen. Ik geloof dat ik iets te snel over
You only have to keep in mind that this doesn't precreate the managed bean automatically when this line is called for the first time. So somewhere in the code before this line you should already have called the managed bean by JSF EL
heen heb gelezen.

Ik had in eerste instantie de controle met de JSF EL niet gebruikt, omdat ik eerst wou zien of die manier van includen uberhaupt werkte. Ik heb de toevoeging gemaakt:

Java:
1
2
3
4
            <h:outputText value="#{includeBean.contentURL}" />
            <h:panelGroup rendered="#{includeBean.contentURL} != null}">
                <jsp:include page="${includeBean.contentURL}" />
            </h:panelGroup>


Echter, deze code genereerd nog steeeds de volgende errorpage:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
An error occurred while processing your request.
Your session has been terminated.

--------------------------------------------------------------------------------

Root cause:
java.lang.IllegalArgumentException: Resource /${includeBean.contentURL} not found

Root cause details:
java.lang.IllegalArgumentException: Resource /${includeBean.contentURL} not found
    at com.evermind.server.http.EvermindPageContext.include(EvermindPageContext.java:443)
    at _minimalMap._jspService(_minimalMap.java:179)
    at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:59)
    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:462)
    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:594)
    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:518)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.ServletRequestDispatcher.unprivileged_forward(ServletRequestDispatcher.java:259)
    at com.evermind.server.http.ServletRequestDispatcher.access$100(ServletRequestDispatcher.java:51)
    at com.evermind.server.http.ServletRequestDispatcher$2.oc4jRun(ServletRequestDispatcher.java:193)
    at oracle.oc4j.security.OC4JSecurity.doPrivileged(OC4JSecurity.java:284)
    at com.evermind.server.http.ServletRequestDispatcher.forward(ServletRequestDispatcher.java:198)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:346)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:152)
    at oracle.adfinternal.view.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:157)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
    at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:64)
    at com.esri.adf.web.util.ADFFilter.doFilter(Unknown Source)
    at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15)
    at com.esri.adf.web.util.ADFSessionTimeoutFilter.doFilter(Unknown Source)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:621)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:221)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:122)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:111)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:234)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:29)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:879)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)
    at java.lang.Thread.run(Thread.java:595)



--------------------------------------------------------------------------------

Error Message:
java.lang.IllegalArgumentException: Resource /${includeBean.contentURL} not found

Error details:
java.lang.IllegalArgumentException: Resource /${includeBean.contentURL} not found
    at com.evermind.server.http.EvermindPageContext.include(EvermindPageContext.java:443)
    at _minimalMap._jspService(_minimalMap.java:179)
    at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:59)
    at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:462)
    at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:594)
    at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:518)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:713)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.ServletRequestDispatcher.unprivileged_forward(ServletRequestDispatcher.java:259)
    at com.evermind.server.http.ServletRequestDispatcher.access$100(ServletRequestDispatcher.java:51)
    at com.evermind.server.http.ServletRequestDispatcher$2.oc4jRun(ServletRequestDispatcher.java:193)
    at oracle.oc4j.security.OC4JSecurity.doPrivileged(OC4JSecurity.java:284)
    at com.evermind.server.http.ServletRequestDispatcher.forward(ServletRequestDispatcher.java:198)
    at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:346)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:152)
    at oracle.adfinternal.view.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:157)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:214)
    at com.evermind.server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:64)
    at com.esri.adf.web.util.ADFFilter.doFilter(Unknown Source)
    at com.evermind.server.http.EvermindFilterChain.doFilter(EvermindFilterChain.java:15)
    at com.esri.adf.web.util.ADFSessionTimeoutFilter.doFilter(Unknown Source)
    at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:621)
    at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    at com.evermind.server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:221)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:122)
    at com.evermind.server.http.HttpRequestHandler.run(HttpRequestHandler.java:111)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:234)
    at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:29)
    at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:879)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)
    at java.lang.Thread.run(Thread.java:595)


edit: Ik ga intussen maar naar huis, lange dag gehad en ik moet nog 1u30 rijden. Ik reageer hier vanavond later of morgenochtend weer. Alvast bedankt voor het meedenken!

Localhost is where the heart is


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Root cause:
java.lang.IllegalArgumentException: Resource /${includeBean.contentURL} not found
Oh OK, jouw EL wordt dus helemaal niet geparsed. Werkt EL in template text uberhaupt wel? Heb je JSTL weleens gebruikt op deze appserver? Hoe ziet de root declaratie van jouw web.xml eruit? Welke Servlet API versie ondersteunt jouw appserver maximaal?

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 27-04 11:59
JSF expression language (#) wordt 'gewoon' uitgevoerd. Van de JSP variant weet ik het niet zeker (hierbuiten niet nodig gehad). Ik kom morgen terug op de rest van je vragen.

Nu je het zo zegt, zou het best kunnen dat de (JSP) expression language ergens niet terugkomt waar dat wel moet. Ik weet dat tomcat de libs voor el in de eigen libdirectory heeft staan. Mogelijk mist er nog een jarretje of iets in die richting. Ik laat het je weten!

Localhost is where the heart is


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 27-04 11:59
EL wordt inderdaad niet geparsed
HTML:
1
<h:outputText value="${includeBean.contentURL}" />
geeft letterlijk de "${includeBean.contentURL}" terug.

De root declaratie van mijn web.xml is vrij antiek als ik het zo zie:
XML:
1
2
3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">

Dat lijkt me versie 2.3.

Het rucksichtlos (of hoe je dat ook maar spelt) aanpassen van de declaratie verandert niets aan het renderen van de EL:

XML:
1
2
3
4
5
<web-app 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="myId" version="2.5">


De door oc4j ondersteunde servlet api versie kon ik zo niet achterhalen. Waar vind je dit soort informatie normaal gesproken?

edit1: gevonden. Meteen nog even de bovenstaande declaratie met 2.4 geprobeerd, maar dat had geen effect.
JavaServer Pages (JSP) 2.0
Servlets 2.4
Java Server Faces 1.1
Enterprise JavaBeans (EJB) 3.0
Java Management Extensions (JMX) 1.2
JMX Remote Access API JSR-160
J2EE Management 1.0 (JSR-77)
J2EE Application Deployment 1.1 (JSR-88)
Java Transaction API (JTA) 1.0
Java Message Service (JMS) 1.1
Java Naming and Directory Interface 1.2
Java Mail 1.2
Java Database Connectivity (JDBC) 3.0
Java Authentication & Authorization Service 1.0
J2EE Connector Architecture 1.5
Enterprise Web Services 1.1 (JSR-921)
Web Services Metadata 1.0 (JSR-181)
Java API for XML-Based RPC (JAX-RPC) 1.1
SOAP with Attachments API for Java (SAAJ) 1.2
Java API for XML Processing (JAXP) 1.2
Java API for XML Registries (JAXR) 1.0.5
Java API for Rules Engines JSR-94
Common Annotations for the Java Platform JSR-250
---

Ik vond geen jarretje met 'el' in de naam, tussen de jars voor dit project of in de appserver zelf. Bij tomcat ben ik de el-api.jar gewend. Ik vond hier in het maven-repository een 'commons-el'. Is het raadzaam een van deze te kopieeren, of wordt oc4j verondersteld zijn eigen el parser aan boord te hebben?

edit3: op basis van andere posts heb ik het idee dat de el-api van sun hier toch standaard is. Deze is terug te vinden onder http://download.java.net/maven/1/javax.el/jars/, maar lijkt weinig te doen op zichzelf.

edit2: Ik heb nog met iemand anders gesproken over dit probleem en ik wil uiteindelijk eigenlijk helemaal af van de dynamische includes zoals hierboven. Ik ga nu aan het werk met het template systeem van facelets.

edit4: Ik kreeg in combinatie van de el-api (zie hierboven) en de web.xml root op 2.4, op allemaal eerder goed werkende pagina's (waarin EL werd gebruikt(!) ) "Expression Language not supported in compile time attribute value"

[ Voor 42% gewijzigd door SilentStorm op 21-10-2008 16:34 ]

Localhost is where the heart is

Pagina: 1