Estoy usando el siguiente código para imprimir el nombre del usuario en el navegador:
<body>
<form>
<h1>Hello! I'm duke! What's you name?</h1>
<input type="text" name="user"><br><br>
<input type="submit" value="submit">
<input type="reset">
</form>
<%String user=request.getParameter("user"); %>
<%if(user == null || user.length() == 0){
out.print("I see! You don't have a name.. well.. Hello no name");
}
else {%>
<%@ include file="response.jsp" %>
<% } %>
</body>
response.jsp:
<body>
<h1>Hello</h1>
<%= request.getParameter("user") %>
body>
Cada vez que lo ejecuto, aparece el mensaje
Ya veo. No tienes nombre... bueno... Hola no tiene nombre
se muestra a pesar de que no he introducido nada en el cuadro de texto. Sin embargo, si introduzco algo en él, entonces se muestra el código response.jsp, pero no quiero que se muestre el primer mensaje al ejecutarlo. ¿Cómo puedo hacer que eso ocurra? Por favor, sugiera cambios en mi código.
P.D. He leído en algunas preguntas que en vez de comprobar la igualdad con null, hay que comprobar que no sea igual, para que no lance la excepción de puntero nulo. cuando he probado lo mismo, es decir, if(user != null && ..)
, he obtenido NullPointerException
.
Es casi siempre recomendable no utilizar scriptlets en su JSP. Se consideran de mala educación. En su lugar, intente utilizar JSTL (JSP Standard Tag Library) combinado con EL (Expression Language) para ejecutar la lógica condicional que está tratando de hacer. Como beneficio adicional, JSTL también incluye otras características importantes como el bucle.
En lugar de:
<%String user=request.getParameter("user"); %>
<%if(user == null || user.length() == 0){
out.print("I see! You don't have a name.. well.. Hello no name");
}
else {%>
<%@ include file="response.jsp" %>
<% } %>
Utilice:
<c:choose>
<c:when test="${empty user}">
I see! You don't have a name.. well.. Hello no name
</c:when>
<c:otherwise>
<%@ include file="response.jsp" %>
</c:otherwise>
</c:choose>
También, a menos que usted planea en el uso de response.jsp en algún otro lugar en su código, podría ser más fácil de incluir el html en su declaración de lo contrario:
<c:otherwise>
<h1>Hello</h1>
${user}
</c:otherwise>
También hay que tener en cuenta. Para utilizar la etiqueta core, debe importarla de la siguiente manera:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Usted quiere hacer que el usuario reciba un mensaje cuando el usuario envía un nombre de usuario. La forma más fácil de hacer esto es no imprimir un mensaje en absoluto cuando el "usuario" param es null
. Puedes hacer alguna validación para dar un mensaje de error cuando el usuario envíe null
. Este es un enfoque más estándar para su problema. Para lograr esto:
En el scriptlet:
<% String user = request.getParameter("user");
if( user != null && user.length() > 0 ) {
<%@ include file="response.jsp" %>
}
%>
En jstl:
<c:if test="${not empty user}">
<%@ include file="response.jsp" %>
</c:if>
Puede probar este ejemplo:
-- Comienza el fragmento: js hide: false -->
<form>
<h1>Hello! I'm duke! What's you name?</h1>
<input type="text" name="user">
<br>
<br>
<input type="submit" value="submit">
<input type="reset">
</form>
<h1>Hello ${param.user}</h1>
<!-- its Expression Language -->