Можно ли использовать 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, разница между запросом и сеансом может быть еще более размытой.