COMPARTIR UN BEAN CON UN SERVLET

malone
13 de Septiembre del 2005
Saludos.
Alguien me podria indicar como puedo compartir un bean generado desde un JSP y accesar desde un servlet.

Gracias

kapper
13 de Septiembre del 2005
perdon... pero podrias ser un poco mas claro?
a que referis con un "bean generado desde un JSP"? y con "accesar desde un servlet"?? explayate un poco mas a ver si logramos entender lo que te esta sucediendo....
saludos!

malone
13 de Septiembre del 2005
Tienes razon,

1. Tengo una pagina jsp que despliega un catalogo de articulos, en esta pagina solicito cantidad y agrego un boton para agregar a un "CARRITO"

2. una vez que dieron click al boton agregar direcionno a la pagina2.jsp , que de manera general realiza lo siguiente:
por medio de bean agrega los articulos selecionados, despliega los articulos y les agraga un boton para poder eliminarlos, ademas despliega tres botones mas
1 cancelar todos los articulos
2 regresar a la pagina del catalogo
3 confirmas el pedido

Ahora, el BEAN se encuentra dentro de un paquete dentro de lib, y lo que hace de manera general es agregar elementos y eliminar dentro de un vector, y hasta aqui no hay ningun problema todo lo hace bien este es el codigo.

<%@page import="java.util.*, ShopCart.*" session='true' %>

<html>
<head><title>Articulos Seleccionados</title></head>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<body>
<H2 style="color: #6666FF">Articulos Selecionados</H2>
<BR>
<BR>
<%-- <jsp:useBean id="beanInstanceName" scope="session" class="package.class" /> --%>
<%-- <jsp:getProperty name="beanInstanceName" property="propertyName" /> --%>

<jsp:useBean id="myCart" scope="session" class="ShopCart.Cart" />

<%
String myOperation = request.getParameter("operation");
session.setAttribute("myLineItems", myCart.getLineItems());

if (myOperation.equals("Add")) {
CartLineItem lineItem = new CartLineItem();
lineItem.setId(request.getParameter("cdId"));
lineItem.setCdtitle(request.getParameter("cdTitle"));
lineItem.setPrice(request.getParameter("cdPrice"));
myCart.lineItems.addElement(lineItem);
}
if (myOperation.equals("Delete")) {
String s = request.getParameter("cdId");
System.out.println(s);
int idVal = Integer.parseInt(s);
myCart.removeLineItem(idVal);
}
if (((Vector)session.getAttribute("myLineItems")).size() == 0) {
%>
<jsp:forward page="EmptyCart.jsp" />
<%
}
%>

<TABLE border='0' cellspacing='3' cellpadding='0'>
<TR>
<TH bgcolor="#D3DCE3">CLAVE</TH>
<TH bgcolor="#D3DCE3">DESCRIPCION</TH>
<TH bgcolor="#D3DCE3">C.SOLICITADA</TH>
</TR>

<c:forEach var="item" items="${myLineItems}">
<TR>
<TD bgcolor="#EEEEEE"><c:out value="${item.id}"/></TD>
<TD bgcolor="#EEEEEE"><c:out value="${item.cdtitle}"/></TD>
<TD bgcolor="#EEEEEE"><c:out value="${item.price}"/></TD>
<TD bgcolor="#EEEEEE">
<form method=get action="ShopCart.jsp">
<input type=hidden name=cdId value="<c:out value="${item.id}"/>">
<input type=hidden name=cdTitle value="<c:out value="${item.cdtitle}"/>">
<input type=hidden name=cdPrice value="<c:out value="${item.price}"/>">
<input type=HIDDEN name='operation' value='Delete'>
<INPUT type=IMAGE src='/images/Delete.GIF'>

</form>
</TD>
</TR>
</c:forEach>
</TABLE>
<p>
<form method=get action="ProductList.jsp">
<input type=submit value="Lista Articulos">
</form>

