Obrigar o usuário a selecionar um option[RESOLVIDO]

6 respostas
E

Boa noite gente. Eu desenvolvi um .jsp que contém uma tag select que permite que o usuário selecione vários valores dentre os options disponíveis. Sendo assim, gostaria de obrigar o usuário a selecionar um option (eu só consigo obrigar o usuário a inserir valores nos campos). Tentei usar o atributo length de array sem êxito. Alguém poderia me ajudar a fazer com que o usuário seja obrigado a escolher um option ? obrigado.

<form action="AddToEmailList" method="POST">
    <table cellspacing="5" border="0">
        <tr>
            <td align="right">First name:</td>
            <td><input type="text" name="firstName" value ="<%= user.getFirstName()%>"></td>
        </tr>
        <tr>
            <td align="right">Last name:</td>
            <td><input type="text" name="lastName" value = "<%= user.getLastName()%>"></td>
        </tr>
        <tr>
            <td align="right">Email address:</td>
            <td><input type="text" name="emailAddress" value = "<%= user.getEmailAddress()%>"></td>
        </tr>
        <tr>
            <td align="right">I'm interested in these types of music:</td>
            <td>
              <select name = "musics" multiple = "multiple">
                <option value = "Rock">Rock</option>
                <option value = "Country">Country</option>
                <option value = "Bluegrass">Bluegrass</option>
                <option value = "Folk">Folk</option>            
             </select>
            </td>
        </tr>
        <tr>
            <td></td>
            <td><br><input type="submit" value="Submit"></td>
            <!--  onclick = validate(this.form) -->
        </tr>
    </table>

No servlet, eu escrevi:

String firstName  = request.getParameter("firstName");
       String lastName = request.getParameter("lastName");
       String emailAddress = request.getParameter("emailAddress");
       String[] selectedMusics = request.getParameterValues("musics");
       
       ServletContext context = getServletContext();
       String path = context.getRealPath("/WEB-INF/emailList.txt");
       
       String message = "";
       String url = "";

if(firstName.length() == 0 ||
    	  lastName.length() == 0 ||	
    	  emailAddress.length() == 0 ||
    	  selectedMusics.length == 0)
       {
    	 message = "Please fill all three text boxes and choose your favorites music genres";
    	 url = "/join_email_list.jsp";
       }
       else {
    	 url = "/display_music_choices.jsp";   
       }

mas parece que a instrução selectedMusics.length == 0 está sendo ignorada. Consequentemente, acabo recebendo uma NullPointerException quando o dispatcher envia
o request e o response ao .jsp de exibição dos dados. :?

6 Respostas

C

coloca os id’s assim…

<option id="Rock" value="Rock">Rock</option>
                <option id="Country" value="Country"/>Country</option>
                <option id="Bluegrass" value="Bluegrass"/>Bluegrass</option>
                <option id="Folk" value="Folk"/>Folk</option>

Att,

E

Fiz o que você disse mas continuo com NullPointerException. Eu estou obtendo os parâmetros dos inputs através de String[] musics = getParameterValues(“musics”);

B

Ola Edu,

Não sei se entendi bem sua pergunta, mas vale uma observação o request.getParameterValues("") retorna null se não encontrar no seu caso nenhum item selecionado.

Ou seu NullPointer ocorre mesmo que algum item de “musics” tenha sido selecionado ??

[]'s

E

bgomes:
Ola Edu,

Não sei se entendi bem sua pergunta, mas vale uma observação o request.getParameterValues("") retorna null se não encontrar no seu caso nenhum item selecionado.

Ou seu NullPointer ocorre mesmo que algum item de “musics” tenha sido selecionado ??

[]'s

eu preencho os três campos, deixo de selecionar uma opção e recebo NullPointerException ao passar um dispatcher para o view de exibição dos dados (outro .jsp). inserirei o código completo e um comentário no bloco de verificação do servlet:

o .jsp de entrada dos dados

<%@page import="business.User" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>
    <!-- <script type = "text/javascript" src = "validateform.js"></script> -->
    <title>Murach's Java Servlets and JSP</title>
</head>

<body>
    <% 
       User user = (User) request.getAttribute("user");
       String message = (String) request.getAttribute("message");
    
       // handle null values
       
       if(user == null)
        user = new User();
       if(message == null)
    	message = "";   
    %>
    
    
    <h1>Join our email list</h1>
    <p>To join our email list, enter your name and
     email address below. <br>
     Then, click on the Submit button.</p>

    <p><i><%= message %></i></p>
    
    <form action="AddToEmailList" method="POST">
    <table cellspacing="5" border="0">
        <tr>
            <td align="right">First name:</td>
            <td><input type="text" name="firstName" value ="<%= user.getFirstName()%>"></td>
        </tr>
        <tr>
            <td align="right">Last name:</td>
            <td><input type="text" name="lastName" value = "<%= user.getLastName()%>"></td>
        </tr>
        <tr>
            <td align="right">Email address:</td>
            <td><input type="text" name="emailAddress" value = "<%= user.getEmailAddress()%>"></td>
        </tr>
        <tr>
            <td align="right">I'm interested in these types of music:</td>
            <td>
              <select name = "musics" multiple = "multiple">
                <option value = "Rock">Rock</option>
                <option value = "Country">Country</option>
                <option value = "Bluegrass">Bluegrass</option>
                <option value = "Folk">Folk</option>            
             </select>
            </td>
        </tr>
        <tr>
            <td></td>
            <td><br><input type="submit" value="Submit"></td>
            <!--  onclick = validate(this.form) -->
        </tr>
    </table>
   </form>
 </body>
