View Full Version : [servlet] out.println di contenuti dinamici?
non funziona una cosa (fatta a naso) del tipo (all interno di una servlet):
out.println("<jsp:include page=\"pagina.jsp\"/>");
nel senso che non si visualizza nulla nella pagina (nel sorgente html della pagina caricata pero ottengo <jsp:include page="pagina.jsp"/> che non include la pagina);
la domanda è: come si puo ottenere un effetto simile? chiedo perche ho necessita di includere delle jsp in un div (tramite ajax) ma per il momento riesco solo a inserire codice html (testo, immagini,...)
voglio poter fare in modo che ajax infili dentro il div target semplicemente un include di delle jsp opportune che visualizzeranno cio che devono visualizzare...come si fa? tnx...
si, la soluzione delle palle ce l ho: prendo un file (una jsp per esempio), lo leggo per righe, lo metto in una stringa....poi nella servlet out.println(stringaDelFile); ....cosi posso metterci dentro qualsiasi cosa, ok...ma va da se che non avrei il coraggio di presentarmi davanti a chi mi ha chiesto di fare il progetto (con che faccia potrei spiegare una cagata simile?)
deve esistere un modo intelligente per ottenere cio che mi interessa...right?
rettifico, non va neanche la soluzione delle palle: se devo inserire jsp in cui vi sia, per esempio, codice javascript, non funziona (probabilmente non prende gli elementi in modo giusto, non so)...eppure ci deve essere un modo, ho googlato il mondo e non trovo una ceppa........
Ti va bene un forward?
http://www.java-tips.org/java-ee-tips/javaserver-pages/how-to-forward-requests-from-servlet-t.html
la forward forwarda a una pagina...stavo usando ajax proprio perche non voglio che la pagina cambi (voglio refreshare solo un div nel quale si visualizzino dei contenuti qualsiasi)...altrimenti avrei fatto mille jsp diverse tutte con la stessa struttura e cambiando solo il pezzo che mi interessava (non posso credere che esista solo un metodo cosi orribile)
out.println nelle servlet nn si usa + gia da deceni ...
e poi ( se ho ben capito ) tu leggi una jsp e la metti nella servlet ? beh non serve perche una jsp compilata E una servlet .
non ho capito perche non usi le jsp ... cmq se vuoi aggiornare il div con ajav il tag <jsp:include nn servira a nulla ... xche quando entra in scena ajax il tag ormai e compilato ...
creati una servlet che la tua funzione ajax chiamera , poi dentro (la servlet) ci metti qualcosa del genere
response.setContentType("application/xml");
response.getWriter().write( qui ci metti il documento xml che visualizerai poi nella pagina ( come stringa ) );
response.getWriter().close();
response.flushBuffer();
è esattamente quello che faccio (ma non con xml, non saprei come maneggiarli)...ho capito empiricamente che scrivere write di una stringa tipo "<jsp:include bla bla..." non funzionerebbe...non risolvo comunque il problema; posso includere cio che voglio, anche un xml, ma a me serve includere una jsp (che a sua volta fara le cose che deve fare)...l alternativa è che io sbagli totalmente approccio al problema (che è possibilissimo giacche non ho esperienza e non vado matto per il web)
se cosi fosse, accetterei suggerimenti per fare la cosa seguente: voglio avere un unica jsp, con un div che cambi (un po di contenuti diversi); per esempio visualizzi il risultato di dati succhiati da un db (non so, una tabella con i dati e alcune operazioni possibili da fare su questi dati)...voglio che la pagina principale cambi possibilmente MAI (cioe niente sbattoni di mille jsp diverse e mille forward nella servlet)...finche si tratta di visualizzare solo dati (in pratica formattare una stringa e inserirla nel div) è una stupidaggine, ma vorrei che il contenuto infilato dentro questo fantomatico div sia dinamico (possa contenere form o gettare property da un bean)...chiedo troppo?
dimenticavo:
response.getWriter().write( qui ci metti il documento xml che visualizerai poi nella pagina ( come stringa ) );
ok che ho una jsp sta roba non va....ma con una qualsiasi cosa: come si fa per farlo decentemente? cioe, un file xml deve essere messo sotto forma di stringa per fare una cosa simile....e cio fa decisamente ribrezzo (quello che ho detto nel 2 post)?
ma io non ho detto di mettere quella roba nella jsp ...
tu devi avere una jsp e una servlet ... nella jsp ci metti il codice di "pagina iniziale" ... qualcosa tipo
<%@ page contentType="text/html;charset=windows-1252"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
<title>Amministrazione</title>
<script>
function loadContent(key){
document.getElementById('content').innerHTML = someAjaxFunction("Servlet1?contenutoDaCarricare="+key);
}
</script>
</head>
<body>
<div id="content">
</div>
<input type="button" onclick="loadContent('content1.txt');"/><br />
<input type="button" onclick="loadContent('content2.txt');"/><br />
<input type="button" onclick="loadContent('content3.txt');"/><br />
</body>
</html>
poi una servlet che in base al valore della variabile contenutoDaCarricare ti carica un file diverso ....
public class Servlet1 extends HttpServlet {
private static final String CONTENT_TYPE = "text/xml;";
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String file = request.getParameter("contenutoDaCarricare");
// InputStream stream = this.getServletContext().getResourceAsStream(file);
// leggi il file in qualche modo
response.setContentType(CONTENT_TYPE);
response.getWriter().write("contenuto del file letto");
response.getWriter().close();
response.flushBuffer();
}
}
poi naturalmente una funzione javascript(ajax) che ti carrica la url che ti gli passi come parametro ...
function Ajax(URL){
this.getXMLInstance = function() {
var XHR = null,
browserUtente = navigator.userAgent.toUpperCase();
if(typeof(XMLHttpRequest) === "function" || typeof(XMLHttpRequest) === "object"){
XHR = new XMLHttpRequest();
}else if(window.ActiveXObject && browserUtente.indexOf("MSIE 4") < 0) {
if(browserUtente.indexOf("MSIE 5") < 0)
XHR = new ActiveXObject("Msxml2.XMLHTTP");
else
XHR = new ActiveXObject("Microsoft.XMLHTTP");
}
return XHR;
}
this.getMsg = function (){
var ajax = this.getXMLInstance();
var _response = "";
ajax.open("POST" , URL , false);
ajax.setRequestHeader("text/xml" , "application/x-www-form-urlencoded");
// ajax.send(queryString);
if(ajax.status == 200){
_response = ajax.responseText;
}
return _response;
}
}
function someAjaxFunction(url){
var ajax = new Ajax(url);
return ajax.getMsg();
}
nn so se la funzione js funziona , ( ma dovrebbe rendere l'idea ... )
evidentemente non mi sono spiegato bene....faccio esattamente in quel modo, è dall' inizio che lo dico....e ho aggiunto che se il file che gli passo contiene roba tipo [...]<jsp:qualcosa ..../> [...] non funziona (e ora ho tranquillamente capito il perche)...io pero voglio ottenere esattamente quell effetto....cioe non mi interessa dargli in pasto un file con solo codice html (a quel punto ci scrivo hello world a mano)...voglio inserire nel div qualcosa che a sua volta peschi da un bean e mi restituisca le belle stringhette che vengano interpretate e visualizzate in maniera corretta. è decisamente da escludere che acceda al db, faccia le query, formatti i dati e li mandi indietro nel responsetext tutto nella servlet (sarebbe proprio una porcheria), in quel modo dei bean che uso me ne farei poco (mentre li devo usare)...
un problema piu marginale ma che da una googlata rapida non ho evinto è: io ho il mio grazioso bottone che chiama la f ajax che va al controller che rimanda il testo che va a finire nel mio magico div....se clicco quel bottone x volte nel div vanno a finire x copie del contenuto...deve esistere un trick per far si che cio sia evitabile, ma non lo conosco (o almeno sembra che non ci sia flush che tenga)
ho capito anche cosa volevi dire con:
beh non serve perche una jsp compilata E una servlet
pensala in questi termini: in quel famigerato div voglio far apparire una cosa tipo:
<jsp:usebean bla bla......>
<jsp:getproperty bla bla....>
e cio facendo, dentro la servlet, write(direttamente quel codice || un file che lo contiene) non si puo fare....then?
tolto che mi sono gia aggiustato (ho abbandonato l idea di ajax per tornare a fare mille crappy jsp e la servlet che forwarda a quella opportuna...sto ajax stava gia diventando troppo sbattone per una scemenza di progetto che devo fare), mi rimane la curiosita di rendere quello di cui ho parlato sopra con ajax :)
io pero voglio ottenere esattamente quell effetto....cioe non mi interessa dargli in pasto un file con solo codice html (a quel punto ci scrivo hello world a mano)...voglio inserire nel div qualcosa che a sua volta peschi da un bean e mi restituisca le belle stringhette che vengano interpretate e visualizzate in maniera corretta. è decisamente da escludere che acceda al db, faccia le query, formatti i dati e li mandi indietro nel responsetext tutto nella servlet (sarebbe proprio una porcheria), in quel modo dei bean che uso me ne farei poco (mentre li devo usare)...
allora se vuoi farlo con ajax non puoi usare codice lato server nei file che includi dinamicamente nella pagina ( e ovvio che devi riaggiornare la pagina x compilarla ) , una alternativa sarebbe di creare dei file xsl con dentro il contenuto del div , poi invece di usare i tag <jsp: usi i tag <xsl: ( i valori delle variabili li prendera da un file xml ( puoi serializzare il tuo bean in formato xml con java.beans.XMLEncoder ) oppure puoi settare le variabili da passare al file xsl direttamente nella servlet ...
InputStream xsl = null;
InputStream xml = null;
PrintWriter out = response.getWriter();
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try{
transformer = tFactory.newTransformer(new StreamSource(xsl));
// setta un parametro da passare al file xsl
transformer.setParameter("xd" , bean.getXd());
transformer.transform(new StreamSource(xml) , new StreamResult(out));
out.close();
response.flushBuffer();
} catch (TransformerConfigurationException e) {
// TODO
} catch (TransformerException e) {
// TODO
}
non e il migliore dei modi ... ma e semplice
un problema piu marginale ma che da una googlata rapida non ho evinto è: io ho il mio grazioso bottone che chiama la f ajax che va al controller che rimanda il testo che va a finire nel mio magico div....se clicco quel bottone x volte nel div vanno a finire x copie del contenuto...deve esistere un trick per far si che cio sia evitabile, ma non lo conosco (o almeno sembra che non ci sia flush che tenga)
se tu fai magicoDiv.innerHTML = testo; il contenuto del div viene sovrascritto , ( mi sa che tu fai magicoDiv.appendChild )
provero a fare come dici (era probabilmente quello che mi serviva, ma mi devo skillare un attimo con xml) tnx!
eppure faccio innerHtml, non appendchild :(
dacci n occhiata a questa guida xsl (http://xml.html.it/guide/leggi/60/guida-xslt/) e anche a questa guida xml (http://xml.html.it/guide/leggi/58/guida-xml-di-base/)
eppure faccio innerHtml, non appendchild :(
xche nn posti un pezzo di codice cosi magari si riesce a capire meglio il problema ...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.