JaarMedlem sedan juli 2001434 inlägg
Sitter och funderar på detta med xml i combo med servlet/jsp
Är det många där ute som använder sig utav xml och xsl?
Min åsikt har varit att generera upp ett xml dokument från en funktion för att parsa upp det till en websida är lite tidsödande. Jag ser helt klart nyttan av att kunna återanvända funktionen för att skicka ut datan till något annat än en jsp sida, men såvida den informationen inte är önskvärd i ett första läge, är det då värt att offra den tid (om någon?) på att skapa och parsa xml-filer?
Min fråga är på sätt o vis hur mycket prestanda etc som går förlorad på att använda xml istället för att skapa objekt/bönor att arbeta med?
TomasJMedlem sedan feb. 200563 inlägg
Mitt svar nedan är huvudsakligen en kommentar till frågeställningen om det är värt att offra tid på att skapa och parsa xml-filer (eftersom jag inte har något välgrundat svar på hur många som egentligen använder XML/XSL, och jag har inte heller några prestandatester att redovisa...)
När det gäller utvecklingstiden så har man inte särskilt mycket att förlora om man använder Betwixt för då är det nämligen mycket enkelt att generera XML från en böna.
Här är ett exempel på en utility-metod som du skulle kunna använda för alla dina bönor:
import org.apache.commons.betwixt.io.BeanWriter;
// ....
public static Source getBeanAsXmlSource(Object object)
throws IOException, SAXException, IntrospectionException
{
Writer outputWriter = new StringWriter();
BeanWriter beanWriter = new BeanWriter(outputWriter);
beanWriter.enablePrettyPrint();
beanWriter.write(object);
beanWriter.close();
return new StreamSource(new StringReader(outputWriter.toString()));
}
Metoden ovan returnerar alltså en javax.xml.transform.Source som du kan använda på vanligt
sätt med JAXP-metoden javax.xml.transform.Transformer.transform
Om du skickar in en böna som input-parameter till metodexemplet ovan så kommer root-elementet bli lika
med klassnamnet för din böna. Om parametern istället är en Vector med dina
bönor så kommer "Vector" att bli root-element och din bönklass blir sub-element.
Om du skickar in en array, t.ex. MyBean[] så kommer "Array" att bli
root-element medan sub-elementen blir "MyBean".
Utvecklingstiden för att skapa XML från en böna kan alltså bli försumbar
om du använder Betwixt. Du måste dock förstås skapa dina XSLT-filer
men i gengäld så slipper du skapa JSP-sidor. Här beror det förstås på
hur bra man är på XSLT huruvida man förlorar utvecklingstid eller inte
om man använder XML/XSLT istället för JSP som anropar JavaBeans.
En sak som kan tyckas vara en nackdel med Betwixt är den hårda kopplingen
till klassnamn och metodnamn i din böna, d.v.s. om du ändrar namn
på en get-metod i din böna så kommer även det automatgenererade XML-elementets namn att
ändras och då måste du även ändra i din XSLT,
men å andra sidan så måste du ju även ändra i jsp-sidan om du döper
om en get-metod i bönan, så därför blir det egentligen ingen nackdel/skillnad.
Denna hårda koppling är helt enkelt priset man måste betala om man vill
ha automatisk mappning utan att behöva definiera mappnings-filer.
En nackdel är dock att reflektion/introspection förstås måste användas
för att Betwixt automatiskt ska kunna generera XML från ett på förhand okänt objekt.
Huruvida detta verkligen ger några signifikanta/observerbara prestanda-förluster
torde bl.a. bero på vilken hårdvara man har och hur stora och många bönor/XML som man vill transformera.
Om man inte vill använda Betwixt p.g.a. prestandaförlusterna med reflektion
men ändå inte vill skapa XML med manuell DOM-programmering, så kan man
använda JAXB och definiera klasser i XML-scheman som kan användas för att
generera klasserna inklusive kod som kan omvandla objekten till och från XML.
/ Tomas