Aplicación del caso práctico de tienda al por menor de iSeries


Crear la página Web, los servlets y los archivos JSP

Para construir los componentes del proyecto SV001585:

  1. Cree un proyecto Web.
  2. Con Page Designer, escriba una página shop.html que contenga un enlace que invoca un servlet GetItems.
  3. Importe el archivo jt400.jar para las clases de iSeries Toolbox para Java a la carpeta lib del proyecto Web. Este archivo jar está en x:\wdsc\wssd\plugins\com.ibm.etools.iseries.toolbox\runtime, siendo x el directorio en el que ha instalado Development Studio Client.
    Nota:
    Consulte los archivos GetItems.java y ViewItems.jsp del proyecto SV001585 para ver los componentes JDBC y SQL principales relacionados con iSeries Toolbox para Java, para el servlet y el archivo JSP. En la vista Navegador de la perspectiva Web, para acceder a GetItems.java, expanda SV001585 > source, y para acceder a ViewItems.jsp, expanda SV001585 > webApplication.
    .
  4. Escriba un servlet GetItems que utilice los componentes JDBC y SQL de iSeries Toolbox para Java para recuperar los artículos de ropa de la base de datos INVENTORY de iSeries y que:
    1. Coloque en la sesión el bean ResultSet que contiene el resultado de la consulta SQL
    2. Redirija la petición al archivo ViewItems.jsp

    Ejemplo de código para GetItems.jsp:

    public void init() {
    			.
    			.
    			.
    			// Cargar el controlador JDBC de IBM Toolbox para Java.
    			DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
    			// Observe que hemos recuperado el nombre de as400, el ID de usuario y la contraseña 
    			// a partir del archivo web.xml mediante un analizador xml.
    			as400conn =
    				DriverManager.getConnection(
    					"jdbc:as400://" + as400 + ";naming=sql;errors=full",
    					userid,
    					password);
     
    			dmd = as400conn.getMetaData();
    			.
    			.
    			.
    }
     
    public void service(HttpServletRequest request, HttpServletResponse response){
    			.
    			.
    			.
    			Statement select =
    				as400conn.createStatement(
    					ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY);
    			ResultSet rs =
    				select.executeQuery(
    					"SELECT PRODNO, PRODNAME, RPRICE, IMAGE FROM "
    						+ retailLibrary
    						+ dmd.getCatalogSeparator()
    						+ inventoryFile);
     
    			HttpSession session = request.getSession(true);
    			session.setAttribute("resultset", rs);
     
    			response.sendRedirect("/ViewItems.jsp");
     
    			.
    			.
    			.
    }
     
    
  5. Escriba un archivo JSP ViewItems que recupere los artículos de ropa a partir del bean ResultSet obtenido en el paso anterior, para visualizar dichos artículos en formato de tabla. El archivo JSP también debe incluir, para cada artículo, un formulario que permita seleccionar la talla y la cantidad y luego añadir el artículo a la cesta de la compra. Para escribir el archivo JSP, puede utilizar Page Designer en las herramientas de desarrollo Web para iSeries. Concretamente, puede dibujar la página en la vista Diseño, y añadir el correspondiente código en la vista Fuente. Ejemplo de código para ViewItems.jsp:
    <!--Obtener el objeto ResultSet a partir de la sesión--><%
       int columnCount = 0;
       ResultSet rs = (ResultSet)session.getAttribute("resultset");
       if(rs !=null)
    %>   
    <%
      {
      rs.beforeFirst();
                ResultSetMetaData rsmd = rs.getMetaData ();
                columnCount = rsmd.getColumnCount ();
                
    %>
    <TABLE border="1">
    <TBODY>
    <TR>
    		<TD>ID de producto</TD>
    		<TD>Nombre</TD>
    		<TD width="551">Precio</TD>
    		<TD colspan="2"></TD>
    </TR>
    <%while (rs.next ()){
    <TR>
    <!--Crear un formulario para esta fila (o este artículo)-->
    <FORM name="myform" action="/SV001585/AddtoBasket" onsubmit="return errorChecking(this);">
     
    <!--Obtener los datos de cada columna a partir de esta fila del objeto ResultSet-->	
    <!--Procesar datos es un método definido por usuario para modificar los datos para
    visualizar, si es necesario-->	
          	   <%	
                    for (int i = 1; i <= columnCount; ++i){         
                        String value = rs.getString(i);	            
                        if (rs.wasNull ())
                            value = "<null>"; 
                        else{
                        	if(i==1)
                        		prodID=value;	
                        	value = processData(i,value);
                        	
                    	  }	    
    			  %>
    				<TD><%=value%></TD>
    				  <%            
                    } 
    			%>
     
    <!--Crear un campo de entrada para la cantidad y un menú desplegable para la talla-->
    <!--Observe que estamos utilizando el ID del producto como nombre del campo-->		
             <TD width="290">Cantidad 
    			<INPUT size="5" type="text" name='<%=prodID+"Q"%>' ><BR>
    					Talla <SELECT name='<%=prodID+"S"%>'>
    							<OPTION value="s" selected>Pequeña</OPTION>
    							<OPTION value="m" selected>Mediana</OPTION>
    							<OPTION value="l" selected>Grande</OPTION>
    							<OPTION value="XL" selected>Muy grande</OPTION>
    							<OPTION value="XXL" selected>Super grande</OPTION>
    							</SELECT>
    </TD>
    <TD><INPUT type="image"   name="submit"  src="images/Add_to_basket.gif"></TD>
    </FORM>
    </TR>
    <%
    }
    %>
    </TBODY>
    </TABLE>
    <%
    }
    
  6. Importe el archivo iseriesut.jar de las herramientas de desarrollo Java para iSeries a la carpeta lib para su proyecto Web. Este archivo JAR está en x:\wdsc\wssd\plugins\com.ibm.etools.iseries.toolbox\runtime, siendo x el directorio en el que ha instalado el producto. Consulte los archivos AddtoBasket.java y ViewBasket.jsp del proyecto SV001585 para ver la implementación. En la vista Navegador de la perspectiva Web, para acceder a AddtoBasket.java, expanda SV001585 > source, y para acceder a ViewBasket.jsp, expanda SV001585 > webApplication.
  7. Utilice el bean RecordIOManager de las herramientas de desarrollo Java para iSeries para escribir un servlet AddtoBasket al que debe llamar el botón Añadir a la cesta y que actualiza la base de datos INVENTORY de iSeries restando la cantidad solicitada por el cliente y añadiendo los artículos a un bean Java que representa la cesta de la compra en la sesión. Ejemplo de código de AddtoBasket.jsp:
    public class AddtoBasket extends HttpServlet {
     
    	//Clase interna de AddtoBasket
    	public class MyRecordIOManager extends RecordIOManager {
    		.
    		.
    		.
    		public MyRecordIOManager(
    					String hostInfo1,
    					String hostInfo2,
    					String hostInfo3,
    					String file,
    					String lib)throws Exception{
    			super(hostInfo1, hostInfo2,hostInfo3,file,lib);	
    			setFileAccessType(RecordIOManager.FILEACCESS_KEYED);
    			setCommitLockLevel(RecordIOManager.COMMITLOCKLEVEL_ALL);
    			//el diario tiene el mismo nombre que el archivo de base de datos
    			setJournal(file);
    			//el diario está en la misma biblioteca que el archivo de base de datos
    			setJournalLibrary(lib);		
    		}	
    		.
    		.
    		.	
    		public synchronized String updateDBFile(
    			String id,
    			String size,
    			String quantity
    			) {
    			.
    			.
    			.
    			//Abrir el archivo
    			try {
    				if (openFile()) {
    					record = readRecord(key);
    					quantityAvailable = ((BigDecimal) 			
    						record.getValueAt(0,sizeColumn)).intValue();
    					totalQuantityAvailable = ((BigDecimal) 
    						record.getValueAt(0, 8)).intValue();
    					if (quantityRequested <= quantityAvailable) {
    						newQuantity = 
    						   new BigDecimal(quantityAvailable - quantityRequested);
    						totalNewQuantity = 
    						   new BigDecimal
    							(totalQuantityAvailable - quantityRequested);
    						record.setValueAt(newQuantity, 0, sizeColumn);
    						record.setValueAt(totalNewQuantity, 0, 8);
    						// Observe que actualizamos el registro, pero no comprometemos
    						// si el cliente decide
    						// vaciar la cesta, en cuyo caso
    						// llamamos al método rollBack para restrotraer
    						updateRecord(record);
    						status = success;
    					} else {
    						status = notEnough;
    					}
    				} else
    					status = accessError;
    			} catch (Exception e) {
    				e.printStackTrace();
    				status = accessError;
    			}
     
    			//Cerrar el archivo y añadir 
    			try {
    				closeFile();
    			} catch (Exception e) {
    				//En caso de error, retrotraer (rollback)
    				try {
    					rollback();
    				} catch (Exception e1) {
    					e1.printStackTrace();
    				}
    				status = accessError;
    			}
     
    			return status;
    		}
    	}
     
    	//Método init del servlet AddtoBasket
    	public void init() {
    		hostInfo = GetItems.getHostInfo();
    		
    	}
    	
    	public void doGet(HttpServletRequest req, HttpServletResponse res) {
    		.
    		.
    		.
    		Basket basket = (Basket) session.getAttribute("basket");
    		MyRecordIOManager recIO = 
    		(MyRecordIOManager) session.getAttribute("recIO");
    		if (basket == null) {
    			basket = new Basket();
    			session.setAttribute("basket", basket);
    		}
     
    		if(recIO == null){
    			if (recIO == null) {
    			try {
    				recIO =
    					new MyRecordIOManager(
    						hostInfo[0],
    						hostInfo[1],
    						hostInfo[2],
    						GetItems.getInventoryFile(),
    						GetItems.getRetailLibrary());
    			} catch (Exception e) {
    				try {
    					res.sendRedirect("errorPage.html");
    					return;
    				} catch (Exception e1) {
    					e1.printStackTrace();
    				}
    			}
    		}	
    		id = req.getParameter("id");
    		size = req.getParameter(id + "S");
    		quantity = req.getParameter(id + "Q");
    		
    		status = recIO.updateDBFile(id, size, quantity);
    		session.setAttribute("recIO", recIO);
    			
    		if (status.equals("SUCCESS")) {
    			basket.addItem(id, quantity, size);
    			try {
    				res.sendRedirect("ViewBasket.jsp");
    				return;
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		} else {
    			if (status.equals("NOT_ENOUGH")) {
    				try {
    					res.sendRedirect("insufficient.html");
    					return;
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			} else
    				if (status.equals("ACCESS_ERROR")) {
    					try {
    						res.sendRedirect("errorPage.html");
    						return;
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    				}
     
    		}
     
    	}
     
    
  8. Escriba un archivo JSP ViewBasket que visualice el contenido de la cesta de la compra.
  9. Escriba un formulario customerinfo.html para entrar la información de pago, con un botón Continuar que invoque el archivo ViewForConfirm.jsp.
  10. Escriba un archivo ViewForConfirm.jsp que muestre el contenido de toda la cesta más el saldo total. Puede desarrollar el archivo ViewForConfirm.jsp de la misma manera que el archivo ViewBasket.jsp, con la adición de un gasto de envío calculado y de un botón Confirmar que coloque un pedido en la base de datos ORDERS de iSeries.
  11. Utilice el asistente de llamada a programa de iSeries, de las herramientas de desarrollo Java para iSeries, para crear un bean PLACEORD.java que acceda al programa de servicio PLACEODR de la biblioteca RETAILSTOR. El asistente crea beans que se utilizarán en las aplicaciones Java o en el asistente Servicios Web para acceder al programa ILE de iSeries.
    1. Para abrir el asistente, pulse SV001585 con el botón derecho del ratón en la vista Navegador y seleccione Nuevo > Otros.
    2. En la ventana Nuevo, pulse iSeries > Java > Bean de llamada a programa.
    3. En el asistente de llamada a programa, entrará información sobre el programa ILE de iSeries, como el nombre de programa, la biblioteca, el tipo de programa y los parámetros de entrada y de salida.
    4. En la última ventana del asistente, tendrá la opción de crear un bean para una aplicación Java, para un servicio Web o para ambos. En este proyecto, tan solo tiene que crear un bean para una aplicación Java.
    Nota:
    El programa de servicio PLACEODR toma una matriz de estructuras y coloca cada elemento en un registro de una base de datos ORDERS, generando un número de pedido como salida para cada matriz.
  12. Escriba un servlet PlaceOrder, invocado por el botón Confirmar del archivo ViewForConfirm.jsp.

    El siguiente segmento de código muestra cómo utiliza el servlet PlaceOrder el bean PLACEORD:

    .
    	.
    	.
    	public void init() throws ServletException {
    		hostInfo = GetItems.getHostInfo();
    		super.init();
     
    		try {
    			/* Crear una instancia del bean PLACEORD creado 
    			   por el asistente del bean de llamada a programa de iSeries */
    			orderBean = new PLACEORD();
    			orderBean.setConnectionData(hostInfo[0], 
    			hostInfo[1], hostInfo[2]);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	.
    	.
    	.
     
    	public void doPost(HttpServletRequest request, 
    	HttpServletResponse response) {
     
    		...
     
    		PLACEORD.Orditems_Struct inputStruct = null;
     
    		// Recuperar los artículos del pedido a partir de la cesta
    		Basket basket = 
    		(Basket) request.getSession().getAttribute("basket");
    		AddtoBasket.MyRecordIOManager recIO = 
    		(AddtoBasket.MyRecordIOManager) 		
    		  request.getSession().getAttribute("recIO");
    		if (basket == null || basket.size() == 0 
    		|| recIO == null) {
    			try {
    				response.sendRedirect("errorPage.html");
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		} else {
    			items = basket.elements();
    			// Establecer la matriz de elementos de tipo estructura
    			while (items.hasMoreElements()) {
    				item = (String[]) items.nextElement();
    				inputStruct = orderBean.getOrdItemAr(j);
    				inputStruct.setItemNo(new BigDecimal(item[0]));
    				inputStruct.setQuantity(new BigDecimal(item[1]));
    				inputStruct.setSizeOrd(item[2]);
    				j = j + 1;
    			}
    			// Establecer el resto de los elementos de la matriz en valores ficticios
    			for (int i = j - 1; i < 100; i++) {
    				inputStruct = orderBean.getOrdItemAr(i);
    				inputStruct.setItemNo(new BigDecimal(0));
    				inputStruct.setQuantity(new BigDecimal(0));
    				inputStruct.setSizeOrd("s");
    			}
    			
    			// Establecer los otros dos parámetros de entrada del bean
    			orderBean.setNumOfItems(new BigDecimal(j));
    			orderBean.setBalance((BigDecimal) 
    			request.getSession().getAttribute("balance"));
    			try {
    				// Invocar el programa iSeries
    				orderBean.invoke();
    				
    				// Recuperar el número de pedido a partir del bean PLACEORD
    				orderNumber = (orderBean.getRetCode()).toString();
    				request.getSession().setAttribute("orderNumber", 
    				orderNumber);
    				basket.empty();
    				// Comprometer este pedido ahora 
    				recIO.commit();
    				response.sendRedirect("orderNumber.jsp");
    				return;
    			} catch (Exception e) {
    				response.sendRedirect("errorPage.html");
    				e.printStackTrace();
    			}
     
    		}
    	} 
     
    
  13. Escriba un servlet OrderNumber que recupere el número del pedido y lo visualice para el cliente, junto con un mensaje de confirmación. En cambio, asegúrese de que se devuelve una página de error si el cliente no ha añadido ningún artículo a su cesta de la compra.


[ Principio de página | Página anterior | Página siguiente | Contenido ]