Как вставить функциональность JSP в сервлеты? - PullRequest
1 голос
/ 30 марта 2010

Как я могу использовать сервлеты для доступа к использованию HTML в JSP без необходимости иметь все мои страницы, обращенные к клиенту, с именем * .jsp?
Я бы предпочел сделать это, чем использовать весь материал response.write (), потому что я думаю, что его легче читать и поддерживать, когда все это чистый «HTML».
Это справедливая оценка?

РЕДАКТИРОВАТЬ: я хочу, чтобы сервлеты выводили данные на экран без необходимости перенаправления в файл .jsp.
Таким образом, я мог бы написать весь материал JSP, но когда придет время его отобразить, страница, которую URL-адрес пользователя видит по сути, "http://blah.com/posts/post-id", который является адресом сервлета, а не" http://blah.com/posts.jsp?pos=post-id".
Но я все равно написал бы всю логику представления во внешнем .jsp.

Ответы [ 5 ]

2 голосов
/ 31 марта 2010

Просто спрячьте JSP в папке /WEB-INF, чтобы никто не мог получить к ней прямой доступ, и создайте сервлет, который перенаправляет запрос в этот файл JSP. Не делайте перенаправление , иначе вы увидите новый URL, отображаемый в адресной строке. Э.Г.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String postId = request.getPathInfo();
    // Do your business thing here. Any results can be placed in request scope. E.g.
    request.setAttribute("post", post); // post is a bean containing information you'd like to display in JSP.
    // Then forward request to JSP file.
    request.getRequestDispatcher("/WEB-INF/posts.jsp").forward(request, response);
}

Отобразите этот сервлет на url-pattern из /posts/*.

В /WEB-INF/posts.jsp используйте taglibs для управления потоком страниц и EL для доступа к данным. Э.Г.

<h2>${post.title}</h2>
<p><fmt:formatDate value="${post.date}" type="date" /> - ${post.message}</p>

Наконец, просто вызовите сервлет по http://example.com/posts/postid. Партия /postid будет доступна по номеру HttpServletRequest#getPathInfo(). Вам нужно проанализировать ценность самостоятельно и заняться бизнесом.

0 голосов
/ 31 марта 2010

Я думаю, что вы ищете Pattern Front Controller - это основа веб-приложений "JSP Model 2" (как упомянул @andri) и в значительной степени все (сотни?) Java веб-фреймворки.

0 голосов
/ 30 марта 2010

В древние времена (подумайте '98 ...) это называлось «Архитектура модели 2»: сервлет получил запрос, обработал его и передал запрос на страницу JSP, которая обрабатывает представление.

См. в этой статье , где приведен пример того, как это делается, или просто выполните поиск "JSP Model 2".

Редактировать: для этого вы можете использовать RequestDispatcher.include() вместо forward(), как описано в предыдущей статье. Остальное все еще должно быть применимо.

0 голосов
/ 31 марта 2010

Если я правильно понимаю, вы хотите скрыть расширение * .jsp от пользователя, верно?

В том случае, если ваш сервлет перенаправляет на страницу jsp, сделайте это:

RequestDispatcher disp = request.getRequestDispatcher("hidden.jsp");
disp.forward(request,response);   

Используя Request Dispatcher вместо перенаправления, вы «скрываете» расширение .jsp за именем сервлета. Однако, если ваша страница JSP перенаправляет на другую страницу JSP, это не сработает. Если вы хотите, чтобы файл .jsp был видимым, используйте response.encodeURL или response.sendRedirect

0 голосов
/ 30 марта 2010

Я не совсем уверен, что вы спрашиваете здесь. Вы можете заставить сервлеты писать HTML, но это совсем не так.

Альтернатива - заставить ваши сервлеты создавать HTML с помощью шаблонизатора, например Velocity или Freemarker . Синтаксис в шаблонах может быть более чистым для вашего конкретного приложения, но менее полнофункциональным.

...