Вызов сервлета из файла 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 доступно только с Сервлет 3.0 (Tomcat 7 и т. д.), см. также аннотацию@WebServlet с Tomcat 7. Если вы не можете обновить, или когда вам по какой-то причине нужно использовать web.xml который не совместим с сервлетом 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> внутри него, а затем просто дайте ему опубликовать текущий URL-адрес так <form method="post"> и добавить doPost() к тому же сервлету для выполнения задания постобработки. Продолжайте ссылки ниже для более конкретных примеров по этому вопросу.

см. также


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

в 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-Servlet связь:

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


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


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

сервлет

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

JSP

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