Para construir los componentes del proyecto SV001585:
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"); . . . }
<!--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> <% }
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(); } } } }
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(); } } }
Copyright IBM Corporation 1992, 2003. All Rights Reserved.