Вызов сервлета из файла 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:include page="/HandlerServlet" flush="true">
элемент вперед объект запроса, содержащий клиента запросить информацию из одного файла 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>