2014-06-21 5 views
1

Я имею форму HTML, которая запрашивает данные пользователя для автобиографии:Не удается получить переменный из Java Servlet

<form action = "processdetails.html" method = "post"> 
    <table> 
     <tr><td style = "font-weight: bold">Personal Details:</td></tr> 
     <tr> 
      <td>Name:</td> 
      <td><input type = "text" name = "applicant"/></td> 
     </tr> 
     <tr> 
      <td>Mobile No.:</td> 
      <td><input type = "text" name = "mobile"/></td> 
     </tr> 
     <tr> 
      <td>E-mail:</td> 
      <td><input type = "text" name = "email"/></td> 
     </tr> 
    </table> 
    <br/> 
    <input style = "width: 150px" type = "submit" value = "Generate CV"/> 
</form> 

После нажатия кнопки «Сформировать CV» кнопку, он идет к сервлету, который отображает введенные данные:

@WebServlet("/processdetails.html") 
public class ProcessDetailsServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    String applicantName = ""; 
    String mobileNo = ""; 
    String emailAdd = ""; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html"); 

     if(request.getParameter("applicant") != null) { 
      applicantName = request.getParameter("applicant"); 
     } 

     if(request.getParameter("mobile") != null) { 
      mobileNo = request.getParameter("mobile");   
     } 

     if(request.getParameter("email") != null) { 
      emailAdd = request.getParameter("email");   
     } 

     PrintWriter out = response.getWriter(); 

     // other necessary html/css here 

     out.print("<form action = 'generatepdf.html' method = 'post'>"); 
     out.print("<table>"); 
     out.print("<tr><td style = 'font-weight: bold'>Personal Details:</td></tr>"); 
     out.print("<tr>"); 
     out.print("<td>Name:</td>"); 
     out.print("<td>" + applicantName + "</td>"); 
     out.print("</tr>"); 
     out.print("<tr>"); 
     out.print("<td>Mobile No.:</td>"); 
     out.print("<td>" + mobileNo + "</td>"); 
     out.print("</tr>"); 
     out.print("<tr>"); 
     out.print("<td>E-mail:</td>"); 
     out.print("<td>" + emailAdd + "</td>"); 
     out.print("</tr>"); 
     out.print("</table>");  
     out.print("<br/>"); 
     out.print("<input style = 'width: 150px' type = 'submit' value = 'Generate PDF'/>"); 
     out.print("</form>"); 

     // other html 

     out.close(); 
    } 
} 

После нажатия на кнопку "Создать PDF", он переходит к другой сервлет:

@WebServlet("/generatepdf.html") 
public class GeneratePdfServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     generatePdf(); 
    } 

    protected void generatePdf() { 
     System.out.println("This is generatePdf()."); 

     ProcessDetailsServlet pds = new ProcessDetailsServlet(); 
     System.out.println("Name: " + pds.applicantName);  
    } 
} 

для проверьте, получает ли generatePdf() данные, я распечатал его на консоли.
Однако applicantName не печатается:

no_name

Почему applicantName не обращались?

+0

вы столкнулись с проблемой синхронизации потоков –

ответ

2
  1. При нажатии на кнопку 'Создать резюме', ваша форма получает представлен ProcessDetailsServlet
  2. ProcessDetailsServlet отображает результат
  3. When вы нажимаете «Сгенерировать PDF», который вы снова отправляете в GeneratePdfServlet.

Ну, в принципе, вы не получите какой-либо из реквизитов пользователя в GeneratePdfServlet, потому что вы не подчиняющегося никакой ценности в GeneratePdfServlet при нажатии на кнопку «Создать PDF».

Данные пользователя не сохраняются для следующего запроса, пока вы не сохраните его в HttpSession или в каком-либо месте.

Ваша альтернатива (если вы не хотите использовать HttpSession), вы можете сгенерировать форму, используя ProcessDetailsServlet, используя недействительные поля ввода вместо таблицы. Поэтому в следующий раз пользователь нажимает «Сгенерировать PDF», вы можете повторно отправить свои данные и получить его в сервлет для создания PDF-файла.

Редактировать: Только поля ввода представлены в форме. Поэтому значения таблицы не достигают сервлета.

+0

Это очень хорошо объясненные моменты, спасибо вам большое. Поскольку мы не обсуждали «HttpSession» (или что-то еще, кроме «doGet()» и «doPost()»), я продолжу предлагаемое обходное решение для неотредактированных форм. Кажется, я понимаю, что вы имеете в виду. Еще раз спасибо! – silver

+0

Их пример не сработает, даже если они отправили данные в свой POST на '/ generatepdf.html'. Это не основная причина. –

+0

@SotiriosDelimanolis Вы имеете в виду, что недопустимые поля ввода не будут работать? – silver

-2

Я думаю, что он бы что-то вроде этого ...

ProcessDetailsServlet pds = new ProcessDetailsServlet(); 
System.out.println("Name: " + pds. + applicantName); 
+0

Это синтаксическая ошибка. – silver

1

Контейнер Servlet создает один экземпляр вашей реализации Servlet, в данном случае один для ProcessDetailsServlet и один для GeneratePdfServlet. Контейнер сервлета использует эти отдельные экземпляры для обработки всех запросов.

Когда клиент отправляет запрос POST на /processdetails.html, контейнер будет найти экземпляр ProcessDetailsServlet и вызывать его doPost(..) метод (на самом деле его метод service(..) но вызывает doPost(..)). Ваш ProcessDetailsServlet имеет поле экземпляра

String applicantName = ""; 

, который вы установили в

applicantName = request.getParameter("applicant"); 

, а затем произвести ответ.Когда клиент отправляет другую форму /generatepdf.html, контейнер сервлетов находит экземпляр GeneratePdfServlet и вызывает его метод doPost(), а затем вы делаете это

ProcessDetailsServlet pds = new ProcessDetailsServlet(); 
System.out.println("Name: " + pds.applicantName);  

Вы создаете полный новый и неродственногоProcessDetailsServlet экземпляр с его собственное поле applicantName, которое инициализируется "". Он абсолютно не связан с другим полем, которое вы установили ранее, это другой объект!

+0

Привет, действительно, вы получаете то, что я пытаюсь сделать, но, как вы правильно сказали, мой код не делает то, что я планировал. Не могли бы вы опубликовать фрагмент того, что должно быть сделано вместо этого? – silver

+0

@ohtph Я не буду публиковать код, но я расскажу, что вы можете сделать. Извлеките эти 3 поля в класс POJO. Создайте экземпляр и установите его поля в 'ProcessDetailsServlet'. Затем сохраните в экземпляре в 'HttpSession'. В вашем «GeneratePdfServlet» извлеките экземпляр из «HttpSession», и у вас будет доступ к его полям. –

+0

Кажется, это действительно потребует «HttpSession», о котором мы еще не говорили, или о сохранении данных от сервлета до сервлета. Спасибо, в любом случае. – silver