2009-11-13 4 views
11

Я смешивал JSP и сервлеты в веб-приложении, которое я создаю, и я начинаю обнаруживать, что мои более сложные JSP в конечном итоге содержат много кода, который летит перед всеми уроками MVC, которые имеют был стук в меня. Я знаю, что могу сделать это, просто отправив JSP, но это похоже на глупый взломать.Можно ли использовать JSP в качестве шаблона для сервлета?

Что я хотел бы сделать, это использовать сервлет для обработки, а затем отправить набор значений в JSP для визуализации HTML и возврата ответа. Что-то вдоль линий:

public class MyServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException { 

     // ... Do some processing 

     resp.getWriter.print(renderJSP("mypage.jsp", values)); 

    } 

} 

Я ковыряться документации Sun и нашел это: http://java.sun.com/developer/technicalArticles/javaserverpages/servlets_jsp/ Похоже, 2 архитектуры JSP Model это именно то, что я хочу реализовать, но я не могу найти пример как это можно установить. По техническим причинам я не могу использовать одну из более продвинутых шаблонных фреймворков, таких как Struts.

Возможно ли это или потерянная причина?

+2

«По техническим причинам я не могу использовать одну из более продвинутых шаблонных фреймворков, таких как Struts». - Итак, вы собираетесь в основном переустановить его только для своего приложения ... – Nate

+0

Я знаю, что это наивное утверждение, но это действительно не похоже, что я изобретаю всю структуру. Я просто ищу способ связать две существующие технологии вместе в том, что, на мой взгляд, является очень очевидным прецедентом. –

ответ

9

Поместите объект (ы) в запрос, отправьте запрос на страницу jsp, а затем используйте объект (ы) в jsp для отображения ответа.

В сервлет,

MyObject obj = ... //build somehow 
request.setAttribute("myObject", obj); 
RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/jsp/my.jsp"); 
rd.forward(request, response); 

Если результат JSP не должны быть доступны непосредственно из URL, вы должны скрыть его в директории WEB-INF, где она может быть доступна только через прямой директивы.

Затем на вашем JSP вы можете иметь,

<% MyObject obj = (MyObject) request.getAttribute("myObject"); %> 

Чтобы получить объект и использовать его по мере необходимости.

Как было предложено, в конечном итоге было бы неплохо научиться использовать JSTL и, возможно, MVC-фреймворк, например Spring MVC. Учебник можно найти here.

+0

Выполняет ли rd.forward отправку 302 клиенту или обрабатывает все это на стороне сервера? Я могу просто сбить с толку мою терминологию. –

+0

@Sean Lynch - Передовой каталог является серверной. Вот почему вы можете получить доступ к страницам JSP в каталоге WEB-INF, используя его. –

4

Вы описываете пересылку JSP как взлома, но на самом деле это именно то, что делают структуры MVC (как минимум, Spring MVC и Struts).

«Модель» - это атрибуты запроса, которые заполняет сервлет; то JSP просто извлекает их для показа. Вы можете обернуть это в «ModelAndView», например Spring MVC, но это действительно так.

Вы можете получить более сложные на JSP, конечно, параметры запроса синтаксического анализа, атрибуты сеанса или атрибуты контекста сервлета («глобальные»). Я обнаружил, что в общем, чище позволить фронт-контроллеру/сервлету маршировать все это в атрибуты запроса и заставить страницу просто вытащить из них. Если вы используете JSTL, разница между запросом и сеансом может быть еще более размытой.

+0

Абсолютно верно. Я сделал около 4 приличных веб-приложений с весной, и это определенно не хак, сервлет (или весной, контроллер) устанавливает все данные для представления, а JSP содержит ТОЛЬКО логику для отображения данных, предоставленных это контроллером. Он отлично работает и очень прост в обслуживании, вы определенно хотите пойти по этому маршруту, а не рубить. – Zoidberg

5

Помещенный объекты Java в Request/Response/Session и использовать javax.servlet.RequestDispatcher в сервлет, что-то вроде этого:

RequestDispatcher dispatcher = request.getRequestDispatcher("/test.jsp"); 
dispatcher.forward(request,response); 

Переднее является стороне сервера и целевой сервлет/JSP получает то же самое объекты запроса/ответа в качестве исходного сервлета/JSP. Поэтому вы можете передавать данные между ними, используя request.setAttribute().

Другой варианта заключается в использовании response.sendRedirect(String location) который на стороне клиента (этот метод посылает временный ответ перенаправления для клиента), так что URL-адрес получает новый запрос от клиента, и единственным способом передачи данных является через сеанс или с веб-параметрами (url? name = value).

Это в основном то, что делают рамки MVC (и нет, это не взлом).

+0

Действительно ли dispatcher.forward() отправляет 302 клиенту или обрабатывает ли он всю серверную сторону? Я думаю, что я могу перегрузить мою терминологию HTML. –

+0

@Sean, все серверная сторона. –

+0

Я обновил свой ответ, чтобы обойти оба случая (на стороне сервера и на стороне клиента) –

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