Вызов сервлета из файла 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.

например

<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

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

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

Servlet

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

JSP

<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>
Другие вопросы по тегам