studio programacion interfaz grafica ejemplos java jsp tomcat jetty application-server

programacion - jframe en java



Interfaz de usuario web para una aplicaciĆ³n Java (7)

Intento crear una interfaz de usuario web para una aplicación Java. La interfaz de usuario va a ser muy simple, consistirá en una sola página con un formulario para que los usuarios planteen sus consultas, y una página de resultados, algo así como el motor de búsqueda de Google o Ask.com.

Estoy bastante familiarizado con la API base de Java, pero no tengo mucha experiencia en el uso de Java para entornos web (aunque he usado ASP.NET), así que estoy buscando algunos consejos:

  • ¿Qué servidor de aplicaciones web debo usar? Tenga en cuenta que mi interfaz es muy liviana, y solo quiero algo rápido, fácil de iniciar / reiniciar / detener y (re) implementar mi aplicación. Además, necesito que funcione en múltiples entornos , a saber, GNU / Linux, Mac OS X y Windows XP / Vista. Además, estoy usando ant y Eclipse , por lo que sería genial si pudiera agregar fácilmente algunos objetivos ant para la administración del servidor y / o administrar el servidor usando el IDE. He investigado Tomcat y Jetty , y este último parece ser muy ligero y fácil de instalar e implementar. Esto es ideal, porque la GUI es solo para fines de demostración, y probablemente necesite implementarla en diferentes computadoras. Sin embargo, Tomcat ha existido por mucho tiempo, y parece más maduro.

  • En cuanto a las páginas web , las páginas de Java Server parecen una buena opción, ya que parecen lo suficientemente simples para lo que estoy tratando de lograr (procesar un formulario y generar el resultado), pero soy todo oídos para recibir sugerencias.

  • También tengo otro requisito, que me obliga a explicar el flujo de trabajo "básico" de la aplicación: básicamente, tengo un Engine clase que tiene un método de run(String) que procesa la entrada del usuario y devuelve los resultados para su visualización. Esta clase es el núcleo de la aplicación. Ahora, me gustaría crear una instancia de esta clase solo una vez , ya que requiere mucha memoria y lleva mucho tiempo arrancar, por lo que me gustaría crearla cuando se inicie la aplicación / servidor y almacenar esa referencia para todo el lapso de la aplicación (es decir, hasta que detenga el servidor). Luego, para cada solicitud de usuario, simplemente invocaría el método de run de la instancia de Engine y mostraría sus resultados. ¿Cómo se puede lograr esto en Java?

  1. servidor de aplicaciones: tomcat
  2. página web: jsp
  3. Necesita una clase que sea Singleton o clase con método estático. Palabra de advertencia: cuidado con las condiciones de carrera. Es posible que deba utilizar palabras clave sincronizadas para los métodos que implican la operación de actualización / modificación.

  1. Jetty es un contenedor muy liviano y perfecto para su escenario de desarrollo.

  2. Es posible que desee ver Wicket para su lado de representación; parece más cómodo realizar tareas tipo código que optar por una IU directa.

  3. El patrón que está describiendo es el patrón de Singleton. Eche un vistazo a los resultados de google para singleton en java .


La tecnología que necesita aprender es la especificación Sun Java Servlet, ya que eso es lo que implementan TODOS los servidores web no triviales de Java. Esto le permite escribir servlets que pueden hacer todo lo que necesita del lado del servidor. Luego puede desarrollarse contra cualquier contenedor que funcione bien con su iDe y desplegarlo en cualquier otro contenedor que funcione bien en producción.

También necesita aprender HTML básico, ya que de otra manera necesitaría aprender JavaServer Faces o similar, que es un bobo bastante grande para crear el botón de envío que necesita con las otras entradas en un formulario HTML.

Para que su motor funcione, puede crear un servlet con un singleton en web.xml, que luego puede llamar. Esté absolutamente seguro de que es seguro para hilos, de lo contrario tendrá mucho dolor. Para empezar, puede declarar que el servlet invocado está sincronizado para garantizar que, como máximo, una llamada de run () esté activa en cualquier momento.


Suponiendo que no se trata de una aplicación única que no necesita ningún tipo de actualización / mantenimiento en el futuro, le recomiendo que haga la capa de vista con Apache Wicket por las siguientes razones ( primero lea la información corta de la página de inicio). )

  • Dado que Wicket separa la capa de vista y funciona en la capa modelo de MVC de manera limpia, se puede explicar fácilmente que la vista está completamente separada del resto de la aplicación y la interfaz IModel de Wicket se usa para vincular los datos de la capa de controlador a la vista capa de una manera confiable. Por lo tanto, la capa de su controlador puede ser una sola aplicación única, siempre que la use de esa manera.
  • El código de wicket es increíblemente fácil de mantener, también se puede extender fácilmente la funcionalidad de su aplicación web, ya que es un marco de OOP en lugar de un marcado mezclado con otro tipo de marcado que expresa el código.

