Вызов сервлета из файла JSP при загрузке страницы
Можно ли вызвать сервлет из файла JSP без использования формы HTML?
Например, чтобы показать результаты из базы данных в таблице HTML во время загрузки страницы.
4 ответа
Вы можете использовать doGet()
метод сервлета для предварительной обработки запроса и его перенаправления в JSP. Затем просто укажите URL-адрес сервлета вместо URL-адреса JSP в ссылках и адресной строке браузера.
Например
@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>
внутри, затем просто дайте ему POST к текущему URL, как это <form method="post">
и добавить doPost()
к тому же сервлету для выполнения постобработки. Продолжите ссылки ниже для более конкретных примеров по этому вопросу.
Смотрите также
Вам нужно будет использовать методы RequestDispatcher forward/include в зависимости от ваших требований для достижения того же.
В JSP вам нужно использовать следующие теги:
Элемент позволяет включать статический или динамический файл в файл JSP. Результаты включения статических и динамических файлов весьма различны. Если файл статический, его содержимое включается в вызывающий файл JSP. Если файл динамический, он действует по запросу и отправляет обратно результат, который включен в страницу JSP. Когда действие включения завершено, контейнер JSP продолжает обработку оставшейся части файла JSP.
например
<jsp:include page="/HandlerServlet" flush="true">
Элемент перенаправляет объект запроса, содержащий информацию запроса клиента, из одного файла 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
Конечно, вы можете просто включить его в свой action
в form
, Но вы должны написать правильный doPost
или же doGet
обработать запрос!
Если вы хотите вызвать конкретный метод сервлета, тогда вы также используете язык выражений. Например, вы можете сделать что-то вроде:
Servlet
ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);
JSP
<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>