Clase de ayuda JSP para imprimir contenido

Tengo una pregunta sobre la reutilización de código en JSP. Tengo una página JSP example.jsp que emite una llamada a una base de datos y obtiene los resultados. Tengo una clase java HelperClass.java que acepta un registro e imprime los diferentes campos

 response.getWriter().println 

Ahora mi página JSP también tiene HTML y el problema es que el contenido impreso por HelperClass aparece antes que el contenido en la página JSP. P.ej

  This is the first line 
HelperClass.printdata("second line");

salida es

  segunda línea Esta es la primera línea

¿Es esto un problema conocido? ¿Cuál es la mejor manera de diseñar un HelperClass para una página JSP que imprime contenido en la página? Cualquier puntero sería muy apreciado.

Simplemente no use un “HelperClass para imprimir datos”. Esto no tiene sentido. Ahí tienes EL para.

 ${bean.property} 

Eso es todo. Use un servlet para controlar, preprocesar y posprocesar solicitudes. Utilice taglibs (por ejemplo, JSTL) y EL para acceder y mostrar datos de back-end.

Aquí hay un ejemplo básico de inicio de sesión de un Servlet que preprocesa la solicitud antes de mostrarla en JSP:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List persons = personDAO.list(); // Get list of persons from DB. request.setAttribute("persons", persons); // So it's available as `${persons}` in EL. request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response); // Forward to JSP for display. } 

Aquí, la Person es solo una clase Javabean que representa una entidad del mundo real.

 public class Person { private Long id; private String name; private String email; private Integer age; // Add/generate getters and setters here. } 

El PersonDAO#list() simplemente devuelve una List de objetos Person desde el DB:

 public List list() throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List persons = new ArrayList(); try { connection = database.getConnection(); statement = connection.createStatement("SELECT id, name, email, age FROM person"); resultSet = statement.executeQuery(); while (resultSet.next()) { Person person = new Person(); person.setId(resultSet.getLong("id")); person.setName(resultSet.getString("name")); person.setEmail(resultSet.getString("email")); person.setAge(resultSet.getInteger("age")); persons.add(person); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } return persons; } 

Asigne el servlet en web.xml a un url-pattern de /persons . El JSP está oculto en /WEB-INF para que nadie pueda acceder directamente sin solicitar primero el servlet (de lo contrario, se obtendría una tabla vacía).

Ahora, así es como se ve el archivo persons.jsp , utiliza JSTL (simplemente suelte jstl-1.2.jar en /WEB-INF/lib ) c:forEach para iterar sobre una List y usa EL para acceder a los datos de backend y propiedades de bean. El servlet ha puesto el List como atributo de solicitud con persons nombre para que esté disponible por ${persons} en EL. Cada iteración en c:forEach devuelve una instancia Person , de modo que usted pueda mostrar sus proezas con EL.

 < %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ...  
${person.name} ${person.email} ${person.age}

Llámalo por http://example.com/contextname/persons . Eso es todo. No es necesario un “HelperClass para imprimir datos”;) Para obtener más información sobre JSTL, consulte el tutorial de Java EE, parte II, capítulo 7, y para obtener más información sobre EL, consulte el tutorial de Java EE, parte II, capítulo 5 . Para obtener más información acerca de las cosas detrás de PersonDAO, consulte este artículo .