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

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

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

Ответ 1

Вы можете использовать метод doGet() сервлета для запроса preprocess и перенаправить запрос на 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 доступен только с сервлета 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 является webapp развернутый контекстный путь и /products - шаблон URL сервлета. Если у вас в нем есть какой-либо HTML <form>, просто поставьте POST в текущий URL-адрес, например, <form method="post"> и добавьте doPost() тому же сервлету для выполнения задания постобработки. Продолжите приведенные ниже ссылки для более конкретных примеров.

См. также

Ответ 2

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

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

jsp: include:

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

например.

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

jsp: forward:

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

например.

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

Проверьте расширенный JSP-образец: JSP-Servlet Communication:

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

Ответ 3

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

Ответ 4

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

Servlet

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

JSP

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