Problemi di connessione LocalHost con SQLSERVER EXPRESS 2005

Completata l’installazione di SQLSERVER 2005, procediamo alla registrazione del nostro server sul client STUDIO 2005 per poter navigare all’interno dei vari database. Normalmente il nostro server locale viene identificato con una denominazione simile:

<Nome macchina>\SQLEXPRESS.

Potremmo avere l’esigenza di dover registrare il nostro server con la classica denominazione LOCALHOST, questo potrebbe creare dei problemi come ad esempio la segnalazione di errore che troviamo di seguito:

Cosa fare?

In realtà l’operazione è semplice: e necessario abilitare la connessione al DB tramite protocollo TCP IP definendo correttamente la porta da utilizzare. Per fare questo dobbiamo:

1) Attivare tramite il Configuration Manager il protocollo TCP/IP come nell’immagine:

3) Nella sezione IPALL aggiungere sulla porta TCP il valore di default che si intende usare, ad esempio 1433. Tale valore verrà poi utilizzato per tutte le connessioni verso il DB locale.

A questo punto sarà possibile accedere al DB locale tramite la registrazione LOCALHOST.

Alla prossima

Controlli dinamici di validazione form con Symfony

Molto probabilmente, durante l’implementazione e l’utilizzo di classi form con , vi sarà capitato di dover eseguire alcuni controlli di validazione solamente in presenza di certe condizioni. Ad esempio controllare la presenza obbligatoria di un provincia solo se la nazione impostata precedentemente è Italia.

Questo potrebbe essere un problema visto che normalmente i controlli di validazione vengono implementati nelle estensioni delle classi form. Tuttavia è possibile aggiungere i controlli nella action richiamata dal submit del form considerato.

Facciamo un esempio:

Supponiamo di avere una classe form per la gestione degli utenti che implementa il campo nazione e il campo provincia:

'nazione' => new sfWidgetFormPropelSelect(array('model' => 'Countries',
   'key_method' => 'getIdCountry',
   'method' => 'getDescrizione',
   'add_empty' => true,
   'order_by' => array('Descrizione', 'ASC'))),

'provincia' => new sfWidgetFormPropelSelect(array('model' => 'Province',
   'method' => 'getProvincia',
   'add_empty' => true,
   'order_by' => array('Provincia', 'ASC'))),

'nazione' => new sfValidatorString(array('required' => true), array('required' =>
   __('Nazione obbligatoria', null, 'messagesutenti'))),

'provincia' => new sfValidatorString(array('required' => false), array()),

Come potete notare il campo “provincia” è settato come non obbligatorio, questo perchè in alcune situazioni, effettivamente, non deve essere impostato, come nel caso di nazione diversa da Italia.
Il controllo verrà aggiunto dinamicamente in un secondo momento.

Supponiamo di avere una action denominata “SalvaUtente” definita nel modulo “utenti” che viene richiamata dalla submit del form che renderizza i due campi descritti precedentemente. La action potrebbe essere implementata come segue:

private function SalvaUtente(sfWebRequest $request, sfForm $form) {
   $form->bind($request->getParameter($form->getName()));
   $datiForm = $request->getParameter($form->getName());

   if ($datiForm['nazione'] != '' && $datiForm['nazione'] == def::NAZIONE_ITALIA_CODE)
      $form->setValidator('provincia', new sfValidatorString(array('required' => true),
                array('required' => 'Provincia obbligatoria')));

   if ($form->isValid()) {
      //continua ...

Nel momento in cui il campo nazione  è valorizzato ed impostato su Italia, viene aggiunto il controllo di obbligatorietà sul campo provincia. Grazie a questa soluzione risulta facile impostare a piacimento qualsiasi tipo di controllo di validazione il framework metta a disposizione.

Alla prossima

Servlet per Download File

Probabilmente vi sarà capitato di dover creare all’interno di un pagina web un link ad un file non residente fra le cartelle gestite dal Web Server.
Tale file, in una situazione del genere, non risulta accessibile tramite un semplice href ma lo diventa tramite l’utilizzo di una semplice :

Di seguito il codice della

/**
 *  implementation class OpenFile
 */
public class OpenMyFile extends HttpServlet {
  private static final long serialVersionUID = 1L;
  private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
  public final static Logger logger =
      Logger.getLogger("info.synaptica.ifaber..OpenMyFile");

  public OpenMyFile() {
    super();
  }

Definizione del metodo doGet:

inizialmente vengono letti i parametri passati tramite URL “fname” e “sid”.
Il parametro fname descrive il path completo e il nome del file da scaricare, il sid contiene l’identificativo
della sessione in corso, la sua funziona è quella di stabilire l’autorizzazione all’utilizzo da parte del client chiamante.

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
                   throws ServletException, IOException
    {
       try
       {
	    String requestedFile = request.getParameter("fname");
	        if (requestedFile == null)
	        	throw new Exception("Specificare nome file");

	        String sid = request.getSession().getId();
	        if (sid.equals(request.getParameter("sid")) == false) {
	        	throw new Exception("Non autorizzato all'utilizzo della ");
	        }

Impostazione della response con la definizione dell’internet media type.

               File file = new File(URLDecoder.decode(requestedFile, "UTF-8"));
	        logger.info("File richiesto: " + URLDecoder.decode(requestedFile, "UTF-8"));

	        if ( (file.isDirectory())||(!(file.exists()))) {
        	  throw new Exception("Il file richiesto non è stato trovato nell'archivio");
	        }

	        String contentType = getServletContext().getMimeType(file.getName());

	        if (contentType == null) {
	          contentType = "application/octet-stream";
	        }

	        response.reset();
	        response.setBufferSize(DEFAULT_BUFFER_SIZE);
	        response.setContentType(contentType);
	        response.setContentLength((int) file.length());
	        response.setHeader("Content-Disposition", "attachment; filename=\"" +
                        file.getName() + "\"");

Apertura ed esecuzione dello streaming del file

               // Prepare streams.
	        BufferedInputStream input = null;
	        BufferedOutputStream output = null;

	        try {
	            // Open streams.
	            FileInputStream fi = new FileInputStream(file);

	            input = new BufferedInputStream(fi, DEFAULT_BUFFER_SIZE);
	            output = new BufferedOutputStream(response.getOutputStream(),
                        DEFAULT_BUFFER_SIZE);

	            // Write file contents to response.
	            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
	            int length;
	            while ((length = input.read(buffer)) > 0) {
	                output.write(buffer, 0, length);
	            }
	        } finally {
	            // Gently close streams.
	            close(output);
	            close(input);
	        }
        } catch (Exception E) {
          response.getWriter().write("Rilevato problema durante la richiesta del file: " +
          E.getMessage());
        }
    }

Metodo per la chiusura del buffer di lettura e di scrittura dati

      private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
                e.printStackTrace();
            }
        }
    }

}

Ricordiamoci di registrare la creata nel file web.xml solitamente posizionato nella cartella
/WebContent/WebInf del progetto.
La registrazione consiste nell’aggiungere all’xml le seguenti righe:

    Open File
    OpenMyFile
    OpenMyFile
    "classe di riferimento della "

    OpenMyFile
    /OpenMyFile