package docen_servlet01;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

/*************************************************************************
 * 1. EJEMPLO DE SERVLET QUE MANEJA OBJETOS DE LAS CLASES ServletContext y
 *    HttpServletRequest, ademas muestra parámetros y atributos de inicio.
 * 2. Gestiona método GET y POST
 * 3. Observar que con el método get quedan al descubierto los parámetros
 *    enviados desde la página, pero no con el método POST
 **************************************************************************/
public class InformeContexto extends HttpServlet {
	StringBuffer m = new StringBuffer(800); // Cadena que se define en init() y se muestra en doPost
	
	/****************************************************************
	 * init(): inicialización del servlet
	 * Un ejemplo de cómo obtener información de configuración y contexto
	 *****************************************************************/
	public void init(ServletConfig config) throws ServletException {
		
		//// Nombre del servlet
		m.append("<P>Servlet '"+config.getServletName()+"' arrancado a las " + new Date());
		
		//// Obtener parametros del servidor web
		m.append( "<OL>");
		for ( Enumeration e= config.getInitParameterNames(); e.hasMoreElements(); ) {
			String nom_par = (String) e.nextElement(); // Obtenemos el nombre del parámetro
			m.append("<LI>Parámetro de ServletConfig: " + nom_par);
			//// Se obtiene el valor del parametro
			m.append(". Valor: " + config.getInitParameter( nom_par ) );
		}
		m.append( "</OL>");
		
		/**********************************************************
		 * Conseguimos un contexto para:
		 * 1. Obtener el path real a partir de un path virtual dentro del sistema de ficheros
		 *    del servidor.
		 * 2. Obtener el nombre del servidor web
		 * 3. Obtener la versión del API servlet soportado
		 **********************************************************/
		ServletContext sc = config.getServletContext();
		m.append( "<P>RealPath: " + sc.getRealPath( "/"));
		m.append( "<P>ServerInfo: " + sc.getServerInfo());
		m.append( "<P>Versión API Servlet: " + sc.getMajorVersion() + "." + sc.getMinorVersion());
		
		//// Obtener atributos del contexto
		m.append( "<OL>");
		for ( Enumeration e= sc.getAttributeNames(); e.hasMoreElements(); ) {
			String nom_par = (String) e.nextElement(); // Obtenemos el nombre del atrib
			m.append("<LI>Atributo de contexto: " + nom_par);
			m.append(". Valor: " + sc.getAttribute( nom_par ) ); // Se obtiene el valor del atrib
		}
		m.append( "</OL>");
		
		sc.log( "----> Inicio de servlet "+ config.getServletName() ); // A archivo LOG y/o consola
	}
	
	/****************************************************************
	 * destroy(): Se ejecuta al destruirse el servlet, normalmente por el cierre del servidor
	 *****************************************************************/
	public void destroy() {
		System.out.println("----> Servlet "+this.getClass().getName() +" detenido a las " + new Date());
	}
	
	/*****************************************************************
	 * Procesar una petición HTTP con el método POST
	 *****************************************************************/
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType( "text/html; charset=iso-8859-1" );
		PrintWriter out = response.getWriter();
		
		//// Empezamos a escribir la página de respuesta usando 'out'
		out.println("<html>");
		out.println("<head><title>Ejemplo de Servlet</title></head>");
		out.println("<body bgcolor=\"#FFFF9D\"><FONT color=\"#000080\" FACE=\"Arial,Helvetica,Times\" SIZE=2>");
		out.println("<CENTER><H3>Uso de ServletContext y HttpServletRequest</H3></CENTER><HR>");
		
		//// Información obtenida en init()
		out.println("<P><B>El servlet da información en init() que puede ser interesante:</B></P>");
		out.println( m );
		
		out.println("<p><B>Este servlet gestiona métodos GET y POST. Información de parámetros:</B></P>");
		
		//// Parámetros (extraidos de una Enumeration de parámetros
		out.println( "<OL>");
		for ( Enumeration e= request.getParameterNames(); e.hasMoreElements(); ) {
			String nom_par = (String) e.nextElement();  // Obtenemos el nombre del parámetro
			out.print("<LI>Parámetro: " + nom_par);
			//// Se obtiene el valor del parametro enviado
			out.println(". Valor: " + request.getParameter( nom_par ) );
		}
		out.println( "</OL>");
		
		//// Información de HttpServletRequest
		out.println("<P><B>Información de la petición (HttpServletRequest):</B><OL>" );
		out.println("<LI>ContextPath: " + request.getContextPath() );
		out.println( "<LI>Headers: <UL>");
		for ( Enumeration e= request.getHeaderNames(); e.hasMoreElements(); ) {
			String nom_h = (String) e.nextElement();
			out.println("<LI>Header: " + nom_h + ". Valor:" + request.getHeader( nom_h ));
		}
		out.println( "</UL>");
		out.println("<LI>PathInfo: " + request.getPathInfo() );
		out.println("<LI>PathTranslated: " + request.getPathTranslated() );
		out.println("<LI>ServletPath: " + request.getServletPath() );
		out.println("<LI>QueryString: " + request.getQueryString() );
		out.println("<LI>Class: " + request.getClass() );
		out.println("<LI>Protocol: " + request.getProtocol() );
		out.println("<LI>RemoteHost: " + request.getRemoteHost() );
		out.println("<LI>RemoteUser: " + request.getRemoteUser() );
		out.println("<LI>RequestedSessionId: " + request.getRequestedSessionId() );
		
		//// No crea una sesión en el caso de que no la haya.
		if ( request.getSession(false) != null )
			out.println("<LI>Session.toString(): " + request.getSession(false).toString() );
		else
			out.println("<LI>Session.toString(): no se ha recuperado la sesión" );
			
		
		out.println("<LI>RequestURI: " + request.getRequestURI() );
		out.println("<LI>RequestURL: " + request.getRequestURL() );
		out.println("<LI>ServerName: " + request.getServerName() );
		out.println("<LI>ServerPort: " + request.getServerPort() );
		out.println( "</OL>");
		
		out.println("</body></html>");
	}
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost( request, response );
	}
}
