Вопрос-ответ

Calling a servlet from JSP file on page load

Вызов сервлета из JSP-файла при загрузке страницы

Могу ли я вызвать сервлет из JSP-файла без использования HTML-формы?

Например, для отображения результатов из базы данных в HTML-таблице во время загрузки страницы.

Переведено автоматически
Ответ 1

Вы можете использовать doGet() метод сервлета для предварительной обработки запроса и переадресации запроса в JSP. Затем просто укажите URL сервлета вместо JSP-URL в ссылках и адресной строке браузера.

Например.

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

@EJB
private ProductService productService;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Product> products = productService.list();
request.setAttribute("products", products);
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
}

}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td>${product.description}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>

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

Также обратите внимание, что @WebServlet доступно только начиная с Servlet 3.0 (Tomcat 7 и т.д.), смотрите также аннотацию @WebServlet в Tomcat 7. Если вы не можете выполнить обновление или когда вам по какой-либо причине необходимо использовать web.xml который несовместим с Servlet 3.0, то вам нужно будет вручную зарегистрировать сервлет по старинке в web.xml, как показано ниже, вместо использования аннотации:

<servlet>
<servlet-name>productsServlet</servlet-name>
<servlet-class>com.example.ProductsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>productsServlet</servlet-name>
<url-pattern>/products</url-pattern>
</servlet-mapping>

После правильной регистрации сервлета с помощью аннотации или XML теперь вы можете открыть его с помощью http://localhost:8080/context/products где /context - путь к развернутому контексту веб-приложения, а /products - шаблон URL сервлета. Если у вас случайно есть какой-либо HTML <form> внутри него, то просто отправьте его по текущему URL вот так <form method="post"> и добавьте doPost() в тот же сервлет для выполнения задания постобработки. Перейдите по ссылкам ниже для получения более конкретных примеров по этому вопросу.

Смотрите также

Ответ 2

Для достижения того же результата вам нужно будет использовать методы RequestDispatcher forward / include в зависимости от ваших требований.

В JSP вам необходимо использовать следующие теги:

jsp: включить :


Элемент позволяет включать статический или динамический файл в файл JSP. Результаты включения статических и динамических файлов сильно отличаются. Если файл статический, его содержимое включается в вызывающий файл JSP. Если файл динамический, он выполняет запрос и отправляет обратно результат, который включается в страницу JSP. Когда действие включения завершено, контейнер JSP продолжает обработку оставшейся части файла JSP.


например

<jsp:include page="/HandlerServlet" flush="true">  

jsp: пересылка :


Элемент пересылает объект запроса, содержащий информацию о запросе клиента, из одного файла JSP в другой файл. Целевым файлом может быть HTML-файл, другой JSP-файл или сервлет, при условии, что он находится в том же контексте приложения, что и JSP-файл пересылки. Строки в исходном JSP-файле после элемента не обрабатываются.


например

<jsp:forward page="/servlet/ServletCallingJsp" />

Проверьте расширенный пример JSP: взаимодействие JSP-сервлета:

http://www.oracle.com/technology/sample_code/tech/java/jsps/ojsp/jspservlet.html

Ответ 3

Конечно, вы можете, просто включите его в свой action в form. Но вы должны написать правильный doPost or doGet для обработки запроса!

Ответ 4

Если вы хотите вызвать определенный метод сервлета, вы также используете язык выражений. Например, вы можете сделать что-то вроде:

Сервлет

ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);

JSP

<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>
java jsp servlets