Codice completo

Il controller definisce il flusso di operazioni da eseguire

package it.html.ejb.entity.bmp.controller;

import it.html.ejb.entity.bmp.AccountPK;
import it.html.ejb.entity.bmp.BankAccount;
import it.html.ejb.entity.bmp.BankAccountHome;
import it.html.ejb.entity.bmp.BankAccountLocal;
import it.html.ejb.entity.bmp.BankAccountLocalHome;

import java.io.IOException;
import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Controller extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

  Context ctx;
  BankAccountLocalHome bah;
  
  //Inizializzazione della factory, utilizzata durante l'intera vita della servlet
  public void init(){
  
    //Le proprietà del context saranno le medesime del contesto in cui si troverà questa servlet (e quindi l'ejb)
    try {
      ctx=new InitialContext();
      bah=(BankAccountLocalHome) ctx.lookup("BankAccountLocal");
    } catch (NamingException e) {
      e.printStackTrace();
    }
  }

  //Il metodo funge da dispatcher, sulla base del parametro op
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String op=request.getParameter("op");
    if (op.equalsIgnoreCase("create"))
      createAccount(request,response);
    if (op.equalsIgnoreCase("find"))
      findAccount(request,response);
    if (op.equalsIgnoreCase("deposito"))
      doDeposito(request,response);
    if (op.equalsIgnoreCase("prelievo"))
      doPrelievo(request,response);    
  }

  //Il metodo effettua l'operazione di creazione di un conto corrente @throws IOException
  private void createAccount(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    //Recupero dei parametri per l'inizializzazione del conto
    String id=request.getParameter("id");
    String nome=request.getParameter("nome");
    
    //Creazione del conto corrente
    try {
      bah.create(id, nome);
      //Segnalazione di operazione riuscita
      response.getOutputStream().println("Account "+id+" creato!");
    } catch (Exception e) {
      /*
       * Segnaliamo all'utente la presenza di un'eccezione generica:
       * sarebbe bene dettagliare la tipologia di errore (id ripetuto, valori
       * nulli, ...)
       */

      response.getOutputStream().println("Errore nella creazione dell'account ("+id+","+nome+")");
    }
    
  }

  //Il metodo effettua l'operazione di prelievo
  private void doPrelievo(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //Recupero il parametro che identifica il conto
    String id=request.getParameter("id");
    String amount=request.getParameter("amount");
    
    //Recupero il bean associato a tale chiave
    try {
      BankAccountLocal ba = bah.findByPrimaryKey(new AccountPK(id));
      //Operazione di prelievo
      double amt=Double.parseDouble(amount);
      ba.prelievo(amt);
      
      //Operazione riuscita
      response.getOutputStream().println("Prelievo di "+amt+" giunto a buon fine.");
    } catch (Exception e) {
      response.getOutputStream().println("Nessun conto associato all'id!");
    }
    
  }

  //Il metodo effettua l'operazione di deposito
  private void doDeposito(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    //Recupero il parametro che identifica il conto
    String id=request.getParameter("id");
    String amount=request.getParameter("amount");
    
    //Recupero il bean associato a tale chiave
    try {
      BankAccountLocal ba = bah.findByPrimaryKey(new AccountPK(id));
      
      //Operazione di prelievo
      double amt=Double.parseDouble(amount);
      ba.deposito(amt);
      
      //Operazione riuscita
      response.getOutputStream().println("Prelievo di "+amt+" giunto a buon fine.");
    } catch (Exception e) {
      response.getOutputStream().println("Nessun conto associato all'id!");
    }
  }

  //Il metodo cerca l'account ed inoltra il controllo alla vista di visualizzazione
  private void findAccount(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //Recupero l'id
    String id=request.getParameter("id");
    
    try {
      BankAccountLocal ba = bah.findByPrimaryKey(new AccountPK(id));
      
      //Inoltro il conto corrente alla JSP, che si occuperà di visualizzarlo
      RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/home.jsp");
      request.setAttribute("account",ba);
      rd.forward(request,response);
    } catch (Exception e) {
      response.getOutputStream().println("Nessun conto associato all'id!");
    }
  }

}