Поэтому мой сервлет читает ссылку url из другого сервлета, а затем публикует связанную с ним статью. Все статьи находятся в одном файле.txt с каждой статьей в отдельной отдельной строке. Поэтому я правильно применил первую ссылку URL-адреса, но я не могу заставить вторую работать правильно. Проблема в том, что я использую цикл, подобный while( br.readline() != null)
тогда он отобразит все 3 статьи, а не только статью, на которую я нажал. Когда я не зацикливаю его и просто использую br.readline()
он останавливается в первой строке и не переходит ко второй строке, как мне нужно, если я прошу URL 2 или URL 3. Вот мой код:
s = br.readLine();
out.println("<tr>");
StringTokenizer s2 = new StringTokenizer(s, "|");
if (request.getParameter("article1") != null){
while (s2.hasMoreElements()){
if (index == 0){
out.println("<td class='first'>"+s2.nextElement()+"</td>");
}
else if (index == 1){
out.println("<td>"+s2.nextElement()+"</td>");
}
else if (index == 2){
out.println("<td>"+s2.nextElement()+"</td>");
}
else if (index == 3){
out.println("<td>"+s2.nextElement()+"</td>");
}
index++;
out.println("</tr>");
}
}
else if (request.getParameter("article2") != null){
s = br.readLine();
while (s2.hasMoreElements()){
if (index == 4{
out.println("<td class='first'>"+s2.nextElement()+"</td>");
}
else if (index == 5){
out.println("<td>"+s2.nextElement()+"</td>");
}
else if (index == 6){
out.println("<td>"+s2.nextElement()+"</td>");
}
else if (index == 7){
out.println("<td>"+s2.nextElement()+"</td>");
}
index ++;
out.println("</tr>");
}
Я знаю, что это, вероятно, просто глупая ошибка кодирования, которую я не вижу, потому что я смотрел на нее так долго, но я не могу заставить ее делать то, что я хочу. Также я не показывал код статьи 3, потому что он по сути тот же, и если я могу исправить код статьи 2, то статья 3 будет в основном такой же.
Я настоятельно рекомендую вам выделить "чтение данных" из разделов "вывод HTML" вашего кода.
Похоже, вы должны создать структуру данных для статьи со свойствами для любых разных бит в каждой строке. Вы можете:
List<Article>
Article
(например, путем разделения в соответствии с вашим кодом)Article
в список Теперь у вас есть List<Article>
который вы можете использовать любым способом, который вам нравится, в части вашего кода, которая должна выводить HTML. Вам не нужно беспокоиться о смешении чтения строк и синтаксического анализа с кодом вывода. Это должно сделать все гораздо проще в обращении.
Помимо приведенных выше предложений, я хочу добавить, что если вы используете буферизованный читатель и знаете строку, которую хотите прочитать, вы можете добавить счетчик, чтобы вы могли отслеживать количество строк, на которых вы сейчас находитесь, и выходите из цикла, когда вы закончите. В значительной степени это так:
int wantedLineNr = 4;
String currentLine = null;
int lineCounter = 0;
while ((currentLine = br.readLine()) != null) {
lineCounter ++;
if(lineCounter == wantedLineNr){
// the line is reached so execute the necessary code and exit the loop
break;
}
}
Я не думаю, что это прекрасный способ сделать что-то, но если вы просто хотите это сделать, вызовите br.readLine внутри блоков if, когда вы знаете, сколько строк вы должны отбросить.