Можно ли вызвать сервлет из файла JSP без использования формы HTML?
Например, чтобы показать результаты из базы данных в таблице HTML во время страницы нагрузки.
Вы можете использовать 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-код внутри него, просто позвольте ему выполнить POST для текущего URL-адреса, например
и добавьте
doPost()
тому же сервлету для выполнения задания постобработки. Продолжите приведенные ниже ссылки для получения более конкретных примеров по этому поводу.
Вам нужно будет использовать методы RequestDispatcher вперед/включить в зависимости от ваших требований для достижения того же.
В JSP вам необходимо использовать следующие теги:
Элемент позволяет вам включить статический или динамический файл в файле JSP. Результат в том числе статические и динамические файлы достаточно разный. Если файл статический, его содержимое включено в вызов файла JSP. Если файл динамический, он действует по запросу и отправляет обратно включенный результат на JSP-странице. Когда включить действие завершено, контейнер JSP продолжает обрабатывать остаток JSP-файл.
напр.
<jsp:include page="/HandlerServlet" flush="true">
Элемент пересылает объект запроса, содержащий клиента запрашивать информацию из одного файла JSP в другой файл. Целевой файл может быть файлом HTML, другим файлом JSP или сервлет, пока он находится в тот же контекст приложения, что и пересылка файла JSP. Линии в исходный файл JSP после элемент не обработанный.
напр.
<jsp:forward page="/servlet/ServletCallingJsp" />
Check Advanced JSP Sample: JSP-Servlet Communication:
http://www.oracle.com/technology/sample_code/tech/java/jsps/ojsp/jspservlet.html