Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Вызов сервлета из JSP


Автор: Kotakota 14.12.2010, 20:43
Привет.
Начинаю изучать JAVA EE.
Такой вопрос.

Пишу гостевую книгу. Поделил ее на 2 составные части:

1. Форма добавления сообщения.
Ну тут все вроде понятно. Делаю так:
Код

<form action='<%= response.encodeURL("addMessage") %>' method="POST">
Имя: <input type="name" size=50> <BR>
E-Mail: <input type="mail" size=50> <BR>
Сообщение: <textarea name=”mess”> </textarea><BR> 
<input type="submit" value="Добавить!"> 
</form> 

Обычная форма, которая потом вызывает сервлет, который добавляет сообщение в БД.

2. Вывод оставленных сообщений.
Вот тут застрял  smile 
Как я думаю это должен быть еще один сервлет, который будет выводить сообщения из бд. (например будет передовать массив записей в JSP).
Вопрос как к нему подключиться, чтобы он передал массив сообщений.
Тег <FORM> тут уже не используешь.
 smile 

В дополнение прилагаю графическое описание моих мыслей.
http://s2.ipicture.ru/Gallery/Viewfull/2602742.html




Автор: dobrolub 14.12.2010, 21:29
Ответ на такой вопрос может быть достаточно объёмным, но кратенько так:

Сервлет вызывается либо напрямую, либо с помощью <jsp:include page="/messages"/>. Обычно сервлет достаёт данные из базы и кладёт их в request. Пример:

Код

public class ListMessagesServlet extends GenericServlet {
  public void service(ServletRequest request, ServletResponse response)
    throws IOException, ServletException {
     //достать сообщения из базы
     //положить их в рequest
     //псевдо код
     request.setAttribute("messages", new ArrayList<Message>(messages));
  }
}


в jsp, можно использовать jstl (псевдо код)
Код

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c: forEach items="{messages}" var="message">
  <tr><td><%=message.getText()%></td></tr>
</c:forEach>


Автор: Kotakota 14.12.2010, 21:38
Цитата(dobrolub @ 14.12.2010,  21:29)
Сервлет вызывается либо напрямую, либо с помощью <jsp:include page="/messages"/>. Обычно сервлет достаёт данные из базы и кладёт их в request. 

Можно пример вызова напрямую?
А <jsp:useBean> не подойдет?
Слышал, что JavaBean компоненты не могут реализовывать логику и выступать в роли контроллера.

Автор: dobrolub 14.12.2010, 22:19
Прямой вызов сервлета - из браузера, по url замапленному к этому сервлету. 

К вопросу о jsp:useBean:  да,  конечно можно.

Вы посмотрите ещё на различные tutorials по веб приложениям.

Автор: Skipy 15.12.2010, 11:05
Kotakota, если говорить о том, как делать правильно, то JSP вообще не должен содержать никакой бизнес-логики - только средства отображения. Вся бизнес-логика должна быть в сервлете. Он получает ВСЕ запросы, разбирает их, определяет необходимые действия, выполняет их, и потом делает forward на нужный JSP. При этом в request уже положены все данные для формирования страницы. Так что не сервлет должен вызываться из JSP, а наоборот.

Автор: Kotakota 15.12.2010, 14:09
Цитата(Skipy @ 15.12.2010,  11:05)
Kotakota, если говорить о том, как делать правильно, то JSP вообще не должен содержать никакой бизнес-логики - только средства отображения. Вся бизнес-логика должна быть в сервлете. Он получает ВСЕ запросы, разбирает их, определяет необходимые действия, выполняет их, и потом делает forward на нужный JSP. При этом в request уже положены все данные для формирования страницы. Так что не сервлет должен вызываться из JSP, а наоборот.

Уважаемый Skipy.
Но ведь при загрузке страницы, первоначально вызывается *.jsp.
Или нужно вызывать сервлет контроллер, прописанный, например в web.xml?
А он в свою очередь будет вызывать необходимое представление в *.jsp странице?

Еще такой вопрос.
Например, вызвал сервлет, который подключил файл *.jsp формы ввода сообщения и *.jsp вывода всех сообщений.
Добавляю новое сообщение...
Вызывается сервлет который добавляет сообщение.
А потом из сервлета добавления сообщения вызываем....
Какой сервлет вызвать, чтобы снова показать гостевую книгу?
А если еще и постраничная разбивка будет....
Я запутался какой сервлет когда вызывать и в связях между ними.....
 smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)