EDITAR : Hasta ahora, he decidido lo siguiente:

  • Servidor de aplicaciones web: Jetty ;
  • Páginas de servidor Java para las vistas;
  • En base a las sugerencias de @djna, he leído un par de artículos sobre el Modelo 2 , y se me ocurrió esta solución (que todavía no he probado, porque necesito finalizar mi aplicación antes de pasar a la interfaz):

form.jsp

<form action="/servlet/EngineServlet" method="GET"> <input type="text" name="text" /> </form>

EngineServlet.java

public class EngineServlet extends HttpServlet { private Engine engine = new Engine(); // does this make sure engine only gets instantiated one time in the entire lifespan of the web application; from what I''ve read from the servlet lifecycle, it seems like it, but I''d like to hear opinions public void doGet(HttpServletRequest request, HttpServletResponse response) { String text = request.getParameter("text"); ResultBean result = engine.run(text); request.setAttribute("result", result); RequestDispatcher dispatcher = request.getRequestDispatcher("result.jsp"); dispatcher.forward(request, response); // what''s the difference between forward, and request.sendRedirect() ? } }

result.jsp

<div>The result was: ${result.text}</div>

¿Qué piensas de esta solución? ¿Algún problema que puede no ser obvio para alguien proveniente de un entorno J2SE? También escribí algunas dudas que tengo en el código como comentarios. Gracias.


  1. Servidor de aplicaciones. ¿Ves a Tomcat como pesado en términos de tiempo de ejecución, cantidad de aprendizaje o ...? Tiendo a elegir algo que tiene una integración bien establecida con un IDE. Así que Eclipse + Tomcat o Apache Geronimo, tal vez en su versión de WebSphere Community Edition , harían el trabajo. Por lo que he visto, estos son suficientes para lo que quieres, y las curvas de aprendizaje son realmente manejables.
  2. Sí JSPs. Puede que encuentre que sus necesidades de presentación se vuelven un poco más complejas. El esfuerzo adicional de ir a JSF podría dar frutos: artilugios agradables como los recolectores de fechas.
  3. En su procesamiento tendrá un servlet (o una clase de acción si está utilizando JSF) que la clase puede tener una variable miembro de tipo Motor inicializada al inicio y luego utilizada para cada solicitud. Lo que hay que tener en cuenta es que muchos usuarios presionarán ese servlet y, por lo tanto, ese motor al mismo tiempo. ¿Su motor es seguro para usar desde más de un hilo al mismo tiempo?

Para expandir en este punto. Al implementar las JSP, hay dos modelos a los que se hace referencia (con cierta inventiva) como Modelo 1 y Modelo 2. Consulte esta explicación .

En el caso del modelo 1, tiende a poner código directamente en el JSP, está actuando en un rol de controlador. Persoanlly, incluso cuando se trata de aplicaciones pequeñas, desarrolladas rápidamente, no lo hago así. Siempre uso el Modelo 2. Sin embargo, si lo elige, puede poner algo de Java en su JSP.

<% MyWorker theWorker = MyWorkerFactory.getWorker(); // theWorker.work(); %>

Me gustaría tener una fábrica como esta para que pueda controlar la creación del trabajador. La fábrica tendría algo así como (para dar un ejemplo realmente simple)

private static MyWorker s_worker = new MyWorker(); public static synchronized getWorker() { return s_worker; }

Alternativamente, podría crear el trabajador cuando se llame por primera vez ese método.

En el caso del modelo 2, naturalmente tienes un servlet en el que vas a poner un código, por lo que puedes simplemente tener

private MyWorker m_worker = MyWorkerFactory.getWorker();

Esto se inicializará cuando se cargue el servlet. No necesita preocuparse de configurarlo para que se cargue al inicio, solo debe saber que se inicializará antes de que se ejecute la primera solicitud. Mejor aún, use el método init () del servlet. Esto se garantiza para ser llamado antes de que se procesen las solicitudes y es el lugar arquitectónico de la API de servlet para dicho trabajo.

public class EngineServlet extends HttpServlet { private Engine engine; // init is the "official" place for initialisation public void init(ServletConfig config) throws ServletException { super.init(config); engine = new Engine(); }


Esta es una pregunta bastante abierta, y hay una gran cantidad de respuestas posibles según sus requisitos. La forma estándar de escribir aplicaciones web es utilizando la plataforma Java EE, lo que significa JSP, servlets y EJB para la lógica de negocios. Sin embargo, hay bastantes alternativas populares y válidas como Spring, Seam, GWT e incluso alternativas más radicales como JRuby on Rails. Parece que tus necesidades son bastante sencillas, por lo que probablemente prefieras una solución simple como Jetty + Servlets + JSP.

¿Asumo que tu motor puede manejar múltiples solicitudes simultáneas? Si no es así, es posible que desee ver cómo encontrar una forma de hacer cola en las solicitudes, como JMS.