<form method=gett action="Oka.jsp"
<input type=submit value="ok">
</form>


<form method=get action="CancelOrder.jsp">
<input type=submit value="Cancela Requisicion">
</form>
</p>

</body>
</html>

El problema que quiero solucionar es que cuando den click en el boton ok en vez de accesar a la pagina Oka.jsp se accese a un servelet donde pueda guardar en un tabla los articulos eleccionados, el problema es como leo la informacion o como le hago para accesar a los datos que se encuentran en el BEAN...?

Alguna idea....?

kapper
13 de Septiembre del 2005
A modo de comentario, no es muy distinto el codigo java que tenes en un jsp(*) del que puedas tener en un servlet. Simplemente porque un jsp ES un servlet. Digamos un "servlet amigable" :-)
Bien, en el jsp dice <jsp:useBean id="myCart" scope="session" class="ShopCart.Cart" />
Esto significa que estas creando una instancia de la clase "ShopCart.Cart" (esto es paquete.clase), llamado "myCart" y que se va a guardar en la session.
(para que esto funcione, el bean debe tener un constructor publico sin argunmentos).
Lo que tenes que hacer es exactamente lo mismo que en el jsp, pero una diferencia: en lugar de usar la taglib, tenes que usar codigo java.
Traducido, seria algo asi como poner
Cart myCart = new Cart();

El resto esta claro, el vector lo estan guardando en la session. Se llama myLineItems. Todo eso queda igual.

Resumiendo, podes hacer copy-paste del codigo java del jsp al servlet, solamente "traduciendo"
<jsp:useBean id="myCart" scope="session" class="ShopCart.Cart" />
y
<jsp:forward page="EmptyCart.jsp" />
y los imports... y creo que nada mas.

Al final, agregale un response.sendRedirect para que te devuelva el flujo a algun jsp.

AH! recorda de apuntar el "action" del "<form>" al servlet.

Cualquier duda, chifla.
Saludos!





(*) Aclaracion: lo ideal es que NO EXISTA codigo java (scriptlets) en un jsp. ya que ensucia mucho el codigo html y lo vuelve ilegible e inmantenible.
Desde ya que es totalmente inaceptable tener logica de negocio en un jsp.

malone
13 de Septiembre del 2005
Gracias por tomarte la molestian de contestar.

Por lor que me explicas es que debo implementar el bean desde un servlet, y desde ahi hacer el manejo de "Add" y Delete de elementos, y los resultado dirigirlo hacia las .jsp...?

Si es asi me podrias indicar donde declaro en el servlet
Cart myCart = new Cart(); la pregunta es porque pueden existir varios usuarios al mismo tiempo pero con carros diferente contenido.
Echame una mano indicando de manera general como quedaria mi servlet.

GRACIAS...

kapper
13 de Septiembre del 2005
- tu servlet va que quedar practicamente al jsp, pero sin el codigo html.
- implementar no es la palabra. lo que vas a hacer es instanciar al bean desde el servlet y enviarle mensajes (llamar a sus metodos) ejemplo, add, delete, find y lo que tengas en el bean).
- Cart myCart = new Cart();
es lo mismo que
<jsp:useBean id="myCart" scope="session" class="ShopCart.Cart" />
- con respecto a los multiples usuarios: el hecho de que el vector este siendo persistido temporalmente en la session, te resuelve el problema. o sea, ya esta. la session es por usuario conectado. y cada serlvet conoce tu contexto y maneja su session. esto es gratis. gracias a las maravillas de java :-P

si necesitas un template de servlet (si nunca los usaste no tenes que saber como son....), pedilo.

saludos.-

Manuel
13 de Septiembre del 2005
No seas malito enviame todo el codigo que tienes sobre el carito de compras y si podria estar especificado mejor en que parte debo poner el codigo si en el jsp,en un servlt etc etc.
Por Favor gracias