2016-05-23 2 views
1

Я новичок в JSP. Я создал JSP-файл, который запускается на сервере tomcat. Я указал свое местоположение в моей программе. Моя программа отображает все файлы из этого каталога и отображает результаты в таблице и создает кнопку удаления после имени файла. Моя программа выглядит следующим образом (JSP-файл):Как извлечь значение строки с помощью Servlet и JSP?

<form method="post" action='FileDisplayURL' > 
    <h2>Current Collection</h2> 
    <table width="100%" border="1"> 

     <% 
      File folder = new File("C:/Apps/eclipse-jee-mars-2-win32-x86_64/eclipse"); 
      File[] listOfFiles = folder.listFiles(); 
      for (int i = 0; i < listOfFiles.length; i++) { 
     %> 
     <tr > 
      <% 
       if (listOfFiles[i].isFile()) { 
      %> 
      <td><%=listOfFiles[i].getName()%></td> 
      <td><input type="submit" value="delete" name="filename"></td> 
      <% 
       } 
      %> 
     </tr> 
     <% 
      } 
     %> 
    </table> 

</form> 

Это мой сервлет:

@WebServlet("/FileDisplayURL") 
public class FileDisplay extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

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

    response.setContentType("text/html"); 

    String deleteFileName = request.getParameter("filename"); 
    System.out.println("you clicked on " + deleteFileName); 

    } 

} 

Это как моя главная страница выглядит следующим образом:

enter image description here

Я имею проблема при получении имени файла при нажатии пользователем для удаления.

Когда я запускаю мою программу на коте, выход в терминале выглядит следующим образом:

INFO: Server startup in 1076 ms 
you clicked on delete 

«Вы нажали на удалении» не отображает имя файла, который щелкнул. Я очень новичок в сервлете и JSP. Возможно, мне не хватает чего-то очевидного. Любая помощь будет оценена по достоинству.

+1

Первый урок: не используйте скриптлеты; используйте отдельный контроллер и используйте JSP (или другую систему шаблонов, я предпочитаю Thymeleaf) только для рендеринга. – chrylis

ответ

1

Это ошибка HTML, кнопка не может иметь значение (и вы не добавляете значение в любом случае), вы должны создать скрытый вход и поставить имя файла там:

<input type="hidden" value="<%=listOfFiles[i].getName()%>" name="filename"/> 

Edit:

Я не понимал, что у вас есть одна форма, вам нужна отдельная форма для каждой строки, так как сервлет не знает, какое значение ставится, если несколько входов имеют одинаковое имя. Таким образом, ваш взгляд должен иметь:

<h2>Current Collection</h2> 
<table width="100%" border="1"> 

    <% 
     File folder = new File("C:/Apps/eclipse-jee-mars-2-win32-x86_64/eclipse"); 
     File[] listOfFiles = folder.listFiles(); 
     for (int i = 0; i < listOfFiles.length; i++) { 
    %> 
    <tr > 
     <% 
      if (listOfFiles[i].isFile()) { 
     %> 
     <td><%=listOfFiles[i].getName()%></td> 
     <td> 
      <form method="post" action='FileDisplayURL' > 
       <input type="submit" value="delete"> 
       <input type="hidden" value="<%=listOfFiles[i].getName()%>" name="filename"/> 
      </form> 
     </td> 
     <% 
      } 
     %> 
    </tr> 
    <% 
     } 
    %> 
</table> 

Edit 2:

Просто чтобы прояснить свою ошибку: При нажатии на кнопку отправки, браузер подготавливает запрос, добавив к телу список ключ-значение со всеми параметрами внутри активированной формы, если вы используете одну форму с несколькими полями с тем же именем, сервер не может угадать, правильное значение:

Body: 
filename=a 
filename=b 
filename=c 
filename=d 

Какое значение следует выбрать? Итак, вам нужна форма с одним значением для имени (или, возможно, скобки для списков)

+0

Спасибо, что ответили. Я могу получить имя файла. Но когда я нажимаю кнопку «Удалить», он отображает только имя файла, который я нажал первым. Когда я нажимаю на другой файл, он не отображает имя этого файла. Он отображает только первое имя файла, которое я нажал. Проверьте мой вывод на консоль: http://i.stack.imgur.com/yAV1z.png – Rose

+1

Вы проверили код после моего последнего редактирования? с одной формой для каждой строки? этот код должен работать – rekiem87

+0

Большое спасибо. Сейчас он работает :) – Rose

Смежные вопросы