Soy nuevo en Java EE y sé que algo así como las siguientes tres líneas
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
es una forma de codificación de la vieja escuela y en JSP versión 2 existe un método para evitar el código Java en los archivos JSP. ¿Puede alguien decirme las líneas alternativas de JSP 2 y cómo se llama esta técnica?
Respuestas:
El uso de scriptlets (esas
<% %>
cosas) en JSP está realmente desalentado desde el nacimiento de taglibs (como JSTL ) y EL ( Expression Language , esas${}
cosas) en 2001.Las principales desventajas de los scriptlets son:
SunOracle también recomienda en las convenciones de codificación JSP para evitar el uso de scriptlets siempre que las clases (tag) puedan hacer la misma funcionalidad. Aquí hay varias citas de relevancia:Cómo reemplazar los scriptlets depende completamente del único propósito del código / lógica. Más que a menudo, este código se debe colocar en una clase Java digna de confianza:
Si desea invocar el mismo código Java en cada solicitud, menos o más independientemente de la página solicitada, por ejemplo, verificando si un usuario ha iniciado sesión, luego implemente un filtro y escriba el código en consecuencia en el
doFilter()
método. P.ej:Cuando se asigna en un sitio apropiado que
<url-pattern>
cubre las páginas JSP de interés, entonces no necesita copiar y pegar el mismo fragmento de código en las páginas JSP generales.Si desea invocar algún código Java para preprocesar una solicitud, por ejemplo, precargar una lista de una base de datos para mostrarla en alguna tabla, si es necesario en función de algunos parámetros de consulta, luego implemente un servlet y escriba el código correspondiente en el
doGet()
método. P.ej:De esta forma, lidiar con las excepciones es más fácil. No se accede a la base de datos en medio de la representación JSP, pero mucho antes de que se muestre la JSP. Todavía tiene la posibilidad de cambiar la respuesta cada vez que el acceso a la base de datos arroja una excepción. En el ejemplo anterior, la página predeterminada de error 500 se mostrará que de todos modos se puede personalizar por una
<error-page>
enweb.xml
.Si desea invocar algún código Java para procesar posteriormente una solicitud, por ejemplo, procesar un envío de formulario, implemente un servlet y escriba el código correspondiente en el
doPost()
método. P.ej:De esta manera tratar con diferentes destinos página de resultados es más fácil: volver a mostrar el formulario con los errores de validación en caso de un error (en este ejemplo particular se puede volver a mostrarlo usando
${message}
en EL ), o simplemente tomar a la página de destino deseado en caso de éxito.Si desea invocar algún código Java para controlar el plan de ejecución y / o el destino de la solicitud y la respuesta, implemente un servlet de acuerdo con el Patrón del controlador frontal del MVC . P.ej:
O simplemente adopte un marco MVC como JSF , Spring MVC , Wicket , etc. para que termine con solo una página JSP / Facelets y una clase JavaBean sin la necesidad de un servlet personalizado.
Si desea invocar algún código Java para controlar el flujo dentro de una página JSP, debe tomar un taglib de control de flujo (existente) como el núcleo JSTL . Por ejemplo, mostrar
List<Product>
en una tabla:Con etiquetas de estilo XML que se ajustan bien a todo ese HTML, el código es mejor legible (y por lo tanto mejor mantenible) que un montón de scriptlets con varias llaves de apertura y cierre ( "¿A dónde diablos pertenece esta llave de cierre?" ). Una ayuda fácil es configurar su aplicación web para que arroje una excepción siempre que se sigan utilizando scriptlets agregando la siguiente pieza a
web.xml
:En Facelets , el sucesor de JSP, que forma parte del marco MVC JSF proporcionado por Java EE , ya no es posible utilizar scriptlets . De esta manera, se te obliga automáticamente a hacer las cosas "de la manera correcta".
Si desea invocar algún código Java para acceder y mostrar datos de "back-end" dentro de una página JSP, debe usar EL (lenguaje de expresión), esas
${}
cosas. Por ejemplo, volver a mostrar los valores de entrada enviados:La
${param.foo}
muestra el resultado derequest.getParameter("foo")
.Si desea invocar algún código Java de utilidad directamente en la página JSP (generalmente
public static
métodos), debe definirlos como funciones EL. Hay un taglib de funciones estándar en JSTL, pero también puede crear fácilmente funciones usted mismo . Aquí hay un ejemplo de cómo JSTLfn:escapeXml
es útil para prevenir ataques XSS .Tenga en cuenta que la sensibilidad XSS no está relacionada de ninguna manera específicamente con Java / JSP / JSTL / EL / lo que sea, este problema debe tenerse en cuenta en cada aplicación web que desarrolle. El problema de los scriptlets es que no proporciona ninguna forma de prevención integrada, al menos no utilizando la API Java estándar. El sucesor de JSP, Facelets, ya tiene un escape de HTML implícito, por lo que no debe preocuparse por los agujeros XSS en Facelets.
Ver también:
fuente
<% response.getWriter().flush(); %>
entre</head>
y<body>
para mejorar el rendimiento del análisis de páginas web en el navegador web. Pero este uso es completamente insignificante cuando el tamaño del búfer de salida en el lado del servidor es bajo (1 ~ 2 KB). Ver también este artículo .Como salvaguarda: deshabilite los scriptlets para siempre
Como otra pregunta está discutiendo, puede y siempre debe deshabilitar los scriptlets en su
web.xml
descriptor de aplicación web.Siempre haría eso para evitar que cualquier desarrollador agregue scriptlets, especialmente en compañías más grandes donde perderá la visión general tarde o temprano. La
web.xml
configuración se ve así:fuente
<%-- comment that i don't want in the final HTML --%>
. Me resulta útil utilizar estos comentarios en lugar de los comentarios HTML.<% %>
, las expresiones<%! %>
scriptlet y las declaraciones scriptlet<%= %>
. Eso significa que las directivas<%@ %>
y comentarios<%-- --%>
permanecen habilitados y utilizables, por lo que aún puede hacer comentarios e incluirlos.JSTL ofrece etiquetas para condicionales, bucles, conjuntos, gets, etc. Por ejemplo:
JSTL funciona con atributos de solicitud: un Servlet los establece a menudo en la solicitud, que se reenvía al JSP.
fuente
No estoy seguro si lo entiendo correctamente.
Deberías leer algo sobre MVC. Spring MVC & Struts 2 son las dos soluciones más comunes.
fuente
Puede usar etiquetas JSTL junto con expresiones EL para evitar mezclar código Java y HTML:
fuente
También hay marcos basados en componentes como Wicket que generan mucho HTML para usted. Las etiquetas que terminan en el HTML son extremadamente básicas y prácticamente no hay lógica que se mezcle. El resultado son páginas HTML casi vacías con elementos HTML típicos. La desventaja es que hay muchos componentes en la API de Wicket para aprender y algunas cosas pueden ser difíciles de lograr con esas limitaciones.
fuente
En el patrón arquitectónico MVC, los JSP representan la capa Vista. Incrustar código Java en JSP se considera una mala práctica. Puede usar JSTL , freeMarker , velocidad con JSP como "motor de plantillas". El proveedor de datos para esas etiquetas depende de los marcos con los que está tratando.
Struts 2
ywebwork
como implementación para MVC Pattern utiliza OGNL "una técnica muy interesante para exponer Beans Properties a JSP".fuente
La experiencia ha demostrado que los JSP tienen algunas deficiencias, una de las cuales es difícil evitar mezclar el marcado con el código real.
Si puede, considere usar una tecnología especializada para lo que necesita hacer. En Java EE 6 hay JSF 2.0, que proporciona muchas características interesantes, como pegar beans Java junto con páginas JSF a través del
#{bean.method(argument)}
enfoque.fuente
Si simplemente desea evitar los inconvenientes de la codificación Java en JSP, puede hacerlo incluso con scriplets. Simplemente siga alguna disciplina para tener Java mínimo en JSP y casi ningún cálculo y lógica en la página JSP.
fuente
Aprenda a personalizar y escribir sus propias etiquetas con JSTL
Tenga en cuenta que EL es EviL (excepciones de tiempo de ejecución, refactorización)
Wicket también puede ser malo (rendimiento, difícil para aplicaciones pequeñas o nivel de vista simple)
Ejemplo de java2s ,
Esto debe agregarse a la aplicación web web.xml
crear archivo: java2s.tld en / WEB-INF /
compile el siguiente código en WEB-INF \ classes \ com \ java2s
Inicie el servidor y cargue bodyContent.jsp en el navegador
fuente
Wicket también es una alternativa que separa completamente Java de HTML, por lo que un diseñador y un programador pueden trabajar juntos y en diferentes conjuntos de código con poca comprensión el uno del otro.
Mira Wicket.
fuente
Hiciste una buena pregunta y aunque obtuviste buenas respuestas, te sugiero que te deshagas de JSP. Es una tecnología obsoleta que eventualmente morirá. Use un enfoque moderno, como los motores de plantillas. Tendrá una separación muy clara de las capas empresariales y de presentación, y ciertamente no habrá código Java en las plantillas, por lo que puede generar plantillas directamente desde el software de edición de presentaciones web, en la mayoría de los casos aprovechando WYSIWYG.
Y, ciertamente, manténgase alejado de los filtros y el procesamiento previo y posterior, de lo contrario, puede enfrentar dificultades de soporte / depuración ya que siempre no sabe de dónde obtiene el valor la variable.
fuente
Para evitar el código Java en archivos JSP, Java ahora proporciona bibliotecas de etiquetas como JSTL. Java también ha creado JSF en el que puede escribir todas las estructuras de programación en forma de etiquetas.
fuente
No importa cuánto trate de evitar, cuando trabaje con otros desarrolladores, algunos de ellos seguirán prefiriendo scriptlet y luego insertarán el código malvado en el proyecto. Por lo tanto, configurar el proyecto en el primer signo es muy importante si realmente desea reducir el código de scriptlet. Hay varias técnicas para superar esto (incluidos varios marcos que otros mencionaron). Sin embargo, si prefiere la forma JSP pura, utilice el archivo de etiqueta JSTL. Lo bueno de esto es que también puede configurar páginas maestras para su proyecto, por lo que las otras páginas pueden heredar las páginas maestras
Cree una página maestra llamada base.tag debajo de sus WEB-INF / tags con el siguiente contenido
En esta página mater, creé un fragmento llamado "título", para que en la página secundaria, pudiera insertar más códigos en este lugar de la página maestra. Además, la etiqueta
<jsp:doBody/>
será reemplazada por el contenido de la página secundariaCree una página secundaria (child.jsp) en su carpeta WebContent:
<t:base>
se usa para especificar la página maestra que desea usar (que es base.tag en este momento). Todo el contenido dentro de la etiqueta<jsp:body>
aquí reemplazará el<jsp:doBody/>
de su página maestra. Su página secundaria también puede incluir cualquier etiqueta lib y puede usarla normalmente como la otra mencionada. Sin embargo, si usa algún código de scriptlet aquí (<%= request.getParameter("name") %>
...) e intenta ejecutar esta página, obtendrá unJasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. Por lo tanto, no hay forma de que otras personas puedan incluir el código maligno en el archivo jspLlamando a esta página desde su controlador:
Puede llamar fácilmente al archivo child.jsp desde su controlador. Esto también funciona bien con el marco de struts
fuente
Úselo
JSTL Tag libraries
en JSP, que funcionará perfecto.fuente
Simplemente use la etiqueta JSTL y la expresión EL.
fuente
Si alguien está realmente en contra de la programación en más lenguajes que uno , sugiero GWT, teóricamente puede evitar todos los elementos JS y HTML, porque Google Toolkit transforma todo el cliente y el código compartido a JS, por lo que no tendrá problemas con ellos. tiene un servicio web sin codificación en ningún otro idioma. Incluso puede usar algunos CSS predeterminados desde algún lugar, ya que lo proporcionan las extensiones (smartGWT o Vaadin). No necesitas aprender docenas de anotaciones.
Por supuesto, si lo desea, puede hackear las profundidades del código e inyectar JS y enriquecer su página HTML, pero realmente puede evitarlo si lo desea, y el resultado será bueno, ya que se escribió en cualquier otro marco. Digo que vale la pena intentarlo, y el GWT básico está bien documentado.
Y, por supuesto, muchos programadores compañeros describieron o recomendaron varias otras soluciones. GWT es para personas que realmente no quieren lidiar con el elemento web o minimizarlo.
fuente
Una buena idea del mundo de Python son los lenguajes de atributos de plantilla ; TAL fue introducido por Zope (por lo tanto, también conocido como "Zope Page Templates", ZPT) y es un estándar, con implementaciones en PHP, XSLT y Java también (he usado las encarnaciones de Python / Zope y PHP). En esta clase de lenguajes de plantillas, un ejemplo anterior podría verse así:
El código se ve como HTML ordinario (o XHTML) más algunos atributos especiales en un espacio de nombres XML; se puede ver con un navegador y un diseñador puede ajustarlo de forma segura. Hay soporte para macros y también para i18n:
Si las traducciones del contenido están disponibles, se utilizan.
Sin embargo, no sé mucho sobre la implementación de Java .
fuente
ui:xxx
etiquetas de Java EE 6 en Facelts VDL .tal:replace="structure (expression)"
atributos todo el tiempo.Usar scriptlets en JSP no es una buena práctica.
En cambio, puedes usar:
Por favor refiérase a:
fuente
Claro, sustitúyalo
<%! counter++; %>
por una arquitectura de productor-consumidor de eventos, donde se notifique a la capa empresarial sobre la necesidad de incrementar el contador, reaccione en consecuencia y notifique a los presentadores para que actualicen las vistas. Hay varias transacciones de bases de datos involucradas, ya que en el futuro necesitaremos conocer el valor nuevo y antiguo del contador, quién lo ha incrementado y con qué propósito en mente. Obviamente, la serialización está involucrada, ya que las capas están completamente desacopladas. Podrá incrementar su contador sobre RMI, IIOP, SOAP. Pero solo se requiere HTML, que no se implementa, ya que es un caso tan mundano. Su nuevo objetivo es alcanzar 250 incrementos por segundo en su nuevo y brillante servidor E7 de 64 GB de RAM.Tengo más de 20 años en programación, la mayoría de los proyectos fallan antes del sexteto: Reusabilidad Reemplazabilidad OO-capacidad Debuggability Testability La mantenibilidad es incluso necesaria. Otros proyectos, dirigidos por personas que solo se preocupaban por la funcionalidad, fueron extremadamente exitosos. Además, la estructura rígida del objeto, implementada demasiado temprano en el proyecto, hace que el código no pueda adaptarse a los cambios drásticos en las especificaciones (también conocido como ágil).
Por lo tanto, considero como dilación la actividad de definir "capas" o estructuras de datos redundantes, ya sea al principio del proyecto o cuando no se requiera específicamente.
fuente
Técnicamente, los JSP se convierten a Servlets durante el tiempo de ejecución . JSP se creó inicialmente con el propósito de desacoplar la lógica empresarial y la lógica de diseño, siguiendo el patrón MVC. Entonces, JSP son técnicamente todos los códigos de Java durante el tiempo de ejecución. Pero para responder a la pregunta, las bibliotecas de etiquetas generalmente se usan para aplicar lógica (eliminar códigos Java) a páginas JSP.
fuente
Si usamos los siguientes elementos en una aplicación web de Java, el código de Java puede eliminarse del primer plano del JSP.
Use la arquitectura MVC para la aplicación web
Usar etiquetas JSP
a. Etiquetas estándar
si. Etiquetas personalizadas
Lenguaje de expresión
fuente
¿Cómo evitar el código Java en archivos JSP?
Puede usar etiquetas de biblioteca de pestañas como JSTL además de Expression Language ( EL ). Pero EL no funciona bien con JSP. Por lo tanto, probablemente sea mejor soltar JSP por completo y usar Facelets .
Facelets es el primer lenguaje de declaración de página que no es JSP diseñado para JSF (Java Server Faces) que proporcionó un modelo de programación más simple y potente para los desarrolladores de JSF en comparación con JSP. Resuelve diferentes problemas que ocurren en JSP para el desarrollo de aplicaciones web.
Fuente
fuente
Usar Scriptlets es una forma muy antigua y no se recomienda. Si desea generar directamente algo en sus páginas JSP, simplemente use Expression Language (EL) junto con JSTL .
También hay otras opciones, como usar un motor de plantillas como Velocity, Freemarker, Thymeleaf, etc. Pero usar JSP simple con EL y JSTL cumple mi propósito la mayor parte del tiempo y también parece el más simple para un principiante.
Además, tenga en cuenta que no es una práctica recomendada hacer lógica empresarial en la capa de vista, debe realizar sus lógicas comerciales en la capa de Servicio y pasar el resultado de salida a sus vistas a través de un Controlador.
fuente
Ya no se usa nada de eso, amigo mío, mi consejo es desacoplar la vista (css, html, javascript, etc.) del servidor.
En mi caso, hago que mis sistemas manejen la vista con Angular y los datos necesarios se traen del servidor utilizando los servicios de descanso.
Créeme, esto cambiará la forma en que diseñas
fuente
Use el backbone, angular como el marco de javascript para el diseño de la interfaz de usuario y obtenga los datos utilizando la API de resto. Esto eliminará la dependencia de Java de la interfaz de usuario por completo.
fuente
JSP 2.0 tiene una característica llamada "Archivos de etiquetas" , puede escribir etiquetas sin
java
código externo ytld
. Necesita crear un.tag
archivo y ponerlo,WEB-INF\tags
incluso puede crear una estructura de directorio para empaquetar sus etiquetas.Por ejemplo:
Úselo como
Además, puede leer el cuerpo de la etiqueta fácilmente
Úsalo
Las muestras son muy simples, pero puedes hacer muchas tareas complicadas aquí. Por favor, considere que puede utilizar otras etiquetas (por ejemplo:
JSTL
que se controlan las etiquetas comoif/forEcah/chosen
la manipulación de texto comoformat/contains/uppercase
, o incluso etiquetas de SQLselect/update
), pasar todos los parámetros tipo, por ejemploHashmap
, el accesosession
,request
... en el archivo de etiqueta también.Los archivos de etiquetas son tan fáciles de desarrollar que no fue necesario reiniciar el servidor al cambiarlos, como los archivos JSP. Esto los hace fáciles de desarrollar.
Incluso si usa un marco como Struts 2, que tiene muchas etiquetas buenas, puede encontrar que tener sus propias etiquetas puede reducir mucho su código. Puede pasar sus parámetros de etiqueta a puntales y de esta manera personalizar su etiqueta de marco.
Puede usar la etiqueta no solo para evitar Java, sino también para minimizar sus códigos HTML. Yo mismo trato de revisar los códigos HTML y construir muchas etiquetas apenas veo duplicados de códigos en mis páginas.
(Incluso si termina usando Java en su código JSP, lo cual espero que no, puede encapsular ese código en una etiqueta)
fuente
Como dicen muchas respuestas, use JSTL o cree sus propias etiquetas personalizadas. Aquí hay una buena explicación sobre la creación de etiquetas personalizadas
fuente
fuente
Al usar etiquetas JSTL junto con la expresión EL, puede evitar esto. Ponga lo siguiente en su página jsp:
fuente