Existe un programa (utilizado por cualquier servidor de aplicaciones que esté utilizando) que compila un archivo .jsp en un archivo .java. Por ejemplo, la versión jspc de sun / oracle .
Una vez que tenga el .java que produciría la traducción .jsp (incluso puede considerar usar esto como parte del proceso de compilación, precompilar el jsp para mejorar el rendimiento en el primer hit), luego puede ejecutar pruebas contra él burlándose de la solicitud y verificando que la respuesta es lo que espera.
(editar con ejemplo :)
El método clave para esto es el _jspService(HttpServletRequest, HttpServletResponse)
método.
Un trivial hola mundo jsp:
<html>
<head>
<title>Hello world</title>
</head>
<body>
<h1>Hello world</h1>
Today is: <%= new java.util.Date().toString() %>
</body>
</html>
(test.jsp ubicado dentro de un directorio llamado 'webapp' y también un directorio 'out') Cuando se compila con el comando jspc -v -d out -compile -uriroot webapp/ test.jsp
coloca en un directorio out un archivo llamado test_jsp.java
. Este archivo tiene dentro (junto con un poco de otra configuración):
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("<html>\n\t<head>\n\t\t<title>Hello world</title>\n\t</head>\n\t<body>\n\t
\t<h1>Hello world</h1>\n\t\tToday is: ");
out.print( new java.util.Date().toString() );
out.write("\n\t</body>\n</html>\n\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
En este punto, es una comprobación para asegurarse de que se llama a JspWriter con write o print y que el contenido de la llamada es lo que espera que sea.
Dicho todo esto, en un mundo ideal, uno no debería tener ninguna lógica dentro del jsp; dicha lógica estaría en el controlador o en taglibs que se prueban con otras técnicas.