Toon posts:

[Struts-Tiles] No getter method available for property X

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

momenteel ben ik bezig met het uitbreiden van een Struts applicatie. Er is hierbij besloten om Tiles in te zetten om zo de schermen op te bouwen. Dit is allemaal leuk en aardig, maar ik loop tegen een probleem aan... Als ik de schermen in verschillende onderdelen opdeel, en deze allen onderbreng in verschillende tiles, dan krijg ik een foutmelding;

[ServletException in:/tiles/scope.jsp] No getter method available for property worker.scope for bean under name org.apache.struts.taglib.html.BEAN'

De code van de Tile JSP ziet er als volgt uit:

Java Server Page:
1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" %>

<%@ taglib uri="struts-html.tld" prefix="html"%>
<%@ taglib uri="struts-bean.tld" prefix="bean"%>
<%@ taglib uri="struts-logic.tld" prefix="logic"%>

<%--<html:form action="/SelectWorker.do">--%> // = commentaarregel

<html:radio property="worker.scope" value="<%= ScopeConstants.ESTABLISHMENT %>" />

<%--</html:form>--%> // = commentaarregel


Ik heb hierbij ontdekt, dat de pagina wel werkt als ik het <html:form> gedeelte activeer, maar dan heb ik allemaal forms in mijn pagina die ik niet wil hebben. 8)7

Heeft iemand een idee hoe ik dit kan oplossen? Ik heb al wat geprobeerd met <bean:struts ... />, maar dit mocht ook niet baten. Voor zover ik heb begrepen, wordt het probleem dus veroorzaakt door het ontbreken van de <html:form> tag, die ervoor zorgt dat bepaalde waarden worden geinitialiseerd. Kan dit initialiseren op een andere manier plaatsvinden?

[ Voor 8% gewijzigd door Verwijderd op 10-06-2008 10:27 ]


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:42
Gezien de foutmelding lijkt het me gewoon dat de klasse "worker" geen methode bevat om het property "scope" op te kunnen halen :)

What do you mean I have no life? I am a gamer, I got millions!


Verwijderd

Topicstarter
Klopt inderdaad, er is nog een bean, genaamd FormBean, die opgeslagen is in de session, onder de sleutel "FormBean". De data moet daaruit worden opgehaald, met FormBean.getWorker().getScope();

Als je de <html:form..> tag weer aanzet, dan haalt struts via de action op welke bean hij moet gebruiken. (Volgens mij?) Nu is het onbekend, maar ik heb geen idee hoe ik moet aangeven dat hij de gegevens nu uit die bean moet ophalen :P

Ik heb dus wat geprobeerd met <bean:struts FormBean="FormBean" /> etc, maar dat hielp niet.

Edit: De verwijzing naar die bean is te vinden in struts-config.xml, maar die wordt nu niet gevonden binnen de tile, omdat ik dat <html:form action=..." /> gedeelte weg wil laten

[ Voor 15% gewijzigd door Verwijderd op 10-06-2008 10:39 ]


Verwijderd

Topicstarter
Nog even voor de duidelijkheid, de Tiles worden gebruikt om een scherm op te bouwen. De code van dit scherm is als volgt;

Java Server Page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
....
  <body id="bodyTag" onload="onOpen()" onunload="onClose();">
    <!-- START Formcontent  -->
    <!-- deze action wordt overschreven in de defaultTabForm_buttons.jsp onSaved() action -->
    <html:form action="empty" method="POST" >
    <!-- START TabControl -->
    <tiles:insert attribute="scope" beanScope="session" beanName="FormBean" name="FormBean" />
    <!-- END TabControl -->
    <!-- START TabControl -->
    <tiles:insert attribute="tabControl"/>
    <!-- END TabControl -->
    <!-- START Buttons -->
    <tiles:insert attribute="buttons" />
    <!-- END Buttons -->
    </html:form>
    <!-- END Formcontent  -->
  </body>
</html:html>


Het form wordt dus toegevoegd in de omvattende pagina, en het is niet de bedoeling dat er in elke tile opnieuw een form moet worden toegevoegd om de zaak aan de praat te krijgen :X

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Het kan zijn dat mijn Struts kennis behoorlijk verouderd is. het is al wel weer een paar jaar terug...

Formulier velden zullen altijd binnen een formtag moeten staan. Afhankelijk van de gebruikte actie achterhaald struts welke formbean hij eigenlijk moet gebruiken. Heb je geen form dan is er ook geen actie bekend en weet de applicatie dus ook niet met welke formbean je bezig bent.

Ik denk dat je je tiles gebruikt om een te 'laag' niveau. Volgens mij was het niet mogelijk om een form over meerdere tiles te kunnen uitsmeren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Oke, dan moeten we eens herzien hoe we Tiles kunnen inzetten. Opzich wel vreemd dat zoiets als dit niet wordt ondersteund, aangezien me dit typisch iets voor Tiles lijkt :?

Bedankt iig!! :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18-11 08:25

Janoz

Moderator Devschuur®

!litemod

Mwah. Tiles moet je eerder groter zien. Het hele form zou eerder een tile moeten zijn. Tiles kun je eerder vergelijken met wat je vroeger frames zou noemen. Gewoon een header tile, footer tile, menu tile enz enz.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Ik heb alsnog een oplossing gevonden (met hulp van een collega) _/-\o_

Om zonder de <html:form> te kunnen werken, moet je bij elk item een name attribuut opgeven, met daarin de naam van de bean, zodat alsnog bekend is uit welke bean de data moet worden opgehaald.

dus

Java Server Page:
1
<html:radio name="FormBean" property="worker.scope" value="<%= ScopeConstants.ESTABLISHMENT %>" /> 


in plaats van

Java Server Page:
1
<html:radio property="worker.scope" value="<%= ScopeConstants.ESTABLISHMENT %>" /> 
Pagina: 1