исключение java.lang.NumberFormatException: нулевая ошибка при отправке

#java #html #jsp #servlets

Вопрос:

Я создаю веб-страницу, на которой начинается список вакцин. Когда я нажимаю на ссылку, чтобы отредактировать конкретную запись вакцины в списке, это веб-страница, на которую попадают пользователи. Параметр id из этой записи передается на эту страницу. Нажатие на кнопку сохранить вызывает допост. когда я пытаюсь передать параметр id из doGet в новый объект vaccineEntry, значение id становится равным нулю.

Вот код сервлета для списка вакцин:

 package vaccineList.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import NewVaccine.servlet.NewVaccine;
import NewDose.servlet.NewDose;

//import cs3220.model.GuestBookEntry;
//import cs3220.utilities.*;

@WebServlet(urlPatterns = "/ListVaccine", loadOnStartup = 1)
public class ListVaccine extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public ListVaccine()
    {
        super();
    }

    public void init( ServletConfig config ) throws ServletException
    {
        super.init( config );

        List<VaccineEntry> entries = new ArrayList<VaccineEntry>();
        entries.add( new VaccineEntry( "Pfizer/BioNTech", "2", "21", "10000", "10000" ) );
        entries.add( new VaccineEntry( "Johnsonamp;Johnson", "1", "0", "5000", "5000"  ) );

        getServletContext().setAttribute( ServletFunctions.VaccineEntries, entries );
    }

    @SuppressWarnings("unchecked")
    protected void doGet( HttpServletRequest request,
        HttpServletResponse response ) throws ServletException, IOException
    {
        StringBuilder html = new StringBuilder();
        List<VaccineEntry> entries = ServletFunctions.getVaccineEntriesFromServletContext(getServletContext());

        response.setContentType( "text/html" );
        PrintWriter out = response.getWriter();

        html.append( "<p>List Vaccine</p>" );
        
        html.append( "<p><a href='NewVaccine'>New Vaccine</a> |" );
        html.append( "<a href='NewDose'> New Dose</a></p>" );
        
        html.append("<table border='1'>");
        
        html.append("<tr>");
        html.append( "<td>   "   " <b>Vaccine</b>   </td>" );
        html.append( "<td>"   " <b>Doses Required</b></td>" );
        html.append( "<td>"   " <b>Days Between Doses</b></td>" );
        html.append( "<td>"   " <b>Total Doses Recieved</b></td>" );
        html.append( "<td>"   " <b>Total Doses Left</b></td>" );
        html.append("<td></td>" );
        html.append( "</tr>" );
        
        for( VaccineEntry entry : entries )
        {
            
            html.append("<tr>");
            html.append( "<td>"   entry.getName()   "</td>" );
            html.append( "<td>"   entry.getDosesReq()   "</td>" );
            if(entry.getDaysBtwnDoses() == "0") {
                html.append( "<td></td>" );
            }
            else
                html.append( "<td>"   entry.getDaysBtwnDoses()   "</td>" );
            
            
            html.append( "<td>"   entry.getTotalDosesRecieved()   "</td>" );
            html.append( "<td>"   entry.getTotalDosesLeft()   "</td>" );
            
            
            html.append( "<td><a href='editVaccine?id="   entry.getId()   "'>Edit</a></td>"  );
            
            
            html.append( "</td>" );
            html.append( "</tr>" );
        }
        html.append( "</table>" );
        
        
        
        out.println( ServletFunctions.titleWithBody("ListVaccine", html.toString()) );
    }

}
 

и вот код для страницы editVaccine:

 package EditVaccine.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import vaccineList.servlet.*;


@WebServlet("/editVaccine")
public class editVaccine extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    
    public editVaccine() {
        super();
        
    }
    
    @SuppressWarnings("unchecked")
    private VaccineEntry getEntry( int id )
    {
        List<VaccineEntry> entries = (List<VaccineEntry>) getServletContext()
            .getAttribute( "entries" );
        System.out.println("entry taken is "   id);
        
        
        for( VaccineEntry entry : entries )
            if( entry.getId() == id ) return entry;
        return null;
    }

    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        StringBuilder html = new StringBuilder();
        
        String id = request.getParameter( "id" );
        VaccineEntry entry = getEntry(Integer.parseInt(id));
        System.out.println("The value of id is "   id);
        
        
        System.out.println("The value of getEntry is "   entry.getId());

        response.setContentType( "text/html" );
        PrintWriter out = response.getWriter();
        
        html.append("<form action='editVaccine' method='post'>" );
        html.append("<table border='1' cellpadding='2'>");
        html.append("<tr>"   "<th colspan='2'>Name</th>");
        html.append("<td><input type='text' name='name' value="   entry.getName()   "></input></td>"   "</tr>");
        html.append("<tr><th colspan='2'>Doses Required</th>"   "<td><select name='DosesReq' value='"   entry.getDosesReq()   "'>"); // id='Doses Required'
        html.append("<option value='1' name='dosage' value='"   entry.getDosesReq()   "'>1</option>");
        html.append("<option value='2' name='dosage' value='"   entry.getDosesReq()   "'>2</option>");
        html.append("<option value='3' name='dosage' value='"   entry.getDosesReq()   "'>3</option>");
        html.append("</select></td>");
        html.append("<tr><th colspan='2'>Days Between Doses</th><td><input type='text' name= 'DaysBtwnDoses' value='"   entry.getDaysBtwnDoses()   "'> </input></td></tr>");
        html.append("<td colspan = '2'><button>Save</button></td>");
        html.append("</form>");
        html.append("</table>");
        
        
        out.println( ServletFunctions.titleWithBody("ListVaccine", html.toString()) );
        
       
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("In post method");
        
        VaccineEntry entry = getEntry(Integer.parseInt(request.getParameter("id")));
        
        entry.setName(request.getParameter("name"));
        String name = entry.getName();
        System.out.println("name is "   name);
        entry.setDosesReq(request.getParameter("dosage"));
        String dosage = entry.getDosesReq();
        System.out.println("dosage is "   dosage);
        entry.setDaysBtwnDoses(request.getParameter("DaysBtwnDoses"));
        String DaysBtwnDoses = entry.getDaysBtwnDoses();
        System.out.println("DaysBtwnDoses is "   DaysBtwnDoses);
        
        response.sendRedirect("ListVaccine");
        return;
        
    }

}
 

Комментарии:

1. Извините, это мой первый опубликованный вопрос о переполнении стека. Я не знаю, как это исправить.

2. Хорошо, спасибо тебе!

Ответ №1:

Вы должны передать id параметр в своем запросе. В этом случае вы можете добавить его в качестве hidden элемента формы, т. е.:

 html.append("<input type='hidden' value='"   id   "' name='id' id='id' />")
 

Комментарии:

1. Большое вам спасибо! Хотя теперь я вижу, что у меня также возникла проблема с передачей значения требуемых доз в списке значений параметров методу доПост на странице editVaccine. Как я могу это сделать?

2. Атрибуты select имени элемента и идентификатора должны иметь то же имя, что и имя параметра, на которое вы ссылаетесь request.getParameter (в вашем случае это дозировка ).