Можно ли использовать JSP в качестве шаблона для сервлета?

Я смешиваю 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.

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

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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