</html>

O servlet que responderá ao pedido:

package devweb;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import business.*;
import data.*;
/**
 * Servlet implementation class AddToEmailListServlet
 */
public class AddToEmailListServlet extends HttpServlet {
    /**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String firstName  = request.getParameter("firstName");
       String lastName = request.getParameter("lastName");
       String emailAddress = request.getParameter("emailAddress");
       String[] selectedMusics = request.getParameterValues("musics");
       
       ServletContext context = getServletContext();
       String path = context.getRealPath("/WEB-INF/emailList.txt");
       
       String message = "";
       String url = ""; 
       
       // validating the parameters
       
       /* o problema se encontra aqui:
      não consigo fazer com que o usuário
     tenha que selecionar um option do select
    do .jsp acima mesmo verificando com a instrução 
    selectedMusics.length == 0
    se alguma opção foi selecionada
    */

       if(firstName.length() == 0 ||
    	  lastName.length() == 0 ||	
    	  emailAddress.length() == 0 ||
    	  selectedMusics.length == 0)
       {
    	 message = "Please fill all three text boxes and choose your favorites music genres";
    	 url = "/join_email_list.jsp";
       }
       else {
    	 url = "/display_music_choices.jsp";   
       }
    	   
       User user = new User(firstName, lastName, emailAddress, selectedMusics);
       UserIO.addRecord(user, path);
       
	   request.setAttribute("user", user);
	   request.setAttribute("message", message);
	   
	   // forward request and response to the view
	   
	   RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
	   dispatcher.forward(request, response);
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doPost(request, response);  		
	}
}

o .jsp de exibição dos resultados

<!-- import packages and classes needed by the scripts -->
    <%@ page import="business.*, data.*, java.util.Date" %>
    <%@ include file="includes/header.html" %>
    <% 
       // get attributes from the request
       User user = (User) request.getAttribute("user"); 
    %>
    
    <h1>Thanks for joining our email list, 
        <%= user.getFirstName() %> <%= user.getLastName() %>
    </h1>

    <p>Here is the information that you entered:</p>

    <table cellspacing="5" cellpadding="5" border="1">
        <tr>
            <td align="right">First name:</td>
            <td><%= user.getFirstName() %></td>
        </tr>
        <tr>
            <td align="right">Last name:</td>
            <td><%= user.getLastName() %></td>
        </tr>
        <tr>
            <td align="right">Email address:</td>
            <td><%= user.getEmailAddress() %></td>
        </tr>
    </table>
      <p>We'll use email to notify you whenever we have new releases for
         these types of music: </p>
      <% 
        String[] musicPreferences = user.getSelectedMusics();
        for(int i = 0; i < musicPreferences.length; i++)      
        {
      %>
         <%= musicPreferences[i]%><br />  	
        
       <%}%>
    <p>To enter another email address, click on the Back <br>
    button in your browser or the Return button shown <br>
    below.</p>

    <form action="join_email_list.jsp" method="get">
        <input type="submit" value="Return">
    </form>

    <p>This email address was added to our list on <%= new Date() %></p>

</body>
</html>
C

Se você não selecionar nenhum seu array de String( String[] selectedMusics) vai ser null mesmo.
E ao acessar o selectedMusics.length ele vai entar acessar um objeto nulo…
tenta tratar assim:

if(firstName.length() == 0 ||  
				lastName.length() == 0 ||   
				emailAddress.length() == 0 ||  
				selectedMusics==null ||
				selectedMusics.length == 0)  
		{  
			message = "Please fill all three text boxes and choose your favorites music genres";  
			url = "/join_email_list.jsp";  
		}  
		else {  
			url = "/display_music_choices.jsp";     
		}
E

caputojf1:
Se você não selecionar nenhum seu array de String( String[] selectedMusics) vai ser null mesmo.
E ao acessar o selectedMusics.length ele vai entar acessar um objeto nulo…

Eu apenas tentei escrever selectedMusics == null e deu certo. Na verdade, eu acreditei cegamente que o valor de selectedMusics.length tinha que ser zero e não pensei em outra alternativa. Agora fiquei curioso para saber qual é o valor de length ao não se selecionar um option. Obrigado pela ajuda.

Criado 9 de maio de 2011
Ultima resposta 10 de mai. de 2011
Respostas 6
Participantes 3