servlet - es un Java-nporpaMMa que usa la clase HttpServiet. Un servlet se utiliza para ampliar las capacidades de un servidor existente, en particular, un servidor web. Normalmente, un servlet se ejecuta en un servidor dedicado. Estos servidores se denominan servidores de aplicaciones Java. Un servidor de aplicaciones Java incluye un servidor web como bloque de construcción (a veces no uno, sino varios), así como servidores que funcionan con componentes de servidor, servidores para servicios auxiliares, etc. Un servlet se ejecuta en un entorno proporcionado por el servidor. La parte del servidor dedicada a servir servlets se denomina contenedor de servlets. La especificación de servlet asume que una clase de servlet tiene métodos estándar que se ejecutan en algún punto del ciclo de vida del servlet. Estos métodos son llamados por el contenedor de servlets. La implementación de la especificación de servlet se incluye en el conjunto de paquetes de lenguaje Java estándar.
Este libro se centra en un servidor de aplicaciones Java llamado Blazix. Blazix Server proporciona un conjunto completo de capacidades de servlet. Además de crear una clase (o clases) de servlet, así como configurar el programa de servlet creado e instalarlo en el servidor, debe cambiar el archivo de configuración del servidor web. Los valores principales se especifican en el archivo de configuración de la siguiente manera: servlet.name: myservlet
servlet.myservlet.className: mypackage.MyServletClass servlet.myservlet.url: /mysrvlet
Cada servlet debe tener un nombre.(servlet.name), por el que se identifica en el servidor. Este nombre se utiliza para establecer las propiedades del servlet, en particular, para indicar el nombre de la clase en la que se almacena el programa del servlet (siguiente línea), así como la dirección en la que se llama a este servlet (tercera línea).
El cliente solicita al servidor web la dirección donde se encuentra el servlet (la dirección debe especificarse como el valor de servlet.myservlet.url en el archivo de configuración del servidor web). El servidor pasa la solicitud y los datos (si los hay) al servlet, recibe la respuesta del servlet y la envía al cliente.
Sobre esta explicación de lo que es un servlet, se podría terminar. Sin embargo, hay muchos detalles interesantes y útiles a los que debes prestar atención y estudiarlos con más detalle.
Es especialmente importante tener en cuenta que la ruta de clase del servlet debe especificarse en la variable ciasspath, o se puede colocar en el directorio C:\Blazix\classes o en el directorio especificado en el archivo de configuración del servidor web como el valor server.ciassDir. Después de modificar el archivo de configuración para incluir información sobre el nuevo servlet, el servidor debe detenerse y reiniciarse. El servlet también se puede alojar en un servidor en ejecución utilizando la utilidad de administración, pero para hacerlo, el servlet debe estar empaquetado en un archivo WAR Web. Si el archivo de clase de servlet ha cambiado, no es necesario detener el servidor y volver a iniciarlo. De manera predeterminada, el servidor está configurado para que llamar al servlet en http://localhost:81/_reload haga que todas las clases se vuelvan a cargar y la clase de servlet modificada esté disponible para las solicitudes de los clientes (Figura 4-1). Visite esta página después de que se haya modificado el archivo de clase de servlet. Detener el servidor simplemente no es necesario.
Si el lector ya ha tenido alguna experiencia con los servlets, apreciará la simplicidad del servidor Blazix en comparación con otros servidores Java, como el servidor Tomcat.
Para ir directamente al grano, considere un ejemplo simple, un servlet algún servlet (listado 4.1).
Listado 4.1. Servlet AlgúnServlet.java I
importar java.io.*; importar javax.servlet.*; importar javax.servlet.http.*;
clase pública SomeServlet extiende HttpServlet (public void doGet (solicitud HttpServletRequest,
respuesta HttpServletResponse) lanza ServletException, IOException ( Printwriter out = response.getWriter(); out.println("Hello World");
En el archivo de configuración del servidor web, escriba lo siguiente:
servlet.nombre: primero
servlet.first.className: SomeServlet
servlet.primero.url: /hacerprimero
Entonces la llamada al servlet desde el navegador tomará la forma http://localhost:81 /doprimero (Figura 4.2).
Los servlets de Java proporcionan un método independiente de la plataforma para construir aplicaciones web (esto no es seguro, pero no profundizaremos más en este tema, porque entonces tendríamos que definir qué se entiende por aplicación web, que no está incluida en el lista de temas cubiertos), y muchas aplicaciones son rápidas para trabajar y no tienen las limitaciones de las aplicaciones CGI. Un servlet se ejecuta en un servidor web y, a diferencia de un subprograma, no requiere una interfaz gráfica de usuario. El servlet se comunica con el servidor intercambiando solicitudes y respuestas con él. El programa cliente realiza solicitudes al servidor. La solicitud es procesada por el servidor, pasa al servlet, el servlet envía una respuesta a través del servidor al cliente. Los servlets son muy populares hoy en día para crear aplicaciones web interactivas. Hay muchos servidores web que pueden trabajar con servlets, como Tomcat, iPlanet Web Server (anteriormente Netscape
servidor empresarial), Blazix. J Builder Enterprise utiliza Borland Enterprise Server (BES) incluido con el paquete y también admite servidores web Lógica, WebSphere e iPlanet. J Builder Enterprise Server incluye un servidor Tomcat que se utiliza "de forma predeterminada".
Arroz. 4.2. Llamar a un servlet
Una ventaja importante de los servlets es su velocidad. A diferencia de las aplicaciones CGI, los servlets solo se cargan en la memoria una vez y luego se ejecutan directamente desde la memoria. Los servlets son esencialmente aplicaciones de subprocesos múltiples. Además, son independientes de la plataforma, ya que están escritos en Java.
Tecnología JSP a la que el capítulo 3, es una extensión de la tecnología servlet, en JSP Atención especial se enfoca en trabajar con documentos HTML y XML. Como parte del código HTML y XML, los fragmentos JSP encuentran su uso más común. ¿Cómo elegir y decidir qué usar: servlets o páginas de servidor? Los servlets son más adecuados para resolver tareas de programación de bajo nivel y menos adecuados para resolver tareas de creación de lógica de presentación de aplicaciones. Los JSP del lado del servidor, por otro lado, se centran principalmente en cómo presentar el resultado al usuario de la manera más conveniente. Las páginas del servidor se crean en línea con código HTML utilizando el estilo de creación de documentos HTML. La tecnología JSP proporciona características mucho más ricas que el HTML simple. Los JSP pueden proporcionar la capacidad de implementar la lógica de la aplicación utilizando beans Java simples, así como EJB del lado del servidor mediante la creación de bibliotecas de acceso directo personalizadas. Por sí mismas, las páginas del servidor Java pueden ser componentes modulares y reutilizables que funcionan con una lógica de presentación que se puede usar junto con varias plantillas y filtros. Los JSP se convierten en servlets, por lo que, en teoría, solo puede usar servlets. Sin embargo, la tecnología JSP está diseñada para simplificar el proceso de creación de documentos web al separar la lógica de presentación de una aplicación del contenido del documento. En la mayoría de los casos, la respuesta enviada al cliente consiste tanto en plantillas de presentación de documentos como en datos que se generan automáticamente al completar la plantilla. En estas situaciones, es mucho más fácil trabajar con los JSP que con los servlets.
Una de las características más divertidas de Java es su naturaleza multifacética. Por supuesto, la creación de escritorio tradicional e incluso aplicaciones móviles- esto es genial. Pero, ¿qué sucede si quiere salirse de los caminos trillados y entrar en el territorio del desarrollo web de Java? para ti allí buenas noticias: El lenguaje viene con una API Servlet completa que le permite crear aplicaciones web sólidas sin demasiados problemas.
Creación de aplicaciones Java con servlets
Entonces, ya hemos creado los archivos de configuración de la aplicación. Sin embargo, en su estado actual, literalmente no hace nada. Queremos que los clientes puedan registrarse con un formulario HTML, por lo que lo siguiente que debemos hacer es crear archivos JSP que mostrarán el formulario anterior y los detalles del cliente una vez que el registro sea exitoso. Esto es lo que haremos ahora.
Trabajando en la mirada
La apariencia de la aplicación estará definida por dos archivos JSP; en el contexto de MVC, se denominan vistas. El primero será el encargado de desplegar el formulario de inscripción y posibles errores llamado después de validar los datos ingresados. La segunda será una página de bienvenida normal que mostrará los datos introducidos por el cliente una vez finalizado con éxito el proceso de registro.
Aquí está el primer archivo JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Registro
$(violación).
El archivo contiene HTML simple con un par de adiciones. Esa es la belleza de JSP combinado con JSTL y JEL. Observe lo fácil que es verificar los errores de validación usando etiquetas estándar como<с:if>y
El atributo de acción del formulario de registro apunta a la siguiente URL: $(pageContext.request.contextPath)/processcustomer . Esto significa que cada vez que un cliente intente registrarse, se enviarán datos a procesarcliente independientemente de la URL donde esté disponible el formulario. Esto se logra a través de la funcionalidad de los objetos disponibles en el archivo JSP, como la solicitud.
Pronto veremos cómo el servlet se une a la URL del cliente de proceso y cómo interactúa con la entrada. Por ahora, echemos un vistazo al archivo JSP responsable de la página de bienvenida:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
¡Gracias por registrarte!
Sus datos ingresados:
Nombre:$(nombre)
Apellido:$(apellido)
Correo electrónico:$(correo electrónico)
Ahora que nos hemos ocupado de la representación de páginas, el siguiente paso es crear un servlet responsable de recopilar los datos del cliente de las solicitudes POST y validar los datos de una manera sencilla.
Escribimos el controlador
Escribir un servlet que pueda recibir datos de un formulario de registro es tan fácil como desgranar peras. Todo lo que tenemos que hacer es escribir una subclase de la clase HttpServlet e implementar sus métodos doGet() o doPost() (o ambos si es necesario). En este caso, el servlet interactuará con los datos provenientes de las solicitudes POST.
Esto es lo que parece:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") public class CustomerController extends HttpServlet ( @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ( RequestCustomer cliente = RequestCustomer.fromRequestParameters(request); cliente .setAsRequestAttributes(solicitud); Lista de violaciones = cliente.validar(); if (!violaciones.isEmpty()) (solicitud.setAttribute("violaciones", violaciones); ) String url = determineUrl(violaciones); request.getRequestDispatcher(url ).forward(solicitud, respuesta); ) private String determineUrl(Lista de infracciones) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) clase estática privada RequestCustomer ( cadena final privada nombre; cadena final privada apellido; cadena final privada correo electrónico; solicitud cliente privada (cadena nombre, cadena apellido, cadena correo electrónico) ( this.firstName = firstName; th es.apellido = apellido; este.email = correo electrónico; ) RequestCustomer público estático fromRequestParameters (solicitud de HttpServletRequest) (devolver nuevo RequestCustomer (request.getParameter ("firstname"), request.getParameter ("apellido"), request.getParameter ("email")); ) public void setAsRequestAttributes (solicitud de HttpServletRequest) ( request.setAttribute("firstname", firstName); request.setAttribute("lastname", lastName); request.setAttribute("email", email); ) lista pública validar() ( Infracciones de lista = new ArrayList<>(); if (!StringValidator.validate(firstName)) ( violaciones.add("El nombre es un campo obligatorio"); ) if (!StringValidator.validate(lastName)) ( violaciones.add("El apellido es un campo obligatorio") ; ) if ( !EmailValidator.validate(correo electrónico)) ( violaciones.add("El correo electrónico debe estar bien formado"); ) devolver violaciones; ) ) )
Lo primero que debe notar aquí es el uso de la anotación @WebServlet(name ="CustomerController", urlPatterns = "/processcustomer"). Le dice al contenedor de servlets que use la clase CustomerController para manejar las solicitudes HTTP a /processcustomer. Se puede lograr el mismo efecto agregando directivas de mapeo de servlet a web.xml como , pero como estamos usando la Especificación de servlet 3.1, no necesitamos recurrir a este método.
Aquí hemos nombrado al servlet CustomerController porque se considera una buena práctica usar el nombre de la clase del servlet como el valor del atributo de nombre de la anotación @WebServlet. De lo contrario, algunos contenedores no coincidirán, lo que generará un error 404.
La propia clase CustomerController realiza algunas tareas sencillas. Primero, recopila la entrada del formulario mediante una implementación de la interfaz HttpServletRequest, que contiene valores correspondientes a los campos de nombre, apellido y correo electrónico del formulario. Luego establece esos valores como atributos de consulta para que se puedan volver a representar en el formulario o en la página de resultados. Finalmente, los validadores verifican la exactitud de los datos ingresados.
Los validadores son clases simples que verifican ciertas propiedades, como si una cadena está vacía o si un correo electrónico parece un correo electrónico. En el GitLab del autor puedes ver su implementación.
El resultado de la validación afecta el curso posterior de los eventos: si los datos no son válidos, el cliente es redirigido a través del objeto RequestDispatcher a la página de registro, donde se muestran los errores correspondientes. Si todo está en orden, se muestra la página de bienvenida.
Entonces, hemos creado una aplicación web Java completa que le permite registrar clientes usando un formulario HTML, un servlet básico y algunos archivos JSP. Es hora de lanzarlo.
Lanzamiento de la aplicación
Para iniciar la aplicación, debe realizar los siguientes pasos:
IDEA IntelliJ). Cuando implementa el proyecto y lo ejecuta, el navegador predeterminado debería iniciarse con una ventana de inicio de sesión.
Conclusión
Entonces, ha adquirido todas las habilidades que necesita para crear su propia aplicación web Java sin tener que recurrir a marcos complejos. Todo lo que necesita es una API de Servlet, una tecnología como JSP para la representación y funciones de Java integradas. Es genial, ¿verdad?
Vale la pena señalar que la implementación de la clase CustomerController destaca las ventajas y desventajas de los servlets: por un lado, muestra brevemente lo fácil que es procesar los parámetros de solicitud y enviar respuestas al cliente en diferentes formatos. Pero esta funcionalidad tiene un precio: ambas implementaciones de las interfaces HttpServletResponse y HttpServletResponse son localizadores de servicios regulares. Esto no quiere decir que esto sea malo, ya que los localizadores simplemente contienen datos. Sin embargo, tenga en cuenta que estas implementaciones siempre estarán vinculadas al servlet.
servlet es un programa Java que se ejecuta en el lado del servidor de una aplicación web. Así como los applets amplían dinámicamente la funcionalidad de un navegador web, los servlets amplían dinámicamente la funcionalidad de un servidor web.
trabaja servlet"y se puede describir de la siguiente manera: cuando llega una solicitud de un cliente, el servidor web puede determinar qué servlet debe ejecutarse utilizando un archivo de configuración especial. Después de eso, el servidor web inicia la JVM, que a su vez ejecuta el servlet. El servlet procesa la solicitud y pasa el contenido del servidor web (posiblemente en forma de una página HTML) El servidor web envía una respuesta (una página HTML generada por el servlet) al cliente.
El servidor WEB es esencialmente una especie de contenedor que descarga servlet"s, los ejecuta y, habiendo recibido el resultado de ellos, lo envía al cliente.
Servlet en Arquitectura de Aplicaciones Web
Debido a su potencia y flexibilidad, servlet"s pueden desempeñar un papel importante en la arquitectura del sistema. Pueden realizar tareas de aplicación destinadas a la capa intermedia, actuar como un servidor proxy para el cliente e incluso mejorar la funcionalidad de la capa intermedia agregando soporte para nuevos protocolos y otras funciones La capa intermedia actúa como un servidor de aplicaciones en el llamado sistema cliente-servidor de tres niveles y se encuentra entre un cliente "ligero", como un navegador web, y la fuente de datos.
Servlet como proxy
Para admitir applets, los servlets pueden actuar como sus servidores proxy. Esto puede ser importante porque el sistema de seguridad de Java solo permite que los applets se conecten al servidor del que se descargaron. Si el applet necesita conectarse a un servidor de base de datos ubicado en otra máquina, servlet puede crear esta conexión para un applet.
temporal y permanente servlet"s
Los servlets se pueden iniciar y detener para cada solicitud del cliente. También se pueden iniciar cuando se inicia el servidor web y existen hasta que se detiene. Temporario servlet Los "s se cargan bajo demanda y ofrecen una buena manera de conservar los recursos del servidor para funciones que se usan con poca frecuencia. Los servlets persistentes se cargan cuando el servidor web se inicia y duran hasta que se detiene. Los servlets se instalan como extensiones persistentes del servidor si el costo de iniciar ellos es muy alto (por ejemplo, establecer una conexión de base de datos) si ofrecen una funcionalidad persistente en el lado del servidor (por ejemplo, un servicio RMI), o en los casos en que necesitan responder a las solicitudes de los clientes lo más rápido posible. No hay un código específico para asignar servlet"pero permanente o temporal; esta es una función de configuración del servidor Web.
Ciclo de vida del servlet, javax.servlet.Servlet
Los servlets se ejecutan en la plataforma del servidor web como parte del mismo proceso que el propio servidor web. El servidor web es responsable de inicializar, llamar y destruir cada instancia de servlet. El servidor web interactúa con el servlet a través de una interfaz simple: javax.servlet.servlet.
La interfaz javax.servlet.Servlet incluye tres métodos principales:
- en eso()
- Servicio()
- destruir()
y dos métodos auxiliares:
- getServletConfig()
- getServletInfo()
Similitudes entre interfaces servlet"y el subprograma de Java es obvio. ¡Así fue diseñado! Los servlets de Java son para los servidores web lo que los subprogramas son para los navegadores web. Un subprograma se ejecuta en un navegador web y realiza acciones a pedido a través de una interfaz especial. Un servlet hace lo mismo cuando se trabaja en un servidor Web.
Inicialización de servlet, método init()
La primera vez que se carga el servlet, se llama al método init(). Esto permite que el servlet realice cualquier trabajo de instalación, como abrir archivos o establecer conexiones con sus servidores. Si el servlet está instalado de forma permanente en el servidor, se carga cuando se inicia el servidor. De lo contrario, el servidor invoca el servlet en la primera solicitud del cliente para realizar el servicio proporcionado por ese servlet.
Se garantiza que el método en eso() terminará antes que cualquier otra llamada al servlet, como llamar a un método Servicio(). tenga en cuenta que en eso() será llamado una sola vez; no se llamará hasta que el servlet se descargue y luego el servidor lo vuelva a cargar.
Método en eso() toma un argumento - una referencia a un objeto ServletConfig, que contiene argumentos para inicializar el servlet. Este objeto tiene un método. getServletContext(), que devuelve un objeto ServletContext que contiene información sobre el entorno del servlet.
Núcleo de servlet, método service()
Método Servicio() es el corazón del servlet. Cada solicitud del cliente da como resultado una llamada de método Servicio(). Este método lee la solicitud y genera un mensaje de respuesta usando sus dos argumentos ServletRequest y ServletResponse:
Por lo tanto, hay dos formas de pasar información del cliente al servlet. La primera es pasando valores en parámetros de solicitud. Los valores de los parámetros se pueden insertar en la URL. La segunda forma de pasar información del cliente al servlet es a través de InputStream (o Reader).
Operación del método Servicio() es esencialmente simple: crea una respuesta a cada solicitud de cliente que se le pasa desde el servidor. Sin embargo, tenga en cuenta que puede haber varias solicitudes paralelas procesadas al mismo tiempo. Si el método Servicio() requiere cualquier recurso externo, como archivos, bases de datos, entonces es necesario asegurarse de que el acceso a los recursos sea seguro para subprocesos.
Descarga de servlets, método destroy()
Método destruir() llamado a liberar todos los recursos (por ejemplo, abrir archivos y conexiones de base de datos) antes de descargar el servlet. Este método puede estar vacío si no hay necesidad de realizar ninguna operación final. Antes de llamar a un método destruir() el servidor espera la finalización de todas las operaciones de servicio o la expiración de un cierto tiempo. Esto significa que el método destruir() se puede llamar durante la ejecución de cualquier método largo Servicio().
Es importante formalizar el método. destruir() de tal manera que se evite cerrar los recursos necesarios hasta que todas las llamadas Servicio() no terminará
Configuración de servlet, método getServletConfig()
Método getServletConfig() devuelve una referencia a un objeto que implementa la interfaz ServletConfig. Este objeto proporciona acceso a la información de configuración del servlet, es decir, acceso a los parámetros de inicialización del servlet y al objeto de contexto del servlet ServletContext, que da acceso al servlet y su entorno.
Información de servlet, método getServletInfo()
Método getServletInfo() definido por el programador que crea el servlet para devolver una cadena que contiene información sobre el servlet, como el autor y la versión del servlet.
Interfaz de solicitud de servlet
ServletRequest proporciona información del cliente sobre los parámetros de solicitud HTTP al servlet, es decir, proporciona datos que incluyen el nombre y los valores del parámetro, los atributos y el flujo de entrada. Esta información se pasa al método. Servicio().
Próximo ejemplo de servlet muestra cómo obtener información de un parámetro solicitud método Servicio():
lector BufferedReader; Cadena param1; cadena param2; servicio público vacío (solicitud de ServletRequest, respuesta de ServletResponse) (lector = solicitud.getReader(); param1 = solicitud.getParameter("Primero"); param2 = solicitud.getParameter("Segundo"); )
La información adicional sobre la solicitud está disponible para el servlet a través de métodos, los principales se enumeran en la siguiente tabla:
obtenerAtributo() | Devuelve el valor del atributo especificado de esta solicitud. |
obtenerLongitudContenido() | Tamaño de la solicitud, si se conoce. |
getContentType() | Devuelve el tipo MIME del cuerpo de la solicitud. |
getInputStream() | Devuelve un InputStream para leer datos binarios del cuerpo de la solicitud. |
ObtenerNombresDeParámetros() | Devuelve una matriz de cadenas con los nombres de todos los parámetros. |
obtener valores de parámetro () | Devuelve una matriz de valores para el parámetro especificado. |
obtenerProtocolo() | Devuelve el protocolo y la versión de la solicitud como una cadena del formulario |
getReader() | Devuelve un BufferedReader para recibir texto del cuerpo de la solicitud. |
obtenerRutaReal() | Devuelve la ruta real de la ruta virtual especificada. |
getRemoteAddr() | La dirección IP del cliente que envió esta solicitud. |
obtenerHostRemoto() | El nombre de host de la máquina cliente que envió la solicitud. |
obtenerEsquema() | Devuelve el esquema utilizado en la URL de esta solicitud (por ejemplo, https, http, ftp, etc.). |
getServerName() | El nombre de host del servidor que aceptó esta solicitud. |
getServerPort() | Devuelve el número de puerto utilizado para recibir esta solicitud. |
Interfaz ServletResponse
Interfaz ServletRespuesta es una herramienta para el envío de datos al cliente. Todos los métodos de esta herramienta sirven exactamente para esta tarea:
Public java.lang.String getCharacterEncoding() public void setLocale(java.util.Locale loc) public java.util.Locale getLocale()
El primer método devuelve el tipo de codificación MIME (por ejemplo, UTF8) en el que se mostrará la información. Los dos segundos métodos también funcionan con charset. Indican el idioma utilizado en el documento (por ejemplo, ruso).
ServletOutputStream público getOutputStream() lanza java.io.IOException
El método getOutputStream devuelve el flujo de salida del servlet. Esta secuencia se utiliza, por ejemplo, para generar archivos binarios. Los datos de texto se pueden generar usando java.io.Writer:
Público java.io.PrintWriter getWriter() lanza java.io.IOException
El método getWriter() convierte automáticamente cadenas al juego de caracteres especificado en los métodos getCharacterEncoding() y getLocale().
public void setContentLength(int len)
El método setContentLength establece el valor del campo de encabezado HTTP "Content-Length"
public void setContentType (tipo de cadena)
El método setContentType se utiliza para enviar el tipo de contenido MIME del documento. Campo de encabezado HTTP "Tipo de contenido".
El flujo de salida se almacena en búfer. Esto significa que una parte de los datos se enviará al cliente solo después de que el búfer esté lleno.
public void setBufferSize(tamaño int) public int getBufferSize() public void flushBuffer() lanza java.io.IOException public void resetBuffer()
Los 4 métodos anteriores permiten, respectivamente, establecer el tamaño del búfer de envío, obtener su tamaño, inicializar el envío del contenido del búfer al cliente sin esperar a que se llene y borrar los datos de este búfer.
booleano público isCommitted()
Usando el método isCommitted, puede obtener un indicador, si ya ha comenzado el envío de datos al cliente. La bandera será positiva si ya se ha enviado un encabezado de respuesta HTTP.
reinicio de vacío público ()
Si el encabezado HTTP aún no se ha enviado, el método de reinicio "restablece" el encabezado HTTP a sus valores predeterminados.
Gráficos JFreeChart en Servlets
La biblioteca de gráficos JFreeChart se puede utilizar en servlets para crear gráficos y mostrarlos como imágenes en las páginas del sitio web. Se proporcionan detalles de descripción y ejemplos del uso de JFreeChart en servlets.
Servlet con biblioteca de gráficos Chart.js
JNI en Servlet
En algunos casos, es posible que necesite usar JNI en una aplicación WEB. Se presenta un ejemplo del uso de JNI en servlets.
Mensajes JMS en un servlet
El servlet se puede utilizar para intercambiar JMS mensajes entre aplicaciones. Se proporciona un ejemplo del uso de un servlet para enviar y leer mensajes JMS en un contenedor JBoss.
Un Java Servlet es un programa del lado del servidor escrito en el lenguaje de programación del mismo nombre que recibe señales de un cliente y le envía respuestas. Es el elemento clave que forma el típico Java EE, además de JSP, EJB, XML y otras tecnologías relacionadas. Una aplicación se puede empaquetar en un archivo WAR (Web AR chive) para su implementación en un servidor web. Un servidor que puede ejecutar un servlet de Java se denomina contenedor. Un programa que se ejecuta en dicho servidor puede crear páginas web dinámicas.
Conceptos básicos de los servlets de Java
Los contenedores más populares y ampliamente utilizados son Tomcat y JBoss. Técnicamente, un Servlet es una clase Java normal que tiene una extensión para el Protocolo Común Cliente/Servidor, o HTTP. En la práctica, se utiliza para procesar solicitudes, a través de las anulaciones HttpServlet GET y POST, respectivamente. El contenedor de Java Servlet proporciona Http.ServletRequest y Http.ServletResponse, que son objetos de solicitud y respuesta. Y generalmente se usa junto con JSP para generar contenido dinámico.
Escenario modelo típico:
Los filtros de servlet de Java son complementos de Java que se utilizan para interceptar y procesar solicitudes antes de que se envíen al servlet y respondan después de que se haya completado su código, y antes de que el contenedor envíe la respuesta al cliente.
Tareas comunes para realizar con filtros:
Los filtros se incluyen y configuran en un archivo descriptor de implementación (web.xml). Los servlets y los filtros no se conocen entre sí, por lo que puede agregar o eliminar un filtro simplemente editando web.xml. Es aceptable tener múltiples filtros para un solo recurso, o filtros de cadena para web.xml, o ejecutar filtros de Java Servlet implementando la interfaz javax.servlet.Filter.
Las solicitudes paralelas al servidor son procesadas por subprocesos, lo que proporciona cualidades importantes de la web: subprocesos múltiples y paralelismo.
Funciones principales:
La necesidad de páginas web dinámicas
Hay muchas razones por las que a una empresa le gustaría crear páginas web dinámicas sobre la marcha, como cuando los datos de un sitio web cambian con frecuencia. Los sitios de noticias y clima generalmente dependen de CGI para mantener el contenido actualizado sin la atención constante de los desarrolladores. Las páginas web de comercio electrónico que enumeran los precios actuales y los niveles de existencias utilizan CGI para obtener este contenido bajo demanda, recuperándolo de la infraestructura interna de la empresa.
Muchos usuarios tienen experiencia en el uso de la tecnología Java para crear servicios web basados en CGI, pero los Java Servlets son más eficientes, potentes, fáciles de usar y menos costosos que las alternativas CGI tradicionales.
Beneficios de los servlets de Java:
Han pasado casi veinte años desde la llegada del lenguaje de programación Java. Durante este tiempo, Java fue profetizado por la muerte y el olvido, los programadores aquí se reían de su lentitud y avaricia por los recursos. Pero también hubo quienes creyeron en Java, desarrollaron todo tipo de bibliotecas, desarrollaron la comunidad, demostraron obstinadamente que no hay límites para Java: tiempo real, integrado, IA: todo es posible. Decidimos no quedarnos al margen y hacer una pequeña serie de artículos sobre Java en esta sección. ¡Vamos!
Tu tetera elige Java
Según el propio Oracle, hoy en día el virtual maquina java instalado en más de tres mil millones de dispositivos. Y estos no son solo computadoras y teléfonos inteligentes, sino también cámaras, televisores, reproductores de Blue-ray, impresoras, tarjetas SIM, cajeros automáticos e incluso automóviles. Esta lista crecerá de manera constante y, con ella, las ofertas de trabajo para programadores de Java. Incluso ahora, el número de vacantes para programadores de Java supera al resto. Y las empresas están dispuestas a pagar cada vez más, robando empleados y organizando condiciones de trabajo más favorables.
¿Y por qué es buena?
Los programadores de Java se sienten atraídos por el minimalismo de la sintaxis. Sin modificadores adicionales ni palabras de servicio. Incluso la ausencia de herencia múltiple, que al principio confundió un poco a los programadores de C++, al final resulta razonable y justificada. Lógica simple, trabajo automático con memoria, documentación detallada, foros con respuestas a todo tipo de preguntas, fuente abierta- todo esto le permite comprender rápidamente el proceso de desarrollo y reduce significativamente la cantidad de errores potenciales. Incluso los campesinos indios aprenden Java en un par de meses, al menos eso es lo que dicen sus diplomas :). Además, Java es un lenguaje interpretado. El compilador traduce el código fuente en el llamado código de bytes, que es fácil de volver a convertir, lo que hace que Java sea especialmente atractivo para la ingeniería inversa.
Bueno, comencemos
Java es un lenguaje orientado a objetos, lo que significa que todas las variables, métodos y constantes se declaran dentro de una clase. Además de las clases, también hay interfaces, una construcción abstracta especial que le permite describir el comportamiento de un objeto sin especificar una implementación específica. Y si no hay herencia múltiple de clases en Java, entonces una clase puede implementar cualquier cantidad de interfaces, lo que permite que un objeto tenga muchas funciones, pero proporcione solo una parte de ellas.
Los tipos de datos se pueden dividir en dos grupos: simples (int, long, char, etc.) y tipos de objetos: clases, interfaces, matrices. Los tipos simples son siempre y en todas partes de dimensión fija. Por ejemplo, en cualquier arquitectura y dispositivo, un int ocupa cuatro bytes de memoria. Esto es muy conveniente para los cálculos. La matriz de datos contiene un atributo de longitud especial que almacena el tamaño de la matriz, por lo que agradecemos especialmente a los desarrolladores. Los datos de diferentes tipos se pasan a los métodos de diferentes maneras. Los tipos simples siempre se pasan por valor. Objeto: siempre por referencia para ahorrar memoria. Esto significa que si pasamos int a = 10 y cambiamos su valor a 5 en el método llamado, entonces a seguirá siendo 10 en el método original, pero si cambiamos la propiedad del objeto, cambiará en el método original como bien.
Recuerda la memoria
A pesar de programador java y liberado de la necesidad de asignar y liberar memoria, desconocimiento de algunas características de la obra máquina virtual y el recolector de basura puede convertir fácilmente su programa en un monstruo voraz que devora el tiempo de CPU y toda la memoria disponible.
Al crear una nueva matriz, recuerde siempre que es mucho más fácil crear muchas piezas pequeñas de memoria que una enorme. De lo contrario, corre el riesgo de encontrarse con un error de memoria insuficiente, lo que significa aproximadamente que tenía memoria, pero salió toda.
Muchos programadores, cuando cambian a Java y aprenden sobre la limpieza automática de la memoria, comienzan a crear objetos en grandes cantidades, con la esperanza de que todo se limpie solo. Mientras tanto, el recolector de basura es como una máquina que solo puede recoger la basura arrojada a un contenedor cerca de la casa. Si ya no necesita algunos datos, no debe almacenarlos por si acaso, como una pila de postales antiguas: asigne nulo al puntero de datos, ayude al limpiador a limpiar :). También es una buena práctica borrar la lista si ya no la necesita. Recuerde, un objeto se mantendrá en la memoria siempre que haya referencias a él en el código. Incluso si su programa se ejecuta en 16 gigabytes de memoria y no está en peligro de quedarse sin memoria, se volverá cada vez más torpe y lento debido a la sobreabundancia de memoria utilizada. El 99% de las quejas de los usuarios sobre los programas lentos de Java se deben a que están escritos de manera ineficiente. código fuente. Si necesita crear constantemente objetos que se usan rápidamente y ya no son necesarios, como muchos mensajes pequeños, considere crear un grupo que almacene una cantidad de instancias para uso repetido. Recuerde, crear y eliminar un objeto es una operación costosa.
Manos a la obra, señores.
Un ejemplo es mejor que mil palabras. Puede desplazarse por el manual y ver las palabras de saludo estándar sin nosotros, por lo que asumiremos que ya lo ha hecho y está listo para implementar un ejemplo más interesante.
Tú y yo nos ocuparemos de la aplicación de servidor de Java y escribiremos un pequeño programa para "espiar" a los usuarios. redes sociales. Para hacer esto, ni siquiera tiene que conseguir un trabajo en la NSA: los usuarios difunden todo sobre sí mismos, y solo tendremos que recibir, sistematizar y mostrar esta información de una manera hermosa. Toma uno de los populares servicios sociales, por ejemplo foursquare, y dibujar los movimientos de nuestros amigos en el mapa.
Primero, veamos qué podemos sacar de foursquare. Después de recorrer las páginas para desarrolladores, dirigimos nuestra atención a dos métodos:
- https://developer.foursquare.com/docs/users/checkins - lugares visitados por el usuario. Desafortunadamente, actualmente solo es compatible con el usuario registrado en el programa, y hay rumores de que debido a limitaciones en la implementación, seguirá siendo así;
- https://developer.foursquare.com/docs/checkins/recent: lugares visitados por amigos del usuario registrado. Si juegas un poco con esta función, resulta un hecho triste: para cada amigo, se devuelve exactamente un lugar, el último lugar donde se verificó a sí mismo.
Para usar la API de Foursquare, debe registrar nuestra futura aplicación, vaya a esta dirección: https://ru.foursquare.com/developers/register y complete los campos (sí, también tendrá que registrarse en Foursquare, pero puedes hacerlo perfectamente sin mí).
De los campos importantes, solo se pueden anotar aquí "Nombre de la aplicación", "Descargar / URL de la página de bienvenida" (ingrese una dirección web arbitraria aquí) y "Redirigir URI (s)": esta es la dirección a la que el servidor nos enviará después del registro. Ingresaremos el valor deseado aquí más tarde, pero por ahora simplemente puede ingresar cualquier dirección web. Haga clic en "Guardar" y nuestra aplicación de seguimiento se ha registrado correctamente.
Nos elevamos a las nubes
Captain Obvious transmite que cualquier aplicación de servidor necesita un servidor para funcionar. Levantar un servidor por su cuenta es hemorroides, por lo que usaremos soluciones en la nube que ahora son populares. La nube será patrocinada por Google Corporation porque su Google App Engine es gratuito, bastante fácil de configurar y usar. Para comenzar, vaya aquí y descargue el SDK de Google App Engine para Java.
Ahora puede comenzar a crear el proyecto. Para el desarrollo de Java, uso IntelliJ IDEA, pero puede usar el entorno Eclipse gratuito e igualmente conocido.
Seleccionemos un nuevo proyecto Java. Llamémoslo nsa_tracker.
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image1.png)
En la siguiente pestaña, marque Aplicación web y Google App Engine a la izquierda e indique la ruta al SDK de App Engine previamente descargado y desempaquetado.
![](https://i1.wp.com/xakep.ru/wp-content/uploads/2014/07/image2.png)
Ahora siéntese y deje que el IDE haga lo suyo. Si eligió IDEA e hizo todo bien, como resultado verá un proyecto terminado que, cuando se inicia, abre una ventana del navegador con contenido vacío. Puedes empezar a codificar.
empezamos a buscar
Entonces, tenemos una carpeta de proyecto, que contiene la carpeta src. Aquí es donde pondremos el código fuente. Las fuentes en Java se agrupan por paquetes. Un paquete es una carpeta en el disco. Los paquetes son necesarios para no volcar todas las fuentes en un montón, sino para separarlas, guiados por los principios de la lógica. Por ejemplo, el código relacionado con la interfaz de usuario se colocaría lógicamente en el paquete ui, las interacciones de red en el paquete de red. Esto facilita enormemente el desarrollo y soporte del proyecto posteriormente. Históricamente, la práctica ha sido comenzar la estructura del paquete con el nombre de la empresa seguido del nombre del programa. Esto ayudará a identificar fácilmente nuestras fuentes entre un montón de las mismas en el futuro. Para nuestro programa, crearemos el paquete org.nsa.tracker. En él crearemos clases.
Los servlets se utilizan para procesar las solicitudes de los usuarios en el servidor. Un servlet es una clase que normalmente se hereda de HttpServlet y funciona sobre la base de una solicitud y respuesta. Todo lo que se necesita es anular el método doGet. A pedido del usuario, debemos iniciar sesión en foursquare, cargar la lista de registros de amigos y redirigir la solicitud a la página del mapa.
Para trabajar con la API de foursquare, utilizaremos la biblioteca gratuita foursquare-api-java, que se puede obtener desde aquí. Una biblioteca de Java es un archivo ZIP con una extensión jar que contiene clases de Java compiladas que implementan ciertas funciones. Para la autorización, necesitamos el ClientId y ClientSecret obtenidos en la etapa de registro de la aplicación en foursquare. Dado que estos parámetros no cambian durante la ejecución del programa, los declaramos como constantes.
Cadena final estática privada CLIENT_ID = "FAKE_CLIENT_ID"; Cadena final estática privada CLIENT_SECRET = "FAKE_CLIENT_SECRET";
Final significa que a esta variable se le ha asignado un valor final que no se puede cambiar. Static hace que la variable esté disponible para todas las instancias de la clase dada. Usando el ejemplo de autorización de la biblioteca foursquare-api-java, obtenemos algo como el siguiente código:
Vacío protegido doGet(HttpServletRequest req, HttpServletResponse resp) lanza ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req.getParameter("code"); if (code == null) ( // Ir a la página de registro resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else ( try ( foursquareApi.authenticateCode(code); // Registro exitoso, cargar datos Resultado
Observe el "lanza ServletException, IOException" en la declaración del método. Esta línea significa que el método puede generar potencialmente una de estas excepciones. Una excepción en Java es un objeto que indica que se ha producido una excepción. Son verificables y no verificables. Las excepciones verificadas deben manejarse rodeando parte del código con un bloque try-catch, o pasarse arriba. Las excepciones no verificadas generalmente no se manejan porque ocurren cuando el programa no puede recuperar su estado. En este método, solo manejamos la excepción FoursquareApiException.
Cuando el servidor web recibe una solicitud de una aplicación, utiliza el descriptor de implementación para hacer coincidir la URL de la solicitud con el código que debe manejar la solicitud. El descriptor de implementación es un archivo XML llamado web.xml. Agreguemos una descripción del servlet de seguimiento.
Ahora las solicitudes a /track serán procesadas por nuestro servlet llamado TrackerServlet. Puede establecer el parámetro Url de devolución de llamada en el valor correcto http://localhost:8080/track.
Para mostrar los resultados, puede utilizar la API de Static Maps, proporcionada amablemente por la misma corporación Google (https://developers.google.com/maps/documentation/staticmaps/). Nuestro servlet generará una página HTML simple y la devolverá en respuesta a una solicitud del usuario.
StringBuilder sb = nuevo StringBuilder("
- "); índice = 1; para (Comprobación de comprobación: result.getResult()) ( sb.append("
Para generar la página se utiliza la clase StringBuilder, esto se debe a que las cadenas en Java son objetos inmutables. Al concatenar cadenas usando el operador +. creado nueva línea en mente. StringBuilder ahorra memoria porque utiliza una matriz de caracteres para almacenar las cadenas que se concatenarán. Enviando una respuesta al usuario:
Byte resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(resultBytes.longitud); resp.getOutputStream().write(resultBytes);
…Y todo está listo. Lanzamos y vemos algo similar a una imagen con un dicho "Resultado del programa".
![](https://i0.wp.com/xakep.ru/wp-content/uploads/2014/07/image3.png)
¿Que sigue?
La aplicación se puede mejorar, como separar la recopilación y visualización de datos. Transfiera la recopilación de datos a un servicio separado que funcionará constantemente y recordará todos los movimientos de los usuarios en la base de datos. Entonces será posible mostrar no puntos individuales, sino una ruta conectada. Con un poco de investigación en la API de Foursquare, puede extraer aún más información sobre la actividad del usuario.
Pero espero haber logrado lo principal: convencerte de que Java es simple y genial. ¡Nos vemos en un mes!
Libros para programador Java
Te aconsejamos que empieces a aprender el idioma con el libro “Java. Java: una guía para principiantes de Herbert Schildt. El siguiente nivel es "Java. Guía completa” de él, y puede obtener más información sobre servlets en Java Servlet and JSP Cookbook de Bruce W. Perry.