Можно ли использовать JSP в качестве шаблона для сервлета? - PullRequest
11 голосов
/ 13 ноября 2009

Я смешивал JSP и сервлеты в веб-приложении, которое я создаю, и начинаю обнаруживать, что мои более сложные JSP содержат много кода, что бросает вызов всем урокам MVC, которые были загнаны в меня. Я знаю, что могу сделать это, просто перенаправив на 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/ Кажется, что архитектура JSP Model 2 - это именно то, что я хочу реализовать, но я не могу найти пример того, как можно это настроить. По техническим причинам я не могу использовать одну из более продвинутых шаблонных сред, таких как Struts.

Это возможно или безнадежно?

Ответы [ 3 ]

9 голосов
/ 13 ноября 2009

Поместите объект (ы) в запрос, перенаправьте запрос на страницу 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, где он может быть доступен только через директиву forward.

Тогда на вашем JSP вы можете иметь,

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

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

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

5 голосов
/ 13 ноября 2009

Поместите объекты 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 (и нет, это не хак).

4 голосов
/ 13 ноября 2009

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

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

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

...