Servlets & JSP

B

Pues vereis, estoy creando una especie de twitter, donde los usuarios se pueden registrar, logear, acceder a su perfil, publicar tweets, ver quien les sigue, los tweets de quien siguen, sus tweets... etc. El problema viene cuando quiero eliminar un tweet que tiene escrito en su perfil.

Aqui el código de un trozo de mi JSP.

<FORM action = "Controlmain">
	<BR><textarea name = "tw" rows = "2" cols = "60"></textarea> 
		<BR><INPUT type = "SUBMIT" NAME = "submittw" VALUE = "Tweet"></INPUT>
	<BR><div id="leftcolumn"></div>
	<div id="leftcolumn2">
		<% viewtweet[] tw = new viewtweet[10];
		tw = (viewtweet[])session.getAttribute("tw");%>
		<%int i = 0;
		while(tw[i] != null){%>
		Usuari: <%=tw[i].getUsuari()%><BR>
	<div id = "marge">
		<%=tw[i].getContingut()%>
<FORM ACTION = "Controlmain">
<INPUT type = "SUBMIT" NAME = "eliminar" VALUE = "Eliminar tweet"></INPUT>

//trozo que no funciona
<textarea name="delete" style="visibility:hidden"  rows="2" cols="2" value ="<%=tw[i].getiDtweets()%>"></textarea>
//

</FORM>
	</div>
		<%++i;%><BR><BR><BR>
		<%}%></div>
</FORM>

-En la primera linea, defino un textarea donde se escribe el tweet que quiere publicar el usuario.
-Creo un vector de "viewtweets", que es una clase que contiene la id del tweet, usuario que lo publico, datatime, contenido del tweet...
-Con este vector lo que hago es tener almacenados 10 tweets(vector creado y rellenado en el servlet a partir de mi base de datos que envio con el setattribute al jsp) y publicarlos en el perfil.

El problema viene dado cuando quiero enviar tw.getIdtweets() a mi servlet controlmain. Este parametro el idtweets del tweet que quiero eliminar en este instante.
Creo que es un error de sintaxis o de no usar algo mas concreto para que el servlet me pille bien este parametro.

Alguien tiene alguna idea para solucionar el problema?

B

Lo solucioné con un:

<input type="text"  style="visibility:hidden" name="userName" value = "<%=tw[i].getIdtweets()%>"/>
JuAn4k4

Un textarea no tiene value

<textarea>value</textarea>

si el input es hidden se pone: <input type="hidden" ..../>

Y ahora te comento fallos que veo:

viewtweet[] tw = new viewtweet[10];
tw = (viewtweet[])session.getAttribute("tw");

Primero creas un nuevo objeto, y luego a tw le asignas otro objeto. -> Sobraría el new ...

int i = 0;
while(tw[i] != null

Esto es peligroso, lo normal es hacer :

if (tw != null) {
for (int i =0; i< tw.length; i++) {

}
}

o usar foreach si puedes usarlo (jdk5)

if (tw != null) {
for (viewtweet t :  tw) {

 t.getUsuari();
}
}

Recomendaciones:

Usar jstl, y dejar los valores en el request.setAttribute() y no en sesión. (A no ser que REALMENTE quieras guardarlos en sesión). Esto mejora mucho la lectura del jsp, a parte de que los scriptlets para hacer whiles/fors no se usan.

<c:forEach var="tweet" values="userTweets">


</c:forEach>

Si quieres hacer una app, preparala apra multi-idioma.

Si vas a seguir usando scriptlets ( <% %> ), intenta poner las variables arriba, para poder leer tu JSP decentemente y rápido).

Para eliminar un tweet, lo razonable sería poner un "link" y no un formulario por post, al menos así lo haría yo ( a no ser que quieras que el usuario pueda seleccionar cuales si y cuales no hay que eliminar ).

Tienes un form dentro de otro, ojo que Mozilla y Explorer se comportan al reves en estos aspectos. No tengas más de un formulario.

Mira como quedaría tu JSP siguiendo las recomendaciones (El scriptlet de arriba no existiria claro..., pero te lo pongo porque he puesto comentarios que te servirán también) :

<%
    request.setAttribute("userTweets", session.getAttribute("tw")); // Ahi debería estar, en tu servlet controlador en lugar de ponerlo
    // en Session, deberías ponerlo en el request.setAttribute("tw",tweets);
    // USA NOMBRES DE VARIABLES MÁS INTUITIVAS !!!
    
// Ojo ! Los getters de los atributos deben estar bien... // getiDtweets no está bien , debería ser: // getIdTweet(); si es que significa que es el atributo Id del Tweet. %> <form action="tweet.add.do" method="post"> <BR><textarea name = "tw" rows = "2" cols = "60">Type here your tweet !</textarea>
<BR><INPUT type = "submit" NAME = "submittw" VALUE = "Tweet"/>
</form> <BR><div id="leftcolumn"></div> <div id="leftcolumn2">
<c:forEach var="tweet" values="${userTweets}"> User: <c:out value="${tweet.usuari}"/> <div id="marge"> <c:out value="${tweet.contingut}"/> </div> <a href="tweet.delete.do?tweet=${tweet.idTweet}" titlte="Delete this tweet">Delete</a> </c:forEach>
B

Muchas gracias por tu ayuda. La verdad, soy un poco guarro programando, vease nombres de variables confusas etc... Gracias por lo de los forms tambien. Intentaré adaptar el codigo que me has puesto a mi jsp!

Tengo una pequeña duda:
Al postear un tweet, si luego pulso F5, se me vuelve a postear el mismo tweet(y eso que no tengo nada en el textarea de cuando posteo). Alguna solucion para que al pulsar F5 me cargue lo que hay y no me postee el ultimo tweet que hice? Gracias!

1 respuesta
9 días después
B

Me he quedado un poco atascado en una parte concreta de mi "twitter". Resulta que en el buscador puedo buscar usuarios y que me los muestre y poder seleccionar a los que quiero seguir o quiero dejar de seguir.
Para conseguir eso hago una consulta:

String cerca = request.getParameter("phrase"); //aqui guardo lo que han escrito en el search
ResultSet rs = dao.executarSQL("select usuari from reg where usuari like'" + cerca +"%';");

Con esto guardo en un ResultSet, todos los usuarios que sus nicks empiezen por el valor puesto anteriormente en el search.

El problema viene al querer declarar este ResultSet en el jsp que controla la vista de este servlet, como puedo declararlo? No me deja y no entiendo porque...

pdj

Tienes la clase importada en el jsp?

B

No tenía la clase importada, lo solucioné importándola pero luego decidir hacer las cosas de otra manera. Gracias de todos modos ;)

JuAn4k4

Respondiendote a #4 Valida el formulario en el Servlet, si el texto es el mismo que sale por defecto o está vacío, lo cancelas.

Tendras que darle a F5 + reenviar.

2 meses después
O

.

7 días después
O

Quisiera que me ayudes con tu aplicación, ya que estoy en un proyecto de conexión de nuestra plataforma a la red social de twitter.. Si puedes avisame algo a mi correo.. Además quisiera charlar contigo internamente.. si puedes agregame, que te comento que tu proyecto de twitter, será remunerado (recibirás dinero) para aplicarlo en nuestra red social empresarial..

[email protected]
[email protected]

Usuarios